2009-12-09 11 views
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. Я не могу придумать, как применить эвклидову к моей ситуации?

ответ

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]. Тогда вы могли бы рассказать, что вы получаете и чего ожидаете получить.

Edit: основываясь на мой комментарий ниже, я хотел бы использовать такой код:

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)) 
+0

что я menat принимает 2 сообщения обмениваются тегом (tag1) как единственный подобный тег. то (p1 [item] - p2 [item] для элемента в si) каждый элемент в si будет 0 нет? вызывающие теги - 0 или 1 в общем случае, все они 1, тогда 1 - 1 будет 0. –

+0

Евклидовой код расстояния предназначен для вычисления сходства между двумя вещами, которые имеют числовую меру. Вы применяете это к тому, что не имеет числовой меры. Я бы использовал вариант идеи Азиза: я бы сравнил количество идентичных элементов с подсчетом уникальных элементов в обоих наборах. – hughdbrown

1

В принципе, теги не имеют веса и не могут быть представлены числовыми значениями. Таким образом, вы не можете определить расстояние между двумя тегами.

Если вы хотите найти сходство между двумя сообщениями, используя их теги, я бы предположил, что вы используете соотношение похожих тегов. Например, если у вас есть

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

, то у вас есть 2 схожие теги, представляющие 2 (similar tags)/4 (total tags) = 0.5. Я думаю, что это будет хорошим измерением для сходства, если у вас более двух тегов за сообщение.

 Смежные вопросы

  • Нет связанных вопросов^_^