我正在尝试使用MapReduce在JavaScript中实现variance的并行计算。我相信这个Parallel algorithm可以使用,但我cannott弄清楚如何将它应用于任意数量的数据集。到目前为止,我得出的结论是,解决这个问题的最好方法是根据平方和来进行缩减,而不是根据方差进行。一个天真的实施将看起来像:并行计算方差
// partials is an array of [count, sum, sumsquare] arrays
function variance(partials) {
var count = 0;
var sum = 0;
var sumsquare = 0;
for (var i = 0; i < partials.length; ++i) {
count += partials[i][0];
sum += partials[i][1];
sumsquare += partials[i][2];
}
return (sumsquare/count) - Math.pow(sum/count, 2);
}
// variance([[3, 6, 14], [3, 15, 77], [3, 24, 194]]) should return 6.666666666666668
不是作为一个统计学家,我有一个很难搞清楚这样的并行算法是否会引入太多的复利错误。但如果可以接受,值得注意的是,在map
阶段不需要计算方差。只需要平方,总和和计数的总和。
你应该分享你所拥有的,到目前为止,在代码方面。 – pizzasynthesis 2014-09-28 21:37:33
你是对的。在一些白板后,我设法得到了一个天真的执行。不知道它是否会持有水。 – 2014-09-28 22:05:14
有一篇维基百科文章讨论这个问题:https://en.wikipedia.org/wiki/Algorithms_for_calculating_variance – 2014-09-29 19:33:38