distancia euclídea entre los mensajes basado en etiquetas
-
18-09-2019 - |
Pregunta
Estoy jugando con el ejemplo de la distancia euclidiana de la guía de programación de inteligencia colectiva,
# 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 es el código original para el ranking de los críticos de cine, estoy tratando de modificar esto para encontrar puestos similares, basado en etiquetas que construyo un mapa como,
url1 - > tag1 tag2
url2 - > tag1 tag3
pero si aplicar esto a la función,
pow(prefs[person1][item]-prefs[person2][item],2)
0 esto se convierte en causa etiquetas no tienen peso mismas etiquetas tiene rango 1. He modificado el código para crear manualmente una diferencia para poner a prueba,
pow(prefs[1,2)
Luego me dieron un montón de 0,5 similitud, pero la similitud del mismo puesto a si mismo se deja caer hasta 0,3. No puedo pensar en una manera de aplicar la distancia euclidiana a mi situación?
Solución
Bueno, en primer lugar, su código es incompleta: sólo veo una vuelta de su función. Creo que quieres decir algo como esto:
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)
A continuación, el mensaje necesita un poco de edición para mayor claridad. No sé lo que esto significa: "esto se convierte en 0 causa etiquetas no tienen peso mismas etiquetas tiene rango 1"
Por último, sería de ayuda si ya ha proporcionado datos de ejemplo para prefs[person1]
y prefs[person2]
. Posteriormente, se podría decir lo que está recibiendo y lo que espera conseguir.
Editar: se basa en mi comentario a continuación, me gustaría utilizar 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))
Otros consejos
Básicamente, las etiquetas no tienen pesos y no pueden ser representados por valores numéricos. Así no se puede definir una distancia entre dos etiquetas.
Si usted quiere encontrar la similitud entre dos postes con sus etiquetas, sugeriría que utilice la proporción de etiquetas similar. Por ejemplo, si usted tiene
url1 -> tag1 tag2 tag3 tag4
url2 -> tag1 tag4 tag5 tag6
A continuación, usted tiene 2 etiquetas similares, lo que representa 2 (similar tags) / 4 (total tags) = 0.5
. Creo que esto representaría una buena medida de la semejanza, siempre y cuando usted tiene más de 2 etiquetas por puesto.