1

私は、プログラミング集団知能の本のユークリッド距離の例で遊んでいます。


# 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に落ちました。自分の状況にユークリッド距離を適用する方法が思いつきませんか?

4

2 に答える 2

1

さて、最初に、あなたのコードは不完全に見えます:私はあなたの関数からのリターンが1つだけ見られます。私はあなたがこのような何かを意味すると思います:

def sim_distance(prefs, person1, person2): 
  # Get the list of shared_items
  p1, p2 = prefs[person1], prefs[person2]
  si = set(p1).intersection(set(p2))

  # Add up the squares of all the differences 
  matches = (p1[item] - p2[item] for item in si)
  return sum(a * a for a in matches) 

次に、わかりやすくするために投稿を少し編集する必要があります。これが何を意味するのかわかりません。「これは0になります。これは、タグに重みがないため、同じタグのランクが1になるためです。」

最後に、とのサンプルデータを提供すると役立ちprefs[person1]ますprefs[person2]。次に、何を取得しているのか、何を期待しているのかを知ることができます。

編集:以下の私のコメントに基づいて、私は次のようなコードを使用します:

def sim_distance(prefs, person1, person2):
    p1, p2 = prefs[person1], prefs[person2]
    s, t = set(p1), set(p2)
    return len(s.intersection(t)) / len(s.union(t))
于 2009-12-09T23:48:59.267 に答える
1

基本的に、タグには重みがなく、数値で表すことはできません。したがって、2つのタグ間の距離を定義することはできません。

タグを使用して2つの投稿間の類似性を見つけたい場合は、類似したタグの比率を使用することをお勧めします。たとえば、

url1 -> tag1 tag2 tag3 tag4
url2 -> tag1 tag4 tag5 tag6

次に、を表す2つの同様のタグがあります2 (similar tags) / 4 (total tags) = 0.5。投稿ごとに2つ以上のタグがある限り、これは類似性の適切な測定値になると思います。

于 2009-12-09T23:50:52.820 に答える