NumPy和数据表示的视觉介绍

NumPy和数据表示的视觉介绍

img

NumPy的包是数据分析,机器学习,并在蟒生态系统科学计算的主力。它极大地简化了向量和矩阵的操作和处理。python的一些主要软件包依赖于NumPy作为其基础架构的基础部分(例如scikit-learn,SciPy,pandas和tensorflow)。除了对数字数据进行切片和切块的能力之外,在使用这些库中的高级用例进行处理和调试时,掌握numpy将为您提供优势。

在这篇文章中,我们将介绍一些使用NumPy的主要方法,以及在我们为机器学习模型提供服务之前它如何表示不同类型的数据(表格,图像,文本等)。

1
import numpy as np

创建数组

我们可以通过将python列表传递给它并使用np.array() 来创建一个NumPy数组(也就是强大的ndarray)。在这种情况下,python创建了我们在右边可以看到的数组:

img

通常情况下,我们希望NumPy为我们初始化数组的值。NumPy为这些情况提供了诸如ones(),zeros()和random.random()之类的方法。我们只是传递它们要生成的元素数量:

img

一旦我们创建了数组,我们就可以开始以有趣的方式操作它们。

数组算术

让我们创建两个NumPy数组来展示它们的用处。我们会打电话给他们data,并ones

img

在位置上添加它们(即添加每行的值)就像键入一样简单data + ones

img

当我开始学习这些工具时,我发现这样的抽象让我不必在循环中编写这样的计算。这是一个很棒的抽象,可以让你在更高层次上思考问题。

这不仅是我们可以这样做的补充:

img

通常情况下,我们希望在数组和单个数字之间执行操作(我们也可以将其称为向量和标量之间的操作)。比如说,我们的数组表示以英里为单位的距离,我们希望将其转换为公里数。我们简单地说data * 1.6

img

看看NumPy如何理解这种操作意味着每个细胞都会发生相乘?这个概念叫做广播,它非常有用。

索引

我们可以通过切片python列表的所有方式对NumPy数组进行索引和切片:

img

聚合

NumPy为我们提供的其他好处是聚合功能:

img

此外minmaxsum,你得到所有的伟人像mean,以获得平均,prod得到所有的元素相乘,结果std得到的标准偏差,和其他很多的

在更多方面

我们所看到的所有例子都在一个维度上处理向量。NumPy之美的一个关键部分是它能够将我们目前所看到的所有内容应用到任意数量的维度。

创建矩阵

我们可以传递以下形状的python列表列表,让NumPy创建一个矩阵来表示它们:

1
np.array([[1,2],[3,4]])

img

我们也可以使用上面提到的相同方法(ones()zeros()random.random()),只要我们给它们一个元组来描述我们正在创建的矩阵的维度:

img

矩阵算术

+-*/如果两个矩阵的大小相同,我们可以使用算术运算符()来添加和乘以矩阵。NumPy将这些作为位置操作处理:

img

只有当不同维度为1时(例如矩阵只有一列或一行),我们才能在不同大小的矩阵上进行这些算术运算,在这种情况下,NumPy将其广播规则用于该操作:

img

点产品

与算术相关的一个关键区别是使用点积的矩阵乘法。NumPy为每个矩阵提供了一种dot()方法,可用于与其他矩阵进行点积运算:

img

我在这个图的底部添加了矩阵尺寸,以强调两个矩阵在它们彼此面对的一侧必须具有相同的尺寸。您可以将此操作可视化为如下所示:

img

矩阵索引

当我们操作矩阵时,索引和切片操作变得更加有用:

img

矩阵聚合

我们可以像聚合向量一样聚合矩阵:

img

我们不仅可以聚合矩阵中的所有值,还可以使用以下axis参数在行或列之间进行聚合:

img

转置和重塑

处理矩阵时的一个共同需求是需要旋转矩阵。当我们需要采用两个矩阵的点积并需要对齐它们共享的维度时,通常就是这种情况。NumPy数组有一个方便的属性,T用于获取矩阵的转置:

img

在更高级的用例中,您可能会发现自己需要切换某个矩阵的维度。在机器学习应用程序中通常就是这种情况,其中某个模型期望输入的某个形状与您的数据集不同。NumPy的reshape()方法在这些情况下很有用。您只需将矩阵所需的新尺寸传递给它即可。您可以为维度传递-1,NumPy可以根据您的矩阵推断出正确的维度:

img

更多维度

