作者: dune
日時: 2002/4/27(23:15)
極悪です。発言がないのでゴミ撒き。

nifty.fgalts.mes.06:4869 の続き。

x = { 1       2     3      4      5      6       7       8 }
y = {252    431    591    717    855    959    1070    1148}

というデータから、最小自乗法でべき乗回帰曲線を求めます。
Statistics::Descriptive を使うと回帰曲線のほかにも分散や
中央値が求められます。ただしデータを全てメモリ上に持つ
ようなので、データ数が多い場合はこのモジュールを使わずに
自分で計算したほうが良さそうです。



|#!/usr/local/bin/perl
|
|use strict;
|my @x  = ( 1,  2,  3,  4,  5,  6,   7,   8);
|my @y  = (252,431,591,717,855,959,1070,1148);
|
|use Statistics::Descriptive;
|
|my $stat   = Statistics::Descriptive::Full->new();
|$stat->add_data(@y);
|my($a,$b,$r,$e)    = $stat->least_squares_fit();
|printf("y = (%+6.2lf) + (%+6.2lf) * x\t(err = %6.2lf)\n",$a,$b,$e);
|
|my $stat   = Statistics::Descriptive::Full->new();
|$stat->add_data(map(log,@y));
|my($loga,$b,$r,$e) = $stat->least_squares_fit(map(log,@x));
|my $a  = exp($loga);
|printf("y = (%+6.2lf) * x ^ (%+6.2lf)\t(err = %6.2lf)\n",$a,$b,$e);
|
|__END__



実行すると

|%perl least_squares_fit.pl
|y = (+179.18) + (+127.49) * x   (err =  11.82)
|y = (+257.61) * x ^ ( +0.73)    (err =   0.01)
|
|%

という結果が出ます。
-- 
FZH01112@..., http://www1.u-netsurf.ne.jp/~dune/