用 Python 和 Numpy 计算协方差

Posted

技术标签:

【中文标题】用 Python 和 Numpy 计算协方差【英文标题】:Calculating Covariance with Python and Numpy 【发布时间】:2013-03-10 01:14:44 【问题描述】:

我试图弄清楚如何使用 Python Numpy 函数 cov 计算协方差。当我将两个一维数组传递给它时,我会得到一个 2x2 的结果矩阵。我不知道该怎么办。我不擅长统计,但我相信这种情况下的协方差应该是一个数字。 This 是我要找的。我自己写的:

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)

这行得通,但我认为 Numpy 版本的效率要高得多,如果我能弄清楚如何使用它的话。

有人知道如何让 Numpy cov 函数像我写的那样执行吗?

谢谢,

戴夫

【问题讨论】:

次要评论,但您可以利用 numpy 来计算总和:sum = ((a - a_mean) * (b - b-mean)).sum() 为什么返回sum/(len(a)-1)?不应该是sum/(len(a))吗?从长度中减去 1 是错误的 @Connor 样本的协方差由分母为 N-1 的公式描述;对于一个总体,它由分母中的 N 来描述。所以这真的取决于计算的内容。 是的,你是对的 【参考方案1】:

ab 是一维序列时,numpy.cov(a,b)[0][1] 等价于您的cov(a,b)

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

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

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

(同样,cov 是您在上面定义的函数。)

【讨论】:

非常感谢!我希望文档能很好地解释它。这完美无缺。一旦我有了自己的工作函数,我应该将结果与 numpy.cov 函数进行比较,我可能已经弄清楚了。如果可以的话,我会投赞成票,但我是新手,显然不能。 没问题。很高兴我能帮上忙。 这是不正确的:numpy.cov 默认计算 sample 协方差。下一个答案解释了它。特别是应该说numpy.cov(a,b, bias=True)[0][1] @javadba:看看 OP 的代码。他除以(len(a)-1),所以他的cov 函数正在计算样本协方差。因此,我的回答是正确的.. 啊好的。但是您应该在答案中添加注释。我孤立地看着你的回答,怀疑我是唯一这样做的人。【参考方案2】:

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

numpy.cov(a, b, bias=True)[0][1]

或者像这样:

numpy.cov(a, b, ddof=0)[0][1]

【讨论】:

是正确答案,而不是被接受的答案 - 它省略了bias=True 事实证明,接受的答案确实有效:但它不包括提及偏差调整——它隐藏在 OP 中。所以这个答案信息很有帮助。 @Lerner Zhang。将 n_samples 减去 1 可提供总体协方差的无偏估计量。见 en.wikipedia.org/wiki/Bias_of_an_estimator @Osian 当您说“感谢 ubuntu”时,如果这意味着您有参考/来源可以引用,请这样做。否则是什么意思? @brethvoice 我引用了 unutbu 提供的已接受答案(见上文)。尽管公认的答案是正确的,但它没有讨论计算样本和总体协方差之间的重要区别。【参考方案3】:

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

使用statistics.covariance 这是两个输入的联合可变性的度量(您正在寻找的数字):

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

【讨论】:

很好地避免了 numpy。 希望统计数据很快就会包括在线版本。与此同时,github.com/microprediction/precise

以上是关于用 Python 和 Numpy 计算协方差的主要内容,如果未能解决你的问题,请参考以下文章

numpy和matlab计算协方差矩阵的不同(matlab是标准的,numpy相当于转置后计算)

python与数据分析Numpy数值计算基础——补充

Python计算无偏方差无偏标准差

Python计算无偏方差无偏标准差

python 显示大熊猫和具有缺失值的numpy之间的协方差估计的不同方法。

在 NumPy 中计算自协方差函数向量而不使用 np.correlate