矩阵与矩阵乘积简介

向量是存储和操作数据的一种有用的方法,可以用箭头或数字数组来表示它们。然而,创建更复杂的数据结构是有帮助的,这正是需要引入矩阵的地方。

介绍

矩阵是正方形或矩形数组,包含两个维度:行和列,我们可以把它看作是一个电子表格。通常会在数学上下文中看到术语矩阵,在Numpy上下文中看到二维数组。

维度

在矩阵的上下文中,术语维度不同于向量表示的维数(空间维数)。当我们说矩阵是二维数组时,意味着数组中有两个方向:行和列。

矩阵表示如下:

矩阵A有两行两列,如果矩阵有m行和n列,并且包含实值,可以用以下符号来刻画它:A∈ℝ(m×n)。

我们可以使用不带粗体的矩阵名称引用矩阵中的元素,但是后面需要跟着行索引和列索引。例如,$ A_{2, 1}$表示第一行和第二列中的元素。

按照惯例,第一个索引用于行,第二个索引用于列。例如,上面提到的例子位于矩阵A的第二行和第一列,因此它被表示为$A_{2, 1}$。

矩阵分量可以写如下:

图1:矩阵是二维数组,行数通常用m表示,列数用n表示。

数组的形状给出了每个维度中元素的数量,如图1所示。由于此矩阵是二维的(行和列),因此需要两个值来描述形状(按此顺序排列的行数和列数)。

我们先用这个方法np.array()创建一个2维numpy数组。

A = np.array([[2.1, 7.9, 8.4], [3.0, 4.5, 2.3], [12.2, 6.6, 8.9], [1.8, 1., 8.2]])

注意,我们使用数组中的数组([[]])来创建二维数组。这与创建一维数组的不同之处在于所使用的方括号数。

与向量一样,可以访问Numpy数组的shape属性:

A.shape

可以看到该形状包含两个数字:它们分别对应于行数和列数。

要获得矩阵元素,需要两个索引:一个引用行索引,一个引用列索引。

使用Numpy,索引过程与向量的索引过程相同,只需要指定两个索引。我们再来看下面的矩阵A:

A = np.array([[2.1, 7.9, 8.4], [3.0, 4.5, 2.3], [12.2, 6.6, 8.9], [1.8, 1.3, 8.2]])

可以使用以下语法获取特定元素:

A[1, 2]

[1,2]返回行索引为1、列索引为2(以零为基础的索引)的元素。

要获得完整的列,可以使用冒号:

A[:, 0]
array([ 2.1, 3. , 12.2, 1.8])

这将返回第一列(索引0),因为冒号表示我们需要从第一行到最后一行的元素。同样,要获取特定行,可以执行以下操作:

A[1, :]
array([3. , 4.5, 2.3])

能够操纵包含数据的矩阵是数据科学家的一项基本技能。检查数据的形状对于确保数据的组织方式非常重要。了解使用Sklearn或Tensorflow等库所需的数据形状也很重要。

对于Numpy,如果数组是向量(1D Numpy数组),则shape是单个数字:

v = np.array([1, 2, 3])v.shape

如果是矩阵,则形状有两个数字(行和列中的值的数目)。例如:

A = np.array([[2.1, 7.9, 8.4]])A.shape

形状的第一个数字是1。使用两个方括号[[和]],可以创建一个二维数组(矩阵)。

矩阵乘积

接下来我们将在数据科学基础数学中学习乘积。矩阵的等价运算称为矩阵乘积或矩阵乘法,它接受两个矩阵并返回另一个矩阵。这是线性代数中的一个核心运算。

矩阵乘积的更简单的情况是介于矩阵和向量之间(可以将其视为矩阵乘积,其中一个向量只有一列)。

上图说明了矩阵和向量之间乘积的步骤。让我们来看矩阵的第一行,在向量(值3和4)和行(值1和2)之间进行点积。第一行的第一个值的与第一列的第一个值(1⋅3)和第一行第二个值与第一列的第二个值(2⋅4),它计算的矩阵的第一个元素是(1⋅3 + 2⋅4 = 11)。

你可以看到矩阵乘积与点积相关,就像把矩阵A分成三行并应用点积(如数据科学的基本数学)。

看看它是如何与numpy一起工作的。

A = np.array([ [1, 2], [5, 6], [7, 8]])v = np.array([3, 4]).reshape(-1, 1)A @ v
array([[11], [39], [53]])

请注意,我们使用了reshape函数将向量重塑为一个2乘1的矩阵(-11告诉Numpy猜测剩余的数字)。如果没有它,将以一维数组结束,而不是这里的二维数组(只有一列的矩阵)。

