我正在尝试优化一个函数(NbCluster),使其能够处理更大的矩阵,这是我在前面发布的内容:Reducing NbClust memory usage这让我创建了一个(仍然非常实验性的) NbClust分支,它在这里:https://github.com/jbhanks/BigNbClust
其中一个主要的瓶颈是使用var()函数,所以我在Rfast中用cova替换了它。结果并不完全相同,我需要弄清楚它们是否足够接近,可以互换使用。会不会出现其他差异更大的情况?
> 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然而,在某些实际情况下(不幸的是我不能分享实际数据),var不会抛出错误,而cova会抛出错误。
Error in sqrt(n) : non-numeric argument to mathematical function这似乎是cova在特定循环迭代中获取向量而不是矩阵的结果(cova在早期步骤中获取dim() )。我通过总是将对象强制转换为矩阵来修复它,但我仍然担心我的更改可能会产生意想不到的后果。我不能说我真的掌握了函数的内部工作原理,我只是用我理解为等价的函数替换了几个函数。
发布于 2019-09-24 22:36:53
cova和var给出了相同的结果,你可以从平均差异中看到它。"sum(v != cvm)“不给零是合理的。结果并不是所有的小数位都相同。
https://stackoverflow.com/questions/57932385
复制相似问题