使用Python和Numpy计算协方差

79 投票
3 回答
162896 浏览
提问于 2025-04-17 18:33

我正在尝试弄清楚如何使用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)

这个方法可以用,但我觉得Numpy的版本会更高效,只是我还没弄明白怎么用。

有没有人知道如何让Numpy的cov函数像我写的那个一样工作?

谢谢,

Dave

3 个回答

10

注意,从 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
36

感谢unutbu的解释。默认情况下,numpy.cov计算的是样本的协方差。如果你想得到总体的协方差,可以通过总样本数N来进行规范化,方法如下:

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

或者这样:

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

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 是你之前定义的那个函数。)

撰写回答