【问题标题】:Rounding differences in sum-of-squares calculation平方和计算中的舍入差异
【发布时间】:2013-06-04 16:23:37
【问题描述】:

我正在尝试在评估聚类(不同主题)的过程中对列进行方差计算。在这样做的过程中,我遇到了一个很好的技巧来使用基本的“var”函数来做到这一点。然而,为了确保它在做我认为应该做的事情,我将它与手动计算的方差进行了比较。在做我的手卷版本时,我得到了几乎 1% 的计算差异。我知道浮点精度会存在差异,但是这种大小的数字的 1% 似乎有点高。

下面是我用来检查两种 calc 方法的代码(确切地说,是 3 种方法,因为我还通过矩计算了方差,看起来“var”计算使用了这个矩快捷方式)。有样本数据,可以看到方差计算的差异。

我想知道在这些计算中断言 1% 的差异是否很高是否合理?

谢谢,

马特

代码如下:

>     # Sample data
>     # This will be 2-d coordinates with pre-defined clusters (treatments)
> dat = rbind(
+             # 4-point cross cluster centered on (2,2)
+         data.frame(grp=1, x=2, y=3),
+         data.frame(grp=1, x=3, y=2),
+         data.frame(grp=1, x=2, y=1),
+         data.frame(grp=1, x=1, y=2),
+             # 2-point dumbbell centered on (-2,-2)
+         data.frame(grp=2, x=-3, y=-2),
+         data.frame(grp=2, x=-1, y=-2),
+             # 3-point equilateral triangle cenetered on (-2,2)
+         data.frame(grp=3, x=-2, y=3),
+         data.frame(grp=3, x=(-2 - sqrt(3)/2), y=-1.5),
+         data.frame(grp=3, x=(-2 + sqrt(3)/2), y=-1.5)
+ )
> 
> 
>     # Compare var calc to hand calc
>     # -----------------------------
> 
>     # Shortcut using existing 'var' function
> var1 = (nrow(dat) - 1) * apply(dat[,-1], 2, var)
> print(var1)
       x        y 
41.05556 37.72222 
> 
>     # Hand-rolled from definition
> centroid = apply(dat[,-1], 2, mean)
> var2 = apply((dat[,-1] - centroid)^2, 2, sum)
> print(var2)
       x        y 
41.46952 37.79630 
> 
>     # Using raw moments
>     # Looks to be same as variance calculation
> var3 = apply(dat[,-1], 2, function(col) length(col) * (mean(col^2) - mean(col)^2))
> print(var3)
       x        y 
41.05556 37.72222 
> 
>     # What is the percent difference?
> calcdiff = (var3 - var2) / var2 * 100
> print(calcdiff)
         x          y 
-0.9982268 -0.1959824 

【问题讨论】:

    标签: r


    【解决方案1】:

    您的第二个定义有一个错误。当你这样做时

    var2 = apply((dat[,-1] - centroid)^2, 2, sum)
    

    您不是对每一列进行均值校正,而是在每一列中交替减去质心元素。

    试试这个:

    var2 = apply((dat[,-1] - matrix(centroid, nrow=nrow(dat), ncol=2, byrow=TRUE))^2, 2, sum)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多