【问题标题】:What is the difference between these two covariance functions? [closed]这两个协方差函数有什么区别? [关闭]
【发布时间】:2020-11-26 08:01:42
【问题描述】:

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

 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) 相同?

【问题讨论】:

  • 请注意数组ab 的长度不同。不知道是不是笔误
  • cov1 每次将当前步骤的部分和相加; cov 替换旧值。另外,不要使用sum 作为变量名,因为它隐藏了内置的sum 函数。此外,您不必自己实现这一点。您是否尝试将numpy covariance 放入搜索引擎?

标签: python function numpy jupyter


【解决方案1】:

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

其次,你的功能可能是这样的

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]

【讨论】:

    【解决方案2】:

    您忘记在 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 2011-02-20
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2021-06-28
      相关资源
      最近更新 更多