2016-03-23 12 views
1

比較する範囲の最大値と最小値を定義するにはどうすればよいですか?たとえば、シェーンの次のムービーの評価があります。 [5,5,5,5,5,5,5]とJayceeによる評価のリスト。 [1,1,1,1,1,1]、彼らは5つ星からです。これらは辞書からの.values()であり、ムービーは各リストの順番です。それは5と1の間、これが行われるだろうかだとして、それは、おそらく、比率の低い終わり近く周りに0.5であるべきとき範囲内の番号リスト間の類似度は?

from math import * 

def square_rooted(x): 

    return round(sqrt(sum([a*a for a in x])),3) 

def cosine_similarity(x,y): 

    numerator = sum(a*b for a,b in zip(x,y)) 
    denominator = square_rooted(x)*square_rooted(y) 
    return round(numerator/float(denominator),3) 

print cosine_similarity([5, 5, 5, 5, 5, 5, 5], [1, 1, 1, 1, 1, 1, 1]) 

出力は1.0:

次の機能を使用して

?あなたの例から

答えて

1

numerator = 5*1*7 = 35 

そして

denominator = sqrt(5*5*7) * sqrt(1*1*7) = 5 * sqrt(7) * sqrt(7) = 35 

あなたが1.0を得た理由は、あなたがコサイン類似式を考えれば、これは理にかなって:

a.b = ||a|| ||b|| cos (theta) 

。なお、 [5, 5, ..., 5][1, 1, ..., 1]の2つのベクトルポイントがあるためですと全く同じ方向に7次元の座標で表示されます。従って、それは1.0であるマッチングコサイン類似度を有する。 cos(theta)は1.0です。

+0

次に、数字の類似性に基づいて0.0〜1.0の出力を正確に与える別の方法がありますか? –

+0

ええと、それはあなたが "類似性"を意味するかどうかにかかっています...しかし、あなたが望むのは方向性から独立した類似性です。あなたの価値の類似性を実際にどのように行動させたいですか? – Ian

+0

数字の違いに基づいて類似度評価を考えていましたが、比率が高いほど、類似度が高いほど –