点乘与叉乘
0. 几何含义0.1 点乘点乘,又称向量的内积,结果为一个数,计算公式如下:上述公式的推导过程如下:因此,通过点乘可以得出两个向量之间的夹角,向量垂直时,点乘结果为0.0.2 叉乘叉乘,又称向量的外积,运算结果为一个向量,该向量z与向量a,b组成的平面垂直,计算公式如下:向量叉乘得到是向量组成平面的法向量,法向量行列式的值可以解释为这两个向量a, b共起点时,所构成平行四边形的面积。1. nump
0. 几何含义
0.1 点乘
点乘,又称向量的内积,结果为一个数,计算公式如下:
上述公式的推导过程如下:
因此,通过点乘可以得出两个向量之间的夹角,向量垂直时,点乘结果为0.
0.2 叉乘
叉乘,又称向量的外积,运算结果为一个向量,该向量z与向量a,b组成的平面垂直,计算公式如下:
向量叉乘得到是向量组成平面的法向量,法向量行列式的值可以解释为这两个向量a, b共起点时,所构成平行四边形的面积。
1. numpy实现
1.1 向量点乘
numpy中使用dot函数来完成向量之间的点乘(对应元素相乘再相加)
1.2 矩阵点乘
numpy中使用multiply函数来实现矩阵之间的点乘(对应位置元素相乘),也可使用 * 运算符实现相同的功能。此时两个矩阵的尺寸大小必须相等。
1.3 矩阵叉乘
numpy中使用matmul函数来实现矩阵之间的叉乘(对应位置元素相乘),也可使用 @ 运算符实现相同的功能。此时第一个矩阵的列数等于第二个矩阵的行数。
总结:
对于向量,使用dot函数完成向量的点乘
对于矩阵,使用multiply函数和 * 运算符完成矩阵的点乘,使用matmul函数和@运算符完成矩阵的叉乘。
2. pytorch实现
2.1 矩阵点乘
pytorch中使用mul函数来完成二维矩阵之间的点乘,同时 * 运算符也可实现相同的功能。
>>> x
tensor([[-0.9263, 0.3411, -0.0781, -0.9598],
[-1.1215, 0.9547, -0.2663, 0.6355],
[-0.2772, 0.2032, -1.4178, -1.8679]])
>>> torch.ones([3, 4])
tensor([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
>>> y = torch.ones([3, 4])
>>> x * y
tensor([[-0.9263, 0.3411, -0.0781, -0.9598],
[-1.1215, 0.9547, -0.2663, 0.6355],
[-0.2772, 0.2032, -1.4178, -1.8679]])
>>> torch.mul(x, y)
tensor([[-0.9263, 0.3411, -0.0781, -0.9598],
[-1.1215, 0.9547, -0.2663, 0.6355],
[-0.2772, 0.2032, -1.4178, -1.8679]])
2.2 矩阵叉乘
pytorch中使用mm函数来完成二维矩阵之间的叉乘,同时@运算符【具体对应的函数应该是matmul】也可完成矩阵的叉乘
pytorch中matmul函数是一个神奇的函数根据第一个和第二个输入tensor的维度得到的是不同的效果。具体介绍如下图所示:
- 假设两个tensor都是一维向量,那么返回的结果是向量之间的点乘,即一个值
- 假设两个tensor都是二维矩阵,那么返回的结果是矩阵的叉乘
- 假设第一个tensor是一维向量,第二个tensor是二维矩阵,那么会给第一个tensor扩充一个维度,从而实现矩阵叉乘(一维向量的维度与二维矩阵的行数相等),得到结果之后将扩充的维度去除
- 假设第一个tensor是二维矩阵,第二个tensor是一维向量,与上面类似,扩充维度之后进行矩阵叉乘,得到结果
上述不同情形的具体过程可以用下图表示:
此外,matmul函数实现了多维情况下矩阵的乘法,例如,输入的第一个tensor的维度为【k, m, p】,第二个tensor的维度为【k, p, n】,则最后的结果维度为【k,m,n】,即对于通道上的两个矩阵完成叉乘,然后组合在一起。
3. matmul函数实现协方差batch计算
协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。计算公式如下:
对于矩阵
根据协方差矩阵的定义: 协方差矩阵的每个元素是各个向量元素之间的协方差.可以得到对应的协方差矩阵求法如下:
矩阵中的数据按行排列与按列排列求出的协方差矩阵是不同的,默认情况下按行排列。即每一行是一个observation(or sample),那么每一列就是一个随机变量。
对应的协方差矩阵为:
示例中,矩阵的维度为【m, n】表示m个样本,每个样本包含n个特征,最后得到的协方差矩阵维度为【n, n】。
numpy中提供函数cov来协方差矩阵,具体用法如下:
其中需要注意重要的参数rowvar的含义:
使用cov函数来求协方差矩阵,默认情况下是按列排列,即每一行代表一个变量,而每一列代表一个sample(观测点)。即输入矩阵的维度【m,n】,输出的协方差矩阵维度【m,m】。
>>> import torch
>>> x = torch.randn([3, 4])
>>> x
tensor([[-0.9263, 0.3411, -0.0781, -0.9598],
[-1.1215, 0.9547, -0.2663, 0.6355],
[-0.2772, 0.2032, -1.4178, -1.8679]])
>>> np.cov(x.numpy())
array([[ 0.41436621, 0.28581725, 0.2887559 ],
[ 0.28581725, 0.87789806, -0.04488792],
[ 0.2887559 , -0.04488792, 0.93183437]])
当输入维度扩充到三维时,在numpy中需要利用for循环来遍历,然后组合,这样的时间效率较差,因此可以通过torch中提供的matmul函数来实现三维下的协方差矩阵求法。
def cov_matrix(tensor, rowvar=True):
# 输入为【batch, m个特征,n个样本】 输出【batch, m, m】
tensor = tensor if rowvar else tensor.transpose(-1, -2)
tensor = tensor - tensor.mean(dim=-1, keepdim=True)
factor = 1/ (tensor.shape[-1] - 1)
return factor * tensor @ tensor.transpose(-1, -2)
参考链接
向量和矩阵的点乘和叉乘_小白一直白-CSDN博客_矩阵的点乘和叉乘
pytorch 中涉及到矩阵之间的乘法(torch.mul, *, torch.mm, torch.matmul, @)_厚积而薄发-CSDN博客_pytorch 矩阵内积
增量计算海量数据协方差(pytorch)_daniaokuye的专栏-CSDN博客_pytorch 协方差
Differentiable 1-D, 2-D covariance (numpy.cov) clone · Issue #19037 · pytorch/pytorch · GitHub
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)