我正在尝试NbCluster
优化一个
函数( github.com/jbhanks/BigNbClustNbClust
主要瓶颈之一是var()
函数的使用,所以我用cova
in替换了它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())。我通过始终将对象强制为矩阵来修复它,但我仍然担心我的更改可能会产生意想不到的后果。我不能说我真正掌握了函数的内部工作原理,我只是用我理解为等效的函数替换了一些函数。