用Python和Numpy计算协方差

Dav*_*ave 50 python numpy covariance

我试图弄清楚如何计算与Python Numpy函数cov的协方差.当我传递两个一维数组时,我得到了一个2x2的结果矩阵.我不知道该怎么做.我在统计数据上并不擅长,但我认为在这种情况下的协方差应该只是一个数字. 就是我要找的.我写了自己的:

def cov(a, b):

    if len(a) != len(b):
        return

    a_mean = np.mean(a)
    b_mean = np.mean(b)

    sum = 0

    for i in range(0, len(a)):
        sum += ((a[i] - a_mean) * (b[i] - b_mean))

    return sum/(len(a)-1)
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我认为Numpy版本效率更高,如果我能弄清楚如何使用它.

有谁知道如何使Numpy cov功能表现得像我写的那样?

谢谢,

戴夫

unu*_*tbu 100

ab是一维序列时,numpy.cov(a,b)[0][1]相当于你的cov(a,b).

返回的2x2数组np.cov(a,b)具有等于​​的元素

cov(a,a)  cov(a,b)

cov(a,b)  cov(b,b)
Run Code Online (Sandbox Code Playgroud)

(再次,cov你在上面定义的功能.)

  • @javadba:看看OP的代码.他除以`(len(a)-1)`所以他的`cov`函数计算样本协方差.因此,我的回答是正确的.. (6认同)
  • 非常感谢!我希望文档能够很好地解释它.这非常有效.一旦我有自己的工作功能,我应该将结果与numpy.cov函数进行比较,我可能已经想到了这一点.如果可以,我会投票,但我是新人,显然不能. (4认同)
  • 没问题.很高兴我能帮助你. (2认同)
  • 这是不正确的:`numpy.cov` 默认计算 *sample* 协方差。下一个答案解释了它。特别是这应该说`numpy.cov(a,b,bias=True)[0][1]` (2认同)
  • 喔好吧。但是你应该在你的答案中添加一个注释。我孤立地看着你的答案 - 并且怀疑我是唯一这样做的人。 (2认同)
  • @johnktejik:[`cov(a,a) = var(a)`](https://en.wikipedia.org/wiki/Covariance#Properties)。一般来说,方差‘var(a)’不为零。 (2认同)

小智 20

感谢unutbu的解释.默认情况下,numpy.cov会计算样本协方差.要获得总体协方差,您可以通过总N个样本指定归一化,如下所示:

Covariance = numpy.cov(a, b, bias=True)[0][1]
print(Covariance)
Run Code Online (Sandbox Code Playgroud)

或者像这样:

Covariance = numpy.cov(a, b, ddof=0)[0][1]
print(Covariance)
Run Code Online (Sandbox Code Playgroud)

  • **这是正确的答案,而不是公认的答案 - 它省略了 `bias=True` (2认同)

Xav*_*hot 9

请注意,从 开始Python 3.10,可以直接从标准库获取协方差。

使用statistics.covariancewhich 来衡量两个输入的联合变异性(您正在寻找的数字):

from statistics import covariance

# x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# y = [1, 2, 3, 1, 2, 3, 1, 2, 3]
covariance(x, y)
# 0.75
Run Code Online (Sandbox Code Playgroud)