栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

前言

数学中(教科书、大学课堂、数学相关的科普视频),一个矩阵的向量往往是竖着的,一列作为一个vector,这一点numpy库也是这样默认的。
但是在机器学习以torch框架为例,一个有意义的向量或者说embedding是横着的。

比较

因为numpy库默认是一列是一个向量而torch等机器学习框架默认一行是一个向量,所以
torch.cov(X)和numpy.cov(X.T)是相等的。

自行实现

torch在较高版本中才有torch.cov函数,低版本的需要自行实现。
因为大部分博客都是数学风格的,在减掉均值后,大部分写 X X T XX^T XXT算协方差矩阵,这是默认以列为一个vector,一定要注意。
因为torch的一个向量是一个横行,所以自行实现其实是 X T X X^TX XTX

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 M M来说,1行为一个高维变量 x i x_i xi​应当表示成
[ x 1 x 2 x 3 ] left[ begin{matrix} x_1\ x_2\ x_3\ end{matrix} right] ⎣⎡​x1​x2​x3​​⎦⎤​
计算均值 μ mu μ,应当是对 x i x_i xi​求 μ mu μ, μ = 1 N ∑ N x i mu=frac1Nsum_Nx_i μ=N1​N∑​xi​所以 μ mu μ也是一个高维(与x同维度)的向量。
M − μ M-mu M−μ变换应当表示成
X = [ x 1 − μ x 2 − μ x 3 − μ ] = [ x 1 ′ x 2 ′ x 3 ′ ] 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] X=⎣⎡​x1​−μx2​−μx3​−μ​⎦⎤​=⎣⎡​x1′​x2′​x3′​​⎦⎤​
我们把变换后的 M M M写做 X X X,变换后的 x i x_i xi​写作 x i ′ x'_i xi′​。
协方差矩阵 Σ Sigma Σ的意义是各个维度之间相互的方差,则应当是
1 3 X T X = 1 3 [ x 1 ′ , x 2 ′ , x 3 ′ ] [ x 1 ′ x 2 ′ x 3 ′ ] = Σ frac13X^TX=frac13left[ begin{matrix} x_1', x_2', x_3'\ end{matrix} right]left[ begin{matrix} x_1'\ x_2'\ x_3'\ end{matrix} right]=Sigma 31​XTX=31​[x1′​,x2′​,x3′​​]⎣⎡​x1′​x2′​x3′​​⎦⎤​=Σ
直观解释是这个乘法 Σ Sigma Σ最左上角的元素,恰好是 x i ′ x'_i xi′​第1维对第1维的自我方差,此时可以确认是正确意义的协方差矩阵。
当然,算完之后还要乘变量个 1 3 frac13 31​或者 1 3 − 1 frac1{3-1} 3−11​。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883365.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号