私は、プログラミング集団知能の本のユークリッド距離の例で遊んでいます。
# Returns a distance-based similarity score for person1 and person2
def sim_distance(prefs,person1,person2):
# Get the list of shared_items
si={}
for item in prefs[person1]:
if item in prefs[person2]:
si[item]=1
# if they have no ratings in common, return 0
if len(si)==0: return 0
# Add up the squares of all the differences
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
これは、映画評論家をランク付けするための元のコードです。これを変更して、タグに基づいて同様の投稿を見つけようとしています。次のようなマップを作成します。
url1 - > tag1 tag2
url2 - > tag1 tag3
しかし、これを関数に適用すると、
pow(prefs[person1][item]-prefs[person2][item],2)
これは 0 になり、タグには重みがありません。同じタグにはランキング 1 があります。コードを変更して手動で違いを作成し、テストしました。
pow(prefs[1,2)
それから私は0.5の類似度をたくさん得ましたが、それ自身への同じ投稿の類似度は0.3に落ちました。自分の状況にユークリッド距離を適用する方法が思いつきませんか?