有没有一种算法可以估计一组值的中位数、众数、偏度和/或峰度,但不需要一次性将所有值存储在内存中?
我想计算基本统计量:
- 平均值: 算术平均值
- 方差: 平均偏差的平方
- 标准差: 方差的平方根
- 中位数: 将数字中较大的一半与较小的一半分开的值
- 众数: 集合中出现最频繁的值
- 偏度: tl; dr
- 峰度: tl; dr
计算任何一个这些基本统计量的公式都很简单,并且我知道它们。许多统计库也实现了它们。
我的问题是我处理的集合中有大量(数十亿)的值:在Python中工作时,我不能只是创建一个包含数十亿个元素的列表或哈希表。即使我用C编写,十亿个元素的数组也不太实用。
数据没有排序。它是由其他进程随机生成的。每个集合的大小高度可变,并且大小不会事先知道。
我已经发现如何很好地处理平均值和方差,可以按任意顺序迭代每个集合中的值。(实际上,在我的情况下,我按它们生成的顺序来取)这是我正在使用的算法,由http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance#On-line_algorithm提供:
- 初始化三个变量:count、sum和sum_of_squares。
- 对于每个值:
- 增加计数。
- 将该值添加到总和中。
- 将该值的平方添加到平方总和中。
- 将总和除以计数,存储为变量mean。
这种"在线"算法存在缺陷(例如,当sum_of_squares快速增长到超过整数范围或浮点精度时会出现精度问题),但它基本上可以给我需要的东西,而不必存储每个集合中的每个值。
但我不知道是否存在类似的技术来估计其他统计信息(中位数、众数、偏度、峰度)。我可以接受有偏估算器,甚至是在一定程度上牺牲准确性的方法,只要处理N个值所需的内存远远小于O(N)。
如果该库具有用于“在线”计算一个或多个这些操作的函数,则指向现有的统计库也将有所帮助。