2014/06/18(水)Perl Data Language 統計編 #11 「対数近似曲線を引く」
変数の個数xと計算時間yとの間に「y = b + a log_10 x」の関係があるときに、5個のデータで対数近似曲線を引く問題です。
「X = log_10 x」、「Y = y」とおいて「Y = b + aX」の形にすると解けます。
図は
- 青の点:データの散布
- 赤の折れ線:対数近似した折れ線
- 緑の曲線:対数近似した曲線
を表しています。
#!/usr/bin/env perl
use strict;
use warnings;
use feature qw/say/;
use PDL::Lite;
use PDL::Stats;
use PDL::Graphics::PLplot ();
use DDP filters => { -external => [ 'PDL' ] };
my $num_var = pdl [qw/10 50 100 500 1000/];
my $time = pdl [qw/7.2 8.5 9.1 10.3 11.0/];
my $pl = PDL::Graphics::PLplot->new(
DEV => 'pngcairo',
XLAB => '変数の個数',
XTICK => 100,
NXSUB => 1,
YLAB => '計算時間 (100ms)',
YTICK => 2,
NYSUB => 2,
BOX => [ 0, 1200, 0, 12 ],
);
$pl->xyplot($num_var, $time, PLOTTYPE => 'POINTS', COLOR => 'BLUE', SYMBOLSIZE => 2);
my $num_var_log10 = log($num_var) / log(10);
my %result = $time->ols($num_var_log10, { PLOT => 0 });
$pl->xyplot($num_var, $result{y_pred}, PLOTTYPE => 'LINE', COLOR => 'RED');
my ($a, $b) = $result{b}->list;
my $x = pdl [ 0 .. 1200 ];
my $y = $b + $a * log($x) / log(10);
$pl->xyplot($x, $y, PLOTTYPE => 'LINE', COLOR => 'GREEN');
$pl->close;