perl - 内存高效的统计分布模块

标签 perl statistics

我想分析一些数据(例如,Web 服务响应时间)并获取各种统计信息,主要是百分位数/分位数和突出值的存在。

我知道Statistics::Descriptive ,但是,我不想将所有数据存储在内存中。另一方面,将我的结果降低几个百分点就可以了,我只关心巨大的差异。

所以我想出了以下想法:创建一个对数存储桶数组,并计算每个存储桶中的数据点。将数据分布在 6 个数量级并保证 1% 的精度仍然让我得到 6 * log 10 / log 1.01 =~ 1400 buckets 非常好(36 kb 的内存,给定当前 Perl 的标量大小)。

计算百分位数很简单 - 只需将存储桶计数器相加,直到 $sum超过 $percentage * $total_count .

但是,在我开始编写实际代码之前,我想问一下已经存在哪些内存高效统计模块(用于 Perl)和算法。

我找到了这个 question ,并且在其中一个答案中提出了类似的方法。不过,还没有找到现成的 Perl 实现。

这是此 Perlmonks question 的略微编辑版本.

最佳答案

由于到目前为止我的搜索不成功,我已经开始了一个新模块 Statistics::Descriptive::LogScale .希望它会有所帮助。

一般遵循Statistics::Descriptive::Full的API , 有几个小的补充(比如增加了任意权力的中心和标准化时刻)。我还计划仔细研究 Statistics::Descriptive::Weighted .

#!/usr/bin/perl -w

use strict;
use Statistics::Descriptive::LogScale;

my $stat = Statistics::Descriptive::LogScale->new ();
while(<>) { 
    $stat->add_data(m/(-?\d+(?:\.\d*))/g);
};

# This can also be done in O(1) memory, precisely
printf "Average: %f +- %f\n", 
    $stat->mean, $stat->standard_deviation;

# This requires storing actual data, or approximating
foreach (0.5, 1, 5, 10, 25, 50, 75, 90, 95, 99, 99.5) {
    printf "Percentile($_): %f\n", $stat->percentile($_);
};

关于perl - 内存高效的统计分布模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022174/

相关文章:

perl - 如何规范化 Perl 函数参数以进行记忆化?

statistics - DistributionFitTest[] 用于 Mathematica 中的自定义分布

java - NCAA 2011/12 男子篮球队和球员统计数据的 API

python - 为什么perl,ruby使用/dev/urandom

perl - Perl 的 lib pragma 是如何工作的?

linux - OCIEnvNlsCreate 错误。检查 ORACLE_HOME (Linux) env var 或 PATH (Windows) 和/或 NLS 设置、权限等

perl - 如何使用 Mojo::UserAgent 发出 Oauth 授权的请求?

numpy - Python 中 cor.test 的 R 等价物

r - 使用变量作为 R 中的列名拟合 glm

python - 属性错误 : '_process_plot_var_args' object has no attribute 'get_next_color'