集合知プログラミングの復習(1)

最近まで「集合知プログラミング」という本を読んでいて先日ようやく読了。理解不能な部分もいくつかあったが要点はなんとか理解したつもり。そんなわけで、ちょっとずつ復習していく。

集合知プログラミング

集合知プログラミング

類似度を求める手法

全体を通じてのキモとなるのが、あるデータ同士がどれほど似ているかを調べる方法。

など。これらの処理を実装した関数を作っておく。
たとえば以下のような各ユーザがいろいろな映画を評価したデータがあったとする。

メンバー名 大日本人 ポニョ トイストーリー
taro 2 2 0
jiro 0 1 3
hanako 2 3 0

これは以下のようなデータとして表現する。

data = {
  :taro=>[2,2,0],
  :jiro=>[0,1,3],
  :hanako=>[2,3,0]
}

taroとjiroがどれくらい似ているかを求めるには、類似を求める関数にそれぞれのデータを渡せばよい。たとえばピアソン相関を使うのなら以下のように記述。

sim = pearson(data[:taro], data[:jiro])

こんな感じですべてのメンバーの組み合わせについて処理を行えば、それぞれのメンバー同士がどれくらい似ているかわかる。
ちょっと面白いのは、元データを転回して同じように相関関数を呼べば、今度はそれぞれの映画同士がどれくらい似ているかを求めることができるという点。

映画名 taro jiro hanako
大日本人 2 0 2
ポニョ 2 1 3
トイストーリー 0 3 0

こんな感じに転回するような関数をひとつ書いて、

date = {
  :dainihonjin=>[2,0,2],
  :ponyo=>[2,1,3],
  :toystory=>[0,3,0]
}

というデータに変換できれば、あとはさっきと同じ関数を使って

sim = pearson(data[:dainihonjin], data[:ponyo])

とかけば、大日本人とポニョがどの程度似た映画であるのかがわかる、という感じ。
データを転回するだけで、別の対象についての類似度を測ることができてお得な感じがしますね。