ola*_*ala 3 statistics perl variance
我想计算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;
}
Run Code Online (Sandbox Code Playgroud)
如果我给它这个数组有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个数字组成.我不确定为什么它消耗了这么多内存.
有人能告诉我为什么我的计算给出了与模块不同的数字,以及如何使模块以更少的内存工作?内存密集的东西只是该模块的固有缺点.几个帖子似乎暗示了这一点.
谢谢!
常数序列的方差为零,因此您的计算或多或少都是正确的,并且或多或少都相同.
您得到的结果略微不同于零,因为您正在使用有限精度浮点数执行许多操作.我们来看看这段代码:
$z = 0;
$z += 0.98 for 1..58;
$mean = $z / 58;
printf "%.20f", $mean;
Run Code Online (Sandbox Code Playgroud)
使用此代码,我们取58个数字0.98的总和,然后将总和除以58.这个代码打印出来是有道理的0.98000000000000000000,对吧?不,我真正得到的是
0.97999999999999887201
Run Code Online (Sandbox Code Playgroud)
(你的结果可能会有所不同).
每个程序员应该知道的关于浮点运算的规范可以向你解释血淋淋的细节.