协方差矩阵在torch和numpy中的比较,以及自行实现torch协方差矩阵

Yonggie

我本人是此作者: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}\)。

阅读 286
31 声望
3 粉丝
0 条评论
31 声望
3 粉丝
文章目录
宣传栏