numpy.cov实际上做了什么

时间:2016-12-03 06:49:07

标签: python numpy

我是python和线性代数的新手,我对矩阵的协方差有疑问。

我有一个21乘2的矩阵,其中第一列代表当年发布的视频游戏的平均分数(从0到10),第二列代表1996年至2016年的年份。

我正在玩数据,我注意到通过做np.cov(X) 我有一个非常有趣的图表。我将列出下面的图表。我的理解是协方差显示了数据集中变量之间的依赖关系,但是根据这个协方差图可以说,随着年份的增长,游戏的平均得分会上升,这是正确的吗?

enter image description here

感谢。

1 个答案:

答案 0 :(得分:3)

你的计算没有意义。默认情况下,对于np.cov(X),X的每一行代表一个变量,并在列中显示。比如,第一行可能是一年中的降雨量,另一行可能是视频游戏的平均评级,另一行可能只是年份本身的数量,如2012年。然后C = np.cov(X)会给你一个3乘3的矩阵C其中每个对角线条目表示该行内有多少方差,而非对角线条目表示不同行的相关程度。即,行i和行j的相关系数是C[i,j]/sqrt(C[i,i]*C[j,j])

如果您的数据看起来像X = [[7.5, 2010], [8.2, 2011], [8.1, 2013]],则np.cov(X)毫无意义,因为7.5和2010不是对同一变量的两个不同观察结果。相反,7.5,8.2和8.1是对同一变量(游戏评级)的不同观察。您应该使用的是

C = np.cov(X, rowvar=False)

告诉Numpy您的变量在列中。在我的例子中,你将获得一个2乘2的矩阵(因为有2个变量)

  [[ 0.14333333,  0.38333333],
   [ 0.38333333,  2.33333333]]

由于非对角线项为正,因此两个变量正相关。具体地,相关系数是C[0,1]/np.sqrt(C[0,0]*C[1,1]),其为0.66,表明相当强的相关性。