这两个协方差函数之间的区别是什么?

2024-10-02 12:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想重写这个协方差函数:

 def cov1(a, b):
    a_mean = np.mean(a)
    b_mean = np.mean(b)
    sum = 0
    for i in range(0, a.size):
        sum = ((a[i] - a_mean) * (b[i] - b_mean)) + sum
    return sum/(len(a)-1)

我尝试重新编写求和部分,使其成为np.sum:

def cov(a, b):
    a_mean = np.mean(a)
    b_mean = np.mean(b)
    for i in range(0, a.size):
        summation = np.sum((a[i] - a_mean) * (b[i] - b_mean))
    return summation/(len(a)-1)

但当我使用两个数组时:

a = np.arange(1,11,1)
b = np.arange(10,21,1)

我尝试了两个不同的函数,得到了不同的答案。功能cov1是正确的:

print(cov1(a,b))
print(cov(a,b))

9.166666666666666
2.0

为什么会这样?如何修复函数cov(a,b)使其与cov1(a,b)相同


Tags: 函数inforsizelenreturndefnp
2条回答

首先,我认为两个函数都应该确保输入的长度相同

第二,你的功能可能是

def cov(a, b):
    a_mean = np.mean(a)
    b_mean = np.mean(b)
    return ((a - a_mean) * (b - b_mean)).sum() / (len(a) - 1)

第三,numpy有cov功能,试试看

np.cov(a, b)

这将返回变量的协方差矩阵。在您的例子中,您可以只使用np.cov(a,b)[0,0]

您忘记在cov中定义summation,并且忘记将summation添加到新的总和中。 请尝试以下方法:

def cov(a, b):
    a_mean = np.mean(a)
    b_mean = np.mean(b)
    # Added summation and assigned 0 to it, like for sum in cov1
    summation = 0
    for i in range(0, a.size):
        # Added + summation here, just like in cov1
        summation = np.sum((a[i] - a_mean) * (b[i] - b_mean)) + summation 
    return summation/(len(a)-1)

相关问题 更多 >

    热门问题