end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

Math::GSL ( GNU Scientific Library ) for perl による基礎的統計計算

先程のエントリのオマケ。
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