1

我正在尝试NbCluster优化一个 函数( github.com/jbhanks/BigNbClustNbClust

主要瓶颈之一是var()函数的使用,所以我用covain替换了它Rfast。结果并不完全相同,我需要弄清楚它们是否足够接近可以互换使用。是否会出现其他差异更大的情况?

> bigm <- matrix(rnorm(1000*1000,mean=0,sd = 3), 1000, 1000)
> v <- var(bigm)
> cvm <- cova(bigm)
> sum(v != cvm)
[1] 954579
> sum(v == cvm)
[1] 45421
> cor(c(v), c(cvm), method = "pearson")
[1] 1
> cor(c(v), c(cvm), method = "spearman")
[1] 1
> diff = v - cvm
> mean(diff)
[1] -4.557742e-19
> max(diff)
[1] 2.4869e-14
> bigm <- matrix(rnorm(10000*10000,mean=0,sd = 3), 10000, 10000)
> v <- var(bigm)
> cvm <- cova(bigm)
> sum(v != cvm)
[1] 97986031
> sum(v == cvm)
[1] 2013969
> cor(c(v), c(cvm), method = "pearson")
[1] 1
> cor(c(v), c(cvm), method = "spearman")
[1] 1
> diff = v - cvm
> mean(diff)
[1] -3.875792e-20
> max(diff)
[1] 9.05942e-14

然而,在某些现实世界的情况下(不幸的是我无法分享实际数据),cova会抛出错误而var不会。

Error in sqrt(n) : non-numeric argument to mathematical function

这似乎是cova在特定循环迭代的特定情况下获取向量而不是矩阵的结果(cova 在早期步骤中获取了 dim())。我通过始终将对象强制为矩阵来修复它,但我仍然担心我的更改可能会产生意想不到的后果。我不能说我真正掌握了函数的内部工作原理,我只是用我理解为等效的函数替换了一些函数。

4

1 回答 1

0

cova 和 var 给你相同的结果,你从平均差异中看到了。“sum(v != cvm)”不给零是合理的。结果并非所有小数位都相同。

于 2019-09-24T14:36:52.523 回答