stMind

about Tech, Computer vision and Machine learning

perl de 集合知プログラミング(3)

2.3.4 評者をランキングする

今日は2.3.4節を実装してみました。指定したユーザに最もマッチするユーザを求めるtopMathcesサブルーチンを作りました。topMatchesは、データセットとユーザ名に加えて、結果の数と類似性スコアを求める関数(のリファレンス)を受け取り、スコアの高い順に並んだ配列(ハッシュの配列)を返すようにしています。

出来たもの

topMatchesは以下のようになりました。

# personに最もマッチするトップn人を返す
sub topMatches {
    my ($prefs, $person, $n, $similarity) = @_;

    # person以外のユーザとのスコア算出
    my %scores = ();
    foreach my $user (keys %{ $prefs }) {
	if ($user ne $person) {
	    $scores{$user} = &$similarity($prefs, $person, $user);
	}
    }

    # スコアが高い順にソートする
    my @sortedscores = ();
    foreach my $user (sort {$scores{$b} <=> $scores{$a}} keys %scores) {
	my $h = {
	    $user => $scores{$user}
	};
	push(@sortedscores, $h);
    }
    
    # トップn人を返す
    my @result = ();
    for (my $i=0; $i<$n; $i++) {
	push(@result, $sortedscores[$i]);
    }
    
    return @result;
}

標準入力からユーザと結果の数を与えると、マッチするユーザとそのスコアを得ることが出来ます。

Enter person1 ==> Toby
Enter num of match persons ==> 3
Match Persons:
	Lisa Rose	 : 0.99124070716193
	Mick LaSalle	 : 0.924473451641905
	Claudia Puig	 : 0.893405147441564

今回は、類似性スコアを求める関数を指定して、ランキングになったユーザ名とスコアのペアを出力するということで、ハッシュの配列やサブルーチンのリファレンスを使ってみました。

コード置き場

これまでの部分も含んだソースコードをgistに置いております。
gist: 489178 - GitHub