代码之家  ›  专栏  ›  技术社区  ›  JCWong

手工实现协方差

  •  0
  • JCWong  · 技术社区  · 1 年前

    我今天做了一个奇怪的观察——我用3种不同的方式实现了两个向量的协方差,得到了2个不同的答案。在R中,方法1和2是相同的。方法3在数学上应该是相同的,但不知何故它返回了一个不同的数字。这里的虫子是什么?

    # Make some data
    set.seed(100)
    n = 100
    foo = rnorm(n)
    bar = rnorm(n)
    
    # method 1
    cov(foo, bar)
    
    # method 2
    sum(
      (foo - mean(foo)) * (bar - mean(bar))
    ) / (n-1)
    
    # method 3
    (
      sum(foo*bar) - 
        mean(bar)*sum(foo) -
        mean(foo)*sum(bar) + 
        mean(foo)*mean(bar)
    ) / (n-1)
    
    1 回复  |  直到 1 年前
        1
  •  2
  •   Ben Bolker    1 年前

    你忘了 数学的 表示 sum_{i=1}^n mean(foo)*mean(bar) 出来 n*mean(foo)*mean(bar) mean(foo)*mean(bar) 。。。

    (sum(foo*bar) - 
        mean(bar)*sum(foo) -
        mean(foo)*sum(bar) + n*mean(foo)*mean(bar))/(n-1)