NumPy可以完成我们在任何维度上提到的所有内容。其中心数据结构称为ndarray(N维数组),原因很简单。

img

在很多方面,处理新维度只是在NumPy函数的参数中添加逗号:

img

实际用法

现在为了收益。以下是NumPy将帮助您完成的有用事项的一些示例。

公式

实现适用于矩阵和向量的数学公式是考虑NumPy的关键用例。这就是为什么NumPy是科学蟒蛇社区的宠儿。例如,考虑平均误差公式,它是监督机器学习模型处理回归问题的核心:

img

在NumPy中实现这一点是轻而易举的:

img

这样做的好处是,numpy的不关心,如果predictionslabels含有一个或一千值(只要他们都是相同的大小)。我们可以通过一个示例逐步执行该代码行中的四个操作:

img

预测和标签向量都包含三个值。这意味着n的值为3。在我们执行减法后,我们最终得到如下值:

img

然后我们可以对矢量中的值进行平方:

img

现在我们总结这些值:

img

这导致该预测的误差值和模型质量的分数。

数据表示

想想你需要紧缩和构建模型所需的所有数据类型(电子表格,图像,音频……等)。其中很多都非常适合在n维数组中表示:

表格和电子表格

  • 电子表格或值表是二维矩阵。电子表格中的每个工作表都可以是自己的变量。python中最受欢迎的抽象是pandas数据帧,它实际上使用NumPy并在其上构建。

img

音频和时间序列

  • 音频文件是一维样本数组。每个样本都是一个代表音频信号的一小部分的数字。CD质量的音频每秒可能有44,100个样本,每个样本是-65535到65536之间的整数。这意味着如果你有一个10秒的CD质量的WAVE文件,你可以将它加载到长度为10 * 44,100的NumPy数组中= 441,000个样本。想要提取音频的第一秒?只需将文件加载到我们将调用的NumPy数组中audio,然后获取audio[:44100]

以下是一段音频文件:

img

时间序列数据也是如此(例如,股票价格随时间变化)。

图片

  • 图像是尺寸(高度×宽度)的像素矩阵。
    • 如果图像是黑白(也称为灰度),则每个像素可以由单个数字表示(通常在0(黑色)和255(白色)之间)。想要裁剪图像的左上角10 x 10像素部分?告诉NumPy要你image[:10,:10]

这是一个图像文件的片段:

img

  • 如果图像是彩色的,则每个像素由三个数字表示 - 红色,绿色和蓝色各自的值。在这种情况下,我们需要第三维(因为每个单元格只能包含一个数字)。因此彩色图像由尺寸的ndarray表示:(高x宽x 3)。

    img

语言

如果我们处理文本,故事就会有所不同。文本的数字表示需要一个构建词汇表的步骤(模型知道的所有唯一单词的清单)和嵌入步骤。让我们看看用古代精神用数字表示这个(翻译的)引用的步骤:

“让我之前的吟游诗人留下任何主题吗?”

模型需要先查看大量文本才能在数字上代表这位战士诗人的焦虑话语。我们可以继续处理一个小数据集并使用它来构建一个词汇表(71,290个单词):

img

然后可以将句子分成一系列标记(基于通用规则的单词或单词部分):

img

然后我们用词汇表中的id替换每个单词:

img

这些ID仍然不能为模型提供太多信息价值。因此,在将一系列单词提供给模型之前,需要使用嵌入来替换标记/单词(在这种情况下,50维word2vec嵌入):

img

您可以看到此NumPy数组的维度为[embedding_dimension x sequence_length]。在实践中,这些将是另一种方式,但我以这种方式呈现它的视觉一致性。出于性能原因,深度学习模型倾向于保留批量大小的第一维(因为如果并行训练多个示例,则可以更快地训练模型)。这是一个reshape()非常有用的明显案例。例如,像BERT这样的模型会期望其输入形状为:[batch_size,sequence_length,embedding_size]。

img

现在这是一个数字卷,模型可以处理并执行有用的操作。我将其他行留空了,但是他们会填充其他示例以供模型训练(或预测)。

(事实证明,在我们的例子中,诗人的话语比其他引起他焦虑的诗人的言论更具永生性。出生于父亲所拥有的奴隶,安塔拉的英勇和语言能力使他获得了自由和神话般的地位。诗作为前伊斯兰阿拉伯半岛中悬挂七首诗之一。

写于2019年6月26日

原文来源:https://jalammar.github.io/visual-numpy/

来了,老弟
-------------    本文结束  感谢您的阅读    -------------
0%