是否有一种算法可以估计一组值的中值,众数,偏度和/或峰度,但是不需要一次将所有值存储在内存中?
我想计算基本统计数据:
- 平均值:算术平均值
- 方差:与平均值的平方偏差的平均值
- 标准偏差:方差的平方根
- 中位数:将数字大半部分与小半部分分开的值
- 模式:集合中最常出现的值
- 偏度:tl; 博士
- 峰度:tl; 博士
计算其中任何一个的基本公式是小学算术,我确实知道它们。也有许多实现它们的统计资料库。
我的问题是我正在处理的集合中有大量(十亿个)值:在Python中工作,我不能仅仅创建包含数十亿个元素的列表或哈希。即使我用C编写此代码,十亿个元素的数组也不太实用。
数据未排序。它是由其他过程动态随机产生的。每个集合的大小是高度可变的,并且大小不会事先知道。
我已经弄清楚了如何很好地处理均值和方差,以任意顺序遍历集合中的每个值。(实际上,就我而言,我按它们生成的顺序进行处理。)这是我使用的算法,由http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm提供:
- 初始化三个变量:count,sum和sum_of_squares
- 对于每个值:
- 增量计数。
- 将值相加。
- 将值的平方添加到sum_of_squares。
- 将总和除以计数,并存储为变量均值。
- 将sum_of_squares除以计数,存储为变量mean_of_squares。
- 平方均值,存储为square_of_mean。
- 从mean_of_squares中减去square_of_mean,并存储为方差。
- 输出均值和方差。
这种“在线”算法具有弱点(例如,由于sum_of_squares迅速增长到大于整数范围或浮点精度的精度问题),但是它基本上满足了我的需要,而不必在每个集合中存储每个值。
但是我不知道是否存在类似的技术来估算其他统计数据(中位数,众数,偏度,峰度)。只要处理N个值所需的内存大大小于O(N),我就可以使用有偏估计器,甚至可以使用在某种程度上损害准确性的方法。
如果该库具有“在线”计算这些操作中的一项或多项的功能,则将我指向现有的统计信息库也将有所帮助。