Domanda

sto giocando con l'esempio la distanza euclidea da programmare libro intelligenza collettiva,


# 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]]) 

Questo è il codice originale per il ranking critici cinematografici, sto cercando di modificare questo per trovare i messaggi simili, sulla base di tag costruisco una mappa come ad esempio,

url1 - > tag1 tag2
url2 - > tag1 tag3

, ma se applicare questo alla funzione,

pow(prefs[person1][item]-prefs[person2][item],2) 

questo diventa 0 causa tag non hanno peso stessi tag ha rango 1. Ho modificato il codice per creare manualmente una differenza di testare,

pow(prefs[1,2) 

Poi ho avuto un sacco di 0,5 somiglianza, ma la somiglianza dello stesso post per sé è sceso al 0,3. Non riesco a pensare a un modo per applicare la distanza euclidea alla mia situazione?

È stato utile?

Soluzione

Va bene, prima di tutto, il codice sia incompleta: Vedo solo un ritorno dalla vostra funzione. Credo che si intende qualcosa di simile:

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) 

Quindi, il tuo post ha bisogno di un po 'di editing per chiarezza. Non so che cosa significhi: "Questo diventa 0 causa tag non hanno peso stessi tag ha ranking 1"

Infine, sarebbe utile se hai fornito i dati di esempio per prefs[person1] e prefs[person2]. Quindi si potrebbe dire che cosa hai trovato e che cosa si aspetta di ottenere.

Edit: in base alla mia commento qui sotto, vorrei utilizzare il codice come questo:

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

Altri suggerimenti

In sostanza, i tag non hanno pesi e non possono essere rappresentati da valori numerici. Così non si può definire una distanza tra i due tag.

Se si vuole trovare la somiglianza tra due messaggi che utilizzano i loro tag, vorrei suggerire di utilizzare il rapporto di tag simili. Ad esempio, se si dispone di

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

, allora si hanno 2 tag simili, che rappresenta 2 (similar tags) / 4 (total tags) = 0.5. Penso che questo rappresenterebbe una buona misura per similitudine, fino a quando si dispone di più di 2 etichette per posta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top