集合知プログラミング 2.10.1 Tanimoto係数

集合知プログラミング

集合知プログラミング

今回はエクササイズの中で簡単そうなものに挑戦してみました。
Tanimoto係数というもので、2つの集合の類似度を計る指標だそうです。

AとBの集合があった場合以下のような公式になります。
T = \frac {N_c}{(N_a + N_b - N_c)}
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オブジェクトでないと整除されてしまうようです。
今度調べてみたいと思います。