从数据子集计算平均值和方差的在线算法

Posted

技术标签:

【中文标题】从数据子集计算平均值和方差的在线算法【英文标题】:Online algorithm for computing average and variance from a subset of data 【发布时间】:2014-09-20 02:43:13 【问题描述】:

我将此作为在线计算可变长度数据数组的方差和均值的参考:http://www.johndcook.com/standard_deviation.html

数据是一组 16 位无符号值,可以有任意数量的样本(实际上,最小值约为 20 个样本,最大约为 2e32 个样本。

由于数据集可能太大而无法存储,我已经使用上面提到的 C 在线算法实现了这一点,并验证了它的计算是否正确。

问题始于对应用程序的以下要求:除了计算整个集合的方差和均值外,我还需要为中间 50% 的总体计算一个分离的结果(均值和方差)值,即忽略样本的前 25% 和后 25%。事先不知道样本的数量,所以我必须在线计算附加集。

我知道我可以通过单独计算一个子集来添加和减去一个子集,它们使用类似于此处描述的 operator+ 实现:http://www.johndcook.com/skewness_kurtosis.html(减去偏度和峰度细节,我对此没有用处)。减法可以由此推导出来。

问题是:如何维护这些子集?还是我应该尝试另一种技术?

【问题讨论】:

一个问题是,即使知道 25% 和 75% 是什么也非常困难/复杂。 AFAIK,没有简单的分位数估计在线算法有很好的保证。 【参考方案1】:

如果空间是一个问题,并且您很乐意接受一个近似值,我将从以下论文中的算法开始:

M Greenwald, S Khanna, Space-Efficient Online Computation of Quantile Summaries

您可以使用该算法计算到目前为止所见观察值的第 25 和第 75 个百分位数的运行估计值。然后,您可以将落在两个百分位数之间的观察结果输入 John D Cook 的文章中介绍的 Welford 算法,以计算运行均值和方差。

【讨论】:

一个近似值就足够了,但我不知道如何喂食(你解释的最后部分)。 @AlexandrePereiraNunes:你删除小于 25% 和大于 75% 的所有内容,然后计算其他所有内容的运行均值和标准差。 我需要计算所有采集样本的第二和第三季度,即如果我捕获了 1000 个样本,我需要计算 250 到 750 之间所有样本的平均值和标准差。我可以'没有存储足够的样本(假设 1000 最终可能是 1e32)以在第二遍中计算它。我对您的建议的理解是,我最终会计算大多数样本的中间 50%,甚至是整个集合开始和结束的样本,而这些是我想忽略的。不确定我是否说清楚了,也不确定我是否理解您所说的。 @AlexandrePereiraNunes:正如我所说,这是一个近似值。如果您需要确切的答案,则需要存储整个集合。为此,您可以利用您的数据只能包含 65,536 个不同值的事实,并计算您看到的每个值有多少,这是一种计数排序 (en.wikipedia.org/wiki/Counting_sort)。 我认为一个近似值就足够了,但我只是不明白你的意思:你是否建议我在我的兴趣领域中取相同数量的百分位数并计算(估计的)平均值和标准偏差他们?如果是这样,他们感谢,因为我想这已经足够了,至少只要我能控制错误,正如你指出的论文所建议的那样。

以上是关于从数据子集计算平均值和方差的在线算法的主要内容,如果未能解决你的问题,请参考以下文章

在线统计 Python:方差计算不正确

用于估计统计中位数、众数、偏度、峰度的“在线”(迭代器)算法?

R语言vtreat包自动处理dataframe的缺失值计算数据列的均值和方差并基于均值和方差信息对数据列进行标准化缩放计算所有数据列的均值和方差对所有数据列进行标准化缩放

用C语言如何算平均数和方差及标准差

降维之pca算法

如何用matlab计算样本均值和方差