Comment detail

PageRankの計算 (Nested Flatten)

PDLで楽勝と思いきや、PDL::eigens()がasymmetric matricesをサポートしていないというショボーンな結果に。他にもいろいろ探して、自前eigen()を実装しようかと思いきや。Inline::Octaveなんちゅう超ど真ん中ストライクなものが! おかげで超楽勝。なにせPageRank計算部分はGoogle の秘密 - PageRank 徹底解説モロままだけど、Inline::Octave見つけるまでに遠回りし過ぎ。

Dan the Inline::Hacker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/local/bin/perl
use strict;
use warnings;
use Inline Octave => 'DATA';

sub links2matrix{
    my $table = shift;
    my $dim = @$table;
    my $mat = [];
    $mat->[$_] = [(0) x $dim] for (0..$dim-1);
    for my $i (0..@$table-1){
        my $nlinks = scalar @{$table->[$i]};
        $mat->[$_-1][$i] = 1/$nlinks for (@{$table->[$i]});
    }
    $mat;
}

my $m = Inline::Octave->new(
    links2matrix(
        [
            [ 2, 3, 4, 5, 7 ],
            [ 1],
            [ 1, 2 ],
            [ 2, 3, 5 ],
            [ 1, 3, 4, 6 ],
            [ 1, 5 ], [5],
        ]
    )
);
local $\ = "\n";
print "Matrix:";
print $m->disp();
print "Pagerank:";
print pagerank($m)->disp();
__DATA__
__Octave__
function p=pagerank(m);
[v,d] = eig(m);
ev = v(:, find(abs(diag(d)) == max(abs(diag(d)))));
p = ev ./ norm(ev, 1);
endfunction

Index

Feed

Other

Link

Pathtraq

loading...