微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

任何帮助,将不胜感激 !

无法执行“XMLHttpRequest”上的“打开”:无效的URL

运行时错误:无法读取未定义的属性“推”

最好

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

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

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

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

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

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

初始化Count , Sum和SumOfSquares为零。

当您收到每个号码时,请将一个号码添加到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的数学统计

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