ピアソン相関
ピアソン相関係数を使った類似度
AさんとBさんがX,Yという映画を評価した場合、次のような点数になったとします。
- | A | B |
X | 80 | 40 |
Y | 60 | 30 |
この場合、AさんもBさんもYよりもXという映画のほうが好きだという点で類似しています。
高いスコアをつける傾向がある人や低いスコアをつける傾向がある人がたくさんいる、データが正規化されていない状態でも有用なデータを得やすいと言えます。
サンプルコード
前回作成したrecommendations.pyにsim_pearsonというメソッドを追加します
def sim_pearson(prefs, p1, p2): ### 二人がともに評価している映画をさがす si={} for item in prefs[p1]: if item in prefs[p2]: si[item]=1 ### 二人がともに評価している映画がなければ0を返す n=len(si) if n==0: return 0 ### 対象となる映画を評価している点数を合計する sum1=sum([prefs[p1][it] for it in si]) sum2=sum([prefs[p2][it] for it in si]) ### 平方を求めて合計しておく sum1Sq=sum([pow(prefs[p1][it],2) for it in si]) sum2Sq=sum([pow(prefs[p2][it],2) for it in si]) ### 積を合計する pSum=sum([prefs[p1][it]*prefs[p2][it] for it in si]) ### スコアを計算 num=pSum-(sum1*sum2/n) den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n)) if den==0: return 0 r=num/den
実行
>>> import recommendations >>> print recommendations.sim_pearson(recommendations.critics, 'Lisa Rose', 'Gene Seymour') 0.396059017191
Lisa RoseとGene Seymourの二人がともに評価している映画をさがします。
それぞれの評点の合計と、平方の合計を算出します。
これらの変化の程度の積を割ることでどの程度の変化がおきているのかを求めています。