distância euclidiana entre mensagens com base em tags
-
18-09-2019 - |
Pergunta
Eu estou jogando com o exemplo distância euclidiana de programação livro inteligência coletiva,
# 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]])
este é o código original para o ranking críticos de cinema, eu estou tentando modificar este para encontrar mensagens semelhantes, com base em tags i construir um mapa, como,
url1 - > tag1 tag2
url2 - > tag1 tag3
mas se aplicar este para a função,
pow(prefs[person1][item]-prefs[person2][item],2)
isso se torna 0 causam marcas não têm peso mesmas marcas tem um ranking 1. Eu modifiquei o código para criar manualmente a diferença para teste,
pow(prefs[1,2)
então eu tenho um monte de 0,5 semelhança, mas semelhança do mesmo post para que eu é caiu para 0,3. Eu não consigo pensar em uma maneira de aplicar distância euclidiana à minha situação?
Solução
Ok, em primeiro lugar, o seu código parece incompleto: Vejo apenas um retorno de sua função. Acho que algo média como este:
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)
Em seguida, seu post precisa de um pouco de editar para maior clareza. Eu não sei o que isso significa: "isso se torna 0 causam marcas não têm peso mesmas marcas tem ranking 1"
Por fim, ele iria ajudar se você tiver fornecido dados de exemplo para prefs[person1]
e prefs[person2]
. Então você poderia dizer que você está recebendo eo que você espera para chegar.
Edit: com base no meu comentário abaixo, gostaria de usar um código como este:
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))
Outras dicas
Basicamente, as marcas não têm pesos e não podem ser representados por valores numéricos. Então você não pode definir uma distância entre dois tags.
Se você quiser encontrar a semelhança entre dois postes usando suas marcas, gostaria de sugerir que você use a proporção de tag similar. Por exemplo, se você tiver
url1 -> tag1 tag2 tag3 tag4
url2 -> tag1 tag4 tag5 tag6
então você tem 2 tags semelhantes, representando 2 (similar tags) / 4 (total tags) = 0.5
. Eu acho que isso representaria uma medida boa para similaridade, contanto que você tem mais de 2 tags per post.