用 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】:
当a
和b
是一维序列时,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相当于转置后计算)