集合知プログラミングの復習(1)
最近まで「集合知プログラミング」という本を読んでいて先日ようやく読了。理解不能な部分もいくつかあったが要点はなんとか理解したつもり。そんなわけで、ちょっとずつ復習していく。
- 作者: Toby Segaran,當山仁健,鴨澤眞夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/07/25
- メディア: 大型本
- 購入: 83人 クリック: 2,121回
- この商品を含むブログ (266件) を見る
類似度を求める手法
全体を通じてのキモとなるのが、あるデータ同士がどれほど似ているかを調べる方法。
- ピアソン相関
- Tanimoto係数
- ユークリッド距離
など。これらの処理を実装した関数を作っておく。
たとえば以下のような各ユーザがいろいろな映画を評価したデータがあったとする。
メンバー名 | 大日本人 | ポニョ | トイストーリー |
---|---|---|---|
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])
とかけば、大日本人とポニョがどの程度似た映画であるのかがわかる、という感じ。
データを転回するだけで、別の対象についての類似度を測ることができてお得な感じがしますね。