先程のエントリのオマケ。
Statistics::Basicという pure perlな統計計算moduleもありますが、IEEE754やメモリ使用量を考えると、GSL を xs でwrapしたMath::GSLの方が良い気がします。
Math::GSL::Interp - search.cpan.org
GSL - GNU Scientific Library - GNU Project - Free Software Foundation (FSF)
GSL reference manual Japanese translation
ビッグデータや機械学習等が、流行り言葉な最近ですが、まずは、この辺りから計算機での算法を理解しましょう。
#!/usr/local/bin/perl use strict; use warnings; use utf8; use Encode; use Data::Dumper; use Math::GSL::Heapsort qw /:all/; use Math::GSL::Sort qw/:all/; use Math::GSL::Statistics qw /:all/; main(); sub main { my $ret_val; my $data = [17.2, 18.1, 16.5, 15.5, 18.3, 12.6]; my $list_size = scalar(@$data); ## 平均 #stride: データの刻み幅(配列中の要素を何個おきに読むか) $ret_val = gsl_stats_mean($data, 1, #stride $list_size); #data size print encode('utf8',"平均: $ret_val\n"); ## 分散 $ret_val = gsl_stats_variance($data, 1, $list_size); print encode('utf8', "分散: $ret_val\n"); ## 標準偏差 $ret_val = gsl_stats_sd($data, 1, $list_size); print encode('utf8', "標準偏差: $ret_val\n"); ##※分散や標準偏差では、予め平均値を渡すことも可能 ## gsl_stats_variance_m() , gsl_stats_sd_m() ## 最大 $ret_val = gsl_stats_max($data, 1, $list_size); print encode('utf8', "最大: $ret_val\n"); ## 最小 $ret_val = gsl_stats_min($data, 1, $list_size); print encode('utf8', "最小: $ret_val\n"); ## ソート $ret_val = gsl_sort($data, 1, $list_size); print encode('utf8', "ソート: "), join(' ', @$ret_val),"\n"; ## 中央値 $ret_val = gsl_stats_median_from_sorted_data($ret_val, 1, $list_size); print encode('utf8', "中央値(要ソート済): $ret_val\n"); } 1; __END__
↑と書くと、↓と実行できます
$ ./foo.pl 平均: 16.3666666666667 分散: 4.47866666666667 標準偏差: 2.11628605501871 最大: 18.3 最小: 12.6 ソート: 12.6 15.5 16.5 17.2 18.1 18.3 中央値(要ソート済): 16.85