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

时间:2014-01-29 18:32:40

标签: c# windows visual-studio math mean

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

我还需要将数字打印到文件中。

答案在 How to calculate a standard deviation [array] 帮不了。

任何帮助将不胜感激!

最佳

3 个答案:

答案 0 :(得分:5)

一万个数字什么都不是。几百万就足以让你考虑内存,但可能还不足以让你把它们全部留在内存中。

如果你达到数十亿,数万亿甚至更多,那么你就可能无法将它们拉入记忆中。看起来你似乎还没到那一点。

您可以将它们全部拉入List,不需要担心。

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

所以你需要做的就是创建一个IEnumerable<double>来代表你文件中一个延迟填充的数字序列,你可以在它上面调用这些方法。没有必要急切地将它们加载到内存中。

答案 1 :(得分:4)

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

CountSumSumOfSquares初始化为零。

收到每个号码后,在Count添加一个号码,将号码添加到Sum,然后将号码的平方加到SumOfSquares

处理完每个号码后,请将Mean设置为Sum / Count,然后将StandardDeviation设置为Math.Sqrt(SumOfSquares / Count - Mean * Mean)

后一个公式的推导显示在the Wikipedia page for standard deviation

答案 2 :(得分:-1)

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

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

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

math stats with Linq