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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top