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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top