gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:52:35 25 4
gpt4 key购买 nike

我想分析一些数据(例如,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com