集合知プログラミング 第2章 エクササイズ

ということで2.10の「1.Tanimoto係数」を定義に従って書いてみる。

二値変数 - 情報論的学習理論と機械学習の「朱鷺の杜Wiki」

学生時代からお世話になってる朱鷺の杜Wikiから見ると「Jaccard係数」が当てはまるみたい。a_{11}a_{10}a_{10}それぞれの意味はリンク先参照。


\frac{a_{11}}{a_{01}+a_{10}+a_{11}}

"""
 tanimoto係数
 indicatingな二値変数
 ある性質をモツか持たないかを2つの変数の間で
 ・ある性質を持つ・・・1
 ・持たない   ・・・0

 とした場合、2つの2値変数が両方とも1である場合、両方とも0である場合より
 類似していると符号化する

 → 今回の場合は映画を見たか見ていないか?で2つの変数、つまり
   2ユーザ間の距離を測る
"""
def sim_tanimoto(prefs,p1,p2):
    a11 = 0
    a10 = 0
    a01 = 0
    for item in prefs[p1]:
        if item in prefs[p2]:
            a11+=1
        else:
            a10+=1

    for item in prefs[p2]:
        if item not in pairBit:
            a01+=1
    
    print "a11 = %d / a10 = %d / a01 = %d" % (a11,a10,a01)

    sim = float(a11)/(a10+a01+a11)

    return sim