distanza euclidea tra i messaggi in base a tag
-
18-09-2019 - |
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?
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.