Я играю на примере евклидова расстояния от программирования коллективного интеллекта книги,евклидова расстояния между столбами на основе тегов
# 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. Я не могу придумать, как применить эвклидову к моей ситуации?
что я menat принимает 2 сообщения обмениваются тегом (tag1) как единственный подобный тег. то (p1 [item] - p2 [item] для элемента в si) каждый элемент в si будет 0 нет? вызывающие теги - 0 или 1 в общем случае, все они 1, тогда 1 - 1 будет 0. –
Евклидовой код расстояния предназначен для вычисления сходства между двумя вещами, которые имеют числовую меру. Вы применяете это к тому, что не имеет числовой меры. Я бы использовал вариант идеи Азиза: я бы сравнил количество идентичных элементов с подсчетом уникальных элементов в обоих наборах. – hughdbrown