是否有一种算法来估计一组值的中位数、模式、偏度和/或峰度,但不需要将所有值一次性存储在内存中?
我想计算一下基本的统计数据:
计算这些的基本公式是小学算术,我知道。还有许多统计数据库实现了它们。
我的问题是我所处理的集合中有大量(数十亿)的值: 在 Python 中,我不能仅仅使用数十亿个元素来创建列表或散列。即使我用 C 语言编写,十亿元素数组也不太实用。
数据未排序。它是随机产生的,在飞行中,由其他过程。每一套的大小是高度可变的,并且大小将不会事先知道。
我已经知道如何很好地处理均值和方差,以任意顺序迭代集合中的每个值。(实际上,在我的例子中,我是按照它们生成的顺序进行处理的。)下面是我正在使用的算法,由 http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm提供:
这种“在线”算法有缺点(例如,当 sum _ of _ square 快速增长超过整数范围或浮点精度时,会出现精度问题) ,但它基本上给了我所需要的,而不需要存储每个集合中的每个值。
但我不知道是否存在类似的技术来估计额外的统计数据(中位数,模式,偏度,峰度)。只要处理 N 个值所需的内存实质上小于 O (N) ,我就可以接受有偏估计,甚至是在一定程度上损害精度的方法。
指向一个现有的统计库也会有所帮助,如果该库具有“在线”计算一个或多个这些操作的函数的话。