集合知プログラミング 2.10.1 Tanimoto係数
- 作者: Toby Segaran,當山仁健,鴨澤眞夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2008/07/25
- メディア: 大型本
- 購入: 91人 クリック: 2,220回
- この商品を含むブログ (275件) を見る
今回はエクササイズの中で簡単そうなものに挑戦してみました。
Tanimoto係数というもので、2つの集合の類似度を計る指標だそうです。
AとBの集合があった場合以下のような公式になります。
T:Tanimoto係数 Na:Aのアイテム数 Nb:Bのアイテム数 Nc:共通集合
こちらに簡単な解説が載っていました。
計れないものを計る!
http://blog.pasonatech.co.jp/sugiura/8279
データセットは前回と同じものを使います。
module Recommendations #tanimoto係数 def self.tanimoto(prefs, p1, p2) # 両者が互いに評価しているアイテムのリストを得る si = prefs[p1].keys & prefs[p2].keys # 共に評価しているアイテムがなければ0を返す if si.empty? return 0.0 end # 要素の数を調べる na = prefs[p1].length nb = prefs[p2].length nc = si.length.to_f #Tanimono係数を求める tanimo = nc / (na+nb-nc) return tanimo end end
実行は同じくirbを使いました。
$ irb
irb(main):001:0> load 'recommendations.rb'
=> true
irb(main):002:0> Recommendations.sim_manhattan($critics, 'Lisa Rose', 'Gene Seymour')
=> 1
irb(main):003:0> Recommendations.tanimoto($critics, 'Lisa Rose', 'Toby')
=> 0.5
Rubyの除算は、少なくとも片方がFloatオブジェクトでないと整除されてしまうようです。
今度調べてみたいと思います。