还有另一种方法来考虑矩阵乘积,可以考虑向量包含了对矩阵的每一列加权的值。它清楚地表明,向量的长度需要等于应用向量的矩阵的列数。

下图可能有助于将这个概念形象化。可以将向量值(3和4)视为应用于矩阵列的权重。前面看到的标量乘法规则会产生与以前相同的结果。

使用最后一个示例,可以编写A和v之间的乘积,如下所示:

这一点很重要,因为正如你在数据科学基础数学中看到的更多细节,它表明Av是A的列的线性组合,系数是v的值。

另外,你可以看到矩阵的形状和向量的形状必须匹配才能得到乘积。

矩阵乘积类似于矩阵向量积,但应用于第二个矩阵的每一列。

使用Numpy,可以精确地计算矩阵乘积:

A = np.array([ [1, 2], [5, 6], [7, 8],])B = np.array([ [3, 9], [4, 0]])A @ B
array([[11, 9], [39, 45], [53, 63]])

与矩阵向量积一样,第一个矩阵的列数必须与第二个矩阵的行数相匹配。

结果矩阵的行数与第一个矩阵的行数相同,列数与第二个矩阵的列数相同。

我们试试吧。

A = np.array([ [1, 4], [2, 5], [3, 6],])
B = np.array([    [1, 4, 7],    [2, 5, 2],])

矩阵A和B有不同的形状。让我们计算他们的乘积:

A @ B
array([[ 9, 24, 15], [12, 33, 24], [15, 42, 33]])

你可以看到A⋅B的结果是一个3乘3的矩阵。这个形状来自A(3)的行数和B(3)的列数。

可以使用矩阵与其转置矩阵之间的乘积计算数据集的协方差矩阵,然后除以观测值(或贝塞尔修正值减去1),但是需要事先确保变量的中心在零左右(这可以通过减去平均值来实现)。

让我们模拟以下变量x、y和z:

x = np.random.normal(10, 2, 100)y = x * 1.5 + np.random.normal(25, 5, 100)z = x * 2 + np.random.normal(0, 1, 100)

使用Numpy,协方差矩阵为:

np.cov([x, y, z])
array([[ 4.0387007 , 4.7760502 , 8.03240398], [ 4.7760502 , 32.90550824, 9.14610037], [ 8.03240398, 9.14610037, 16.99386265]])

现在,使用矩阵乘积,首先进行堆叠:

X = np.vstack([x, y, z]).TX.shape

你可以看到变量X是一个100×3的矩阵:100行对应于观察值,3列对应于特征。然后,把这个矩阵减去均值:

X = X - X.mean(axis=0)

最后,计算协方差矩阵:

(X.T @ X) / (X.shape[0] - 1)
array([[ 4.0387007 , 4.7760502 , 8.03240398], [ 4.7760502 , 32.90550824, 9.14610037], [ 8.03240398, 9.14610037, 16.99386265]])

你会得到一个协方差矩阵,与函数np.cov中得到的协方差矩阵相似,这一点很重要,要记住一个矩阵的转置乘积对应于协方差矩阵。

两个矩阵之间乘积的转置定义如下:

例如,取以下矩阵A和B:

A = np.array([    [1, 4],    [2, 5],    [3, 6],])B = np.array([    [1, 4, 7],    [2, 5, 2],])

你可以检查(AB)^T和B^T A^T的结果:

(A @ B).T
array([[ 9, 12, 15], [24, 33, 42], [15, 24, 33]])
B.T @ A.T
array([[ 9, 12, 15], [24, 33, 42], [15, 24, 33]])

两个向量或矩阵在括号中的顺序必须改变,以满足等价性。如果改变向量和矩阵的顺序,矩阵乘积的转置等于转置的乘积。

可以将此属性应用于两个以上的矩阵或向量,例如这样。

(0)

