如何有效地计算一系列非常大的数字的均值和标准差?

在Win 7上,通过Visual Studio中的C#,我需要计算大量数字的平均值和标准偏差。 这些数字是从文件中读取的。 可能有十万甚至更多的数字。 如果我不想将它们保存在一个数组结构(如数组或列表)中,因为这可能不是有效的内存,如何有效地进行计算。

我也需要打印数字到一个文件。

如何计算标准偏差[数组]的答案不能帮助。

任何帮助,将不胜感激 !

最好

万数不算什么 几百万就足以让你想起记忆,但是可能还不足以让你把所有的记忆都记下来。

如果你达到数十亿,万亿甚至更多,那么你到了可能无法把它们拉回到记忆的地步。 看起来你还没到那个地步。

你可以把它们全部放入一个List ,不需要担心。

话虽如此,LINQ的Average方法实际上并不需要急切地加载所有数字来计算平均值; 它可以使用“当前”项修改一个聚合值,然后丢弃它,所以它的内存占用非常低。 在问题中链接到的所有StdDev方法都可以这样说; 他们都有一个小的不断的内存足迹。

所以你所要做的就是创建一个IEnumerable<double> ,它表示从文件中延伸出来的数字序列,然后你可以调用这些方法。 没有必要急于将它们加载到内存中。

计算一次处理一个数字时的平均值和标准偏差:

初始化CountSumSumOfSquares为零。

当您收到每个号码时,请将一个号码添加到Count ,将该号码添加到Sum ,然后将该号码的平方加到SumOfSquares

当您处理Math.Sqrt(SumOfSquares / Count - Mean * Mean)每个数字后,将Mean设置为Sum / Count ,并将StandardDeviation设置为Math.Sqrt(SumOfSquares / Count - Mean * Mean)

后一个公式的推导显示在维基百科页面上,用于标准偏差 。

100万个数字(32位整数)需要大约4MB的内存,这是很小的。

只需将它们全部加载到int列表中,然后就可以使用内置的linq方法对它们进行操作。

更新:如何使用linq进行操作:

与Linq的数学统计