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