【发布时间】:2014-04-19 06:04:15
【问题描述】:
我想计算 perl 中每一行数字的方差。我写了这个子程序:
################################################################
# variance
#
#
# A subroutine to compute the variance of an array
# division by n-1 i s used
#
sub var{
my ($data) = @_;
if (@$data ==1) {
return 0;
}
my $mean = mean ($data);
my $sqtotal = 0;
foreach (@$data) {
$sqtotal += ($_ - $mean) ** 2
}
my $var = $sqtotal / (scalar @$data - 1);
return $var;
}
如果我给它这个包含 58 个相同数量元素的数组
[0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98, 0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98, 0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98,0.98]
计算结果是 1.25421964097639e-30。
我还尝试使用 Statistics::Descriptive 模块 (http://metacpan.org/pod/Statistics::Descriptive),它给了我 2.11916254524942e-15。
我也试过这个网站 (http://www.alcula.com/calculators/statistics/variance/),结果是 2.2438191655582E-15。
为什么结果不一样...
我本可以只使用该模块,但不知何故它对我的文件来说非常占用内存,该文件基本上由 58 个数字组成的百万行。我不确定为什么它会占用这么多内存。
有人能告诉我为什么我的计算给出了与模块不同的数字,以及如何使模块以更少的内存工作吗?内存密集型只是该模块的固有缺点吗?一些帖子似乎暗示了这一点。
谢谢!
【问题讨论】:
-
所有这些数字本质上都是零模浮点运算。而你自己的尝试似乎是最精确的。它看起来也会进行正确的计算,如果它也使用更少的内存,我建议你可以使用自己的子。编辑:哦,对不起,我现在才意识到我参加聚会有多晚。 ^^
标签: perl statistics variance