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;

対数近似曲線