相关推荐

  • 掌握了MMULT函数,你就拿到了打开通往函数至高境界大门的钥匙

    送人玫瑰,手有余香,请将文章分享给更多朋友 动手操作是熟练掌握EXCEL的最快捷途径! MMULT函数对于初学者来讲是一个比较陌生的函数,但不代表它默默无闻.函数发烧友对它趋之若鹜.今天我就来带大家一 ...

  • 初识矩阵乘积函数mmult的原理和基本用法

    小伙伴们过年好!祝大家在新的一年里健康,平安,自在,百毒不侵.那我们今天也来学习一个新函数的用法,那就是mmult.在官方的解释中,它是返回两个数组的矩阵乘积,实际上乘积之后还要求和,可以看作sump ...

  • Python|线代矩阵问题

    问题描述 Python中含有丰富的库提供我们使用,学习数学分支线性代数时,矩阵问题是核心问题.Numpy库通常用于python中执行数值计算,并且对于矩阵操作做了特殊的优化,numpy库通过向量化避免 ...

  • 奇异值分解SVD

    矩阵分解在机器学习领域有着广泛应用,是降维相关算法的基本组成部分.常见的矩阵分解方式有以下两种 1. 特征分解Eigendecomposition, 也叫作谱分解Spectral decomposit ...

  • 人工智能基础课堂纪要2

    3.3 常见图形绘制[*] 1.折线图 -- plt.plot 变化 2.散点图 -- plt.scatter() 分布规律 3.柱状图 -- plt.bar 统计.对比 4.直方图 -- plt.h ...

  • Numpy闯关100题,我闯了95关。

    我是小z 之前写的Pandas系列,已经为数千个徘徊在pandas大门的小伙伴打开了一条快速上分通道: 最新的一个百度网盘分享下载量 对于Numpy,我讲的不多,因为和Pandas相比,他距离日常的数 ...

  • 机器学习:爱因斯坦的小贡献

    怎么,爱因斯坦(Albert Einstein)那会儿就有数据科学了吗? 倒不是这个意思,爱因斯坦也没有提出什么数学理论,但他提出了一个针对数学公式的符号简化办法,即爱因斯坦求和约定(Einstein ...

  • 第 109 天:NumPy 矩阵

    机器学习中会用到大量的数学操作,而 Numpy 计算库使这些操作变得简单,这其中就涉及到了 Numpy 的矩阵操作,下面我们就来一起学习如何在 Numpy 科学计算库中进行矩阵的一些基本运算. 1 矩 ...

  • 数据分析之NumPy(五)数组间运算

    数组与数的运算 arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]]) arr + 1 arr * 2 arr / 2 # 可以对比pytho ...

  • 【矮矩阵 / 长矩阵】- 图解线性代数 10

    矩阵乘法可以理解为一个特定的线性变换, 比如在 2x2 的可逆矩阵表示就是二维空间的(可逆)变换; 3x3 的可逆矩阵表示三维空间的变换. 这些都是 nxn 型的矩阵, 本节来看看更一般 mxn 矩阵 ...

  • 矩阵乘积函数mmult进阶应用8:像if({1,0})一样置换2列数据

    小伙伴们,还好吗?今天来分享一下mmult的另一个用法,像if({1,0},..,..)一样置换两列数据的位置,置换后可以用vlookup实现逆向查询.还是来看2个例子. 1.置换2列数值,并用vlo ...

  • 矩阵乘积函数mmult进阶应用7:条件计数

    小伙伴们,大家好.今天继续来说mmult在条件计数中的应用,还是来看两个例子. 1.计算晚点次数(抵达时间大于预计时间) 下图是一个时刻表,记录的是预计到达时间和实际到达时间.现在的问题是求出晚点的次 ...

  • 矩阵乘积函数mmult应用6:条件计数

    小伙伴们,大家好.现在是特殊时期,希望大家做好防护措施,尽量不外出,更不要聚集,在家也可以找一些事情做,比如看电视,或做一顿好吃的,再不行学一下excel .言归正传,今天来学习下mmult在条件计数 ...

  • 矩阵乘积函数mmult进阶应用5:累加求和

    小伙伴们,大家好.今天继续来说mmult的累加应用,这次的题目是按指定次数重复内容.有关这个问题,我们之前也说过很多方法,今天来详细说说mmult的方法. 先来看看数据源和最后的效果.下图左表是数据源 ...

  • 矩阵乘积函数mmult进阶应用4:累加求和

    小伙伴们好,不知道mmult有没有让你感觉很晕,反正我是有点晕了.咱们接着昨天的问题继续深入,准备好了吗? 1.计算甲原料在哪个仓库的库存量先达到30,并确定是在哪一天达到此库存量.(增加了原料) 在 ...

  • 矩阵乘积函数mmult应用3:累加求和

    小伙伴们,大家好.今天来说下mmult的累加求和,累加求和的用处也是挺大的.下面看几个例子吧. 1.计算每天的库存量 下图是一个入库记录表,现在要计算每天的库存量,库存量的计算方法是当天的入库量加上之 ...

  • 矩阵乘积函数mmult基础应用2:条件求和

    小伙伴们,大家好.昨天说了mmult的条件求和用法.今天继续来说下条件求和的应用,加强一下对mmult的理解. 1.对每个人大于80分的成绩求和 这是个单条件求和的问题,方法有很多,比如sum,sum ...

  • 矩阵乘积函数mmult基础应用1:条件求和

    小伙伴们好,今天继续来学习一下mmult的基础用法.先从最简单的求和开始,然后再到条件求和.不知道大家对于mmult的规则了解了多少,还是先来复习一下它的规则.第1参数的列数要和第2参数的行数相同,结 ...