我自己是此作者:https://yonggie.blog.csdn.net...
前言
数学中(教科书、大学课堂、数学相干的科普视频),一个矩阵的向量往往是竖着的,一列作为一个vector,这一点numpy库也是这样默认的。
然而在机器学习以torch框架为例,一个有意义的向量或者说embedding是横着的。
比拟
因为numpy库默认是一列是一个向量而torch等机器学习框架默认一行是一个向量,所以torch.cov(X)
和numpy.cov(X.T)
是相等的。
自行实现
torch在较高版本中才有torch.cov
函数,低版本的须要自行实现。
因为大部分博客都是数学格调的,在减掉均值后,大部分写$XX^T$算协方差矩阵,这是默认以列为一个vector,肯定要留神。
因为torch的一个向量是一个横行,所以自行实现其实是$X^TX$
def torch_cov(input_vec:torch.tensor): x = input_vec- torch.mean(input_vec,axis=0) cov_matrix = torch.matmul(x.T, x) / (x.shape[0]-1) return cov_matrix
这样子能够和numpy的cov比拟一下:
vecs=torch.tensor([[1,2,3,4],[2,2,3,4]]).float()vecs_np=vecs.numpy()cov = np.cov(vecs_np.T)# 显示array([[0.5, 0. , 0. , 0. ], [0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. ], [0. , 0. , 0. , 0. ]])torch_cov(vecs)# 显示tensor([[0.5000, 0.0000, 0.0000, 0.0000], [0.0000, 0.0000, 0.0000, 0.0000], [0.0000, 0.0000, 0.0000, 0.0000], [0.0000, 0.0000, 0.0000, 0.0000]])
二者是一样的。
直面矩阵的数学解释
对于矩阵\(M\)来说,1行为一个高维变量\(x_i\)该当示意成
$$\left[ \begin{matrix}x_1\\ x_2\\ x_3\\ \end{matrix} \right]$$
计算均值\(\mu\),该当是对\(x_i\)求\(\mu\),$$\mu=\frac1N\sum_Nx_i$$所以\(\mu\)也是一个高维(与x同维度)的向量。
\(M-\mu\)变换该当示意成
$$X=\left[ \begin{matrix}x_1-\mu\\ x_2-\mu\\ x_3-\mu\\ \end{matrix} \right]=\left[ \begin{matrix}x_1'\\ x_2'\\ x_3'\\ \end{matrix} \right]$$
咱们把变换后的\(M\)写做\(X\),变换后的\(x_i\)写作\(x'_i\)。
协方差矩阵\(\Sigma\)的意义是各个维度之间互相的方差,则该当是
$$\frac13X^TX=\frac13\left[ \begin{matrix}x_1', x_2', x_3'\\ \end{matrix} \right]\left[ \begin{matrix}x_1'\\ x_2'\\ x_3'\\ \end{matrix} \right]=\Sigma$$
直观解释是这个乘法\(\Sigma\)最左上角的元素,恰好是\(x'_i\)第1维对第1维的自我方差,此时能够确认是正确意义的协方差矩阵。
当然,算完之后还要乘变量个\(\frac13\)或者\(\frac1{3-1}\)。