是否有一种算法可以估计一组值的中值、众数、偏度和/或峰度,但这不需要一次将所有值存储在内存中?
我想计算基本统计数据:
- 平均值:算术平均值
- 方差:与平均值的平方偏差的平均值
- 标准差:方差的平方根
- 中位数:将较大一半的数字与较小的一半分开的值
- 模式:在集合中找到的最频繁的值
- 偏度: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),我就可以使用有偏差的估计器,甚至可以使用在一定程度上损害准确性的方法。
如果该库具有“在线”计算这些操作中的一个或多个的功能,那么将我指向现有的统计库也会有所帮助。