Artigo de Similaridade de cosseno na Wikipedia
Você pode mostrar os vetores aqui (em uma lista ou algo assim) e depois fazer as contas e vamos ver como funciona?
Eu sou um iniciante.
Artigo de Similaridade de cosseno na Wikipedia
Você pode mostrar os vetores aqui (em uma lista ou algo assim) e depois fazer as contas e vamos ver como funciona?
Eu sou um iniciante.
Respostas:
Aqui estão dois textos muito curtos para comparar:
Julie loves me more than Linda loves me
Jane likes me more than Julie loves me
Queremos saber quão semelhantes são esses textos, puramente em termos de contagem de palavras (e ignorando a ordem das palavras). Começamos fazendo uma lista das palavras dos dois textos:
Agora contamos o número de vezes que cada uma dessas palavras aparece em cada texto:
No entanto, não estamos interessados nas próprias palavras. Estamos interessados apenas nesses dois vetores verticais de contagens. Por exemplo, existem duas instâncias de 'eu' em cada texto. Vamos decidir o quão próximos esses dois textos estão um do outro, calculando uma função desses dois vetores, a saber, o cosseno do ângulo entre eles.
Os dois vetores são, novamente:
O cosseno do ângulo entre eles é de cerca de 0,822.
Esses vetores são 8-dimensionais. Uma virtude do uso da semelhança de cosseno é claramente o fato de converter uma questão que está além da capacidade humana de visualizar em uma que possa ser. Nesse caso, você pode pensar nisso como o ângulo de cerca de 35 graus, que é uma "distância" de zero ou concordância perfeita.
fonte
Suponho que você esteja mais interessado em obter algumas dicas sobre " por que " a semelhança de cosseno funciona (por que fornece uma boa indicação de semelhança), em vez de " como " é calculada (as operações específicas usadas para o cálculo). Se o seu interesse é no último, consulte a referência indicada por Daniel nesta postagem, bem como uma pergunta relacionada ao SO .
Para explicar o como e, mais ainda, o porquê, é útil, a princípio, simplificar o problema e trabalhar apenas em duas dimensões. Depois que você obtém isso em 2D, é mais fácil pensar em três dimensões e, é claro, mais difícil de imaginar em muitas outras dimensões, mas então podemos usar a álgebra linear para fazer os cálculos numéricos e também para nos ajudar a pensar em termos de linhas / vetores / "planos" / "esferas" em n dimensões, mesmo que não possamos desenhá-las.
Assim, em duas dimensões : com relação à semelhança do texto, isso significa que nos concentraremos em dois termos distintos, digamos as palavras "Londres" e "Paris" e contamos quantas vezes cada uma dessas palavras é encontrada em cada uma delas. os dois documentos que queremos comparar. Isso nos dá, para cada documento, um ponto no plano xy. Por exemplo, se o Doc1 tivesse Paris uma vez e Londres quatro vezes, um ponto em (1,4) apresentaria este documento (com relação a essa avaliação diminuta de documentos). Ou, falando em termos de vetores, este documento Doc1 seria uma seta que vai da origem ao ponto (1,4). Com esta imagem em mente, vamos pensar no que significa dois documentos serem semelhantes e como isso se relaciona com os vetores.
Documentos MUITO semelhantes (novamente com relação a esse conjunto limitado de dimensões) teriam o mesmo número de referências a Paris, e o mesmo número de referências a Londres, ou talvez, eles pudessem ter a mesma proporção dessas referências. Um Documento, Doc2, com 2 referências a Paris e 8 referências a Londres, também seria muito semelhante, apenas com talvez um texto mais longo ou de alguma forma mais repetitivo dos nomes das cidades, mas na mesma proporção. Talvez os dois documentos sejam guias sobre Londres, apenas fazendo referências passageiras a Paris (e como essa cidade não é legal ;-) Apenas brincando !!!.
Agora, documentos menos semelhantes também podem incluir referências às duas cidades, mas em proporções diferentes. Talvez o Doc2 cite apenas Paris uma vez e Londres sete vezes.
De volta ao nosso plano xy, se desenharmos esses documentos hipotéticos, veremos que quando eles são MUITO parecidos, seus vetores se sobrepõem (embora alguns vetores possam ser mais longos) e, quando começam a ter menos em comum, esses vetores começam a divergir, para ter um ângulo maior entre eles.
Ao medir o ângulo entre os vetores, podemos ter uma boa idéia de sua similaridade e, para tornar as coisas ainda mais fáceis, usando o cosseno desse ângulo, temos um bom valor de 0 a 1 ou -1 a 1 que é indicativo de essa semelhança, dependendo do que e como representamos. Quanto menor o ângulo, maior (mais próximo de 1) o valor do cosseno e também maior a semelhança.
No extremo, se o Doc1 citar apenas Paris e o Doc2 citar apenas Londres, os documentos não terão absolutamente nada em comum. Doc1 teria seu vetor no eixo x, Doc2 no eixo y, o ângulo 90 graus, cosseno 0. Nesse caso, diríamos que esses documentos são ortogonais entre si.
Adicionando dimensões :
com essa sensação intuitiva de similaridade expressa como um ângulo pequeno (ou cosseno grande), agora podemos imaginar coisas em 3 dimensões, digamos, trazendo a palavra "Amsterdã" para a mistura e visualizar muito bem como um documento com duas as referências a cada um teriam um vetor indo em uma direção específica, e podemos ver como essa direção se compara a um documento que cita Paris e Londres três vezes cada, mas não Amsterdã, etc. Como dito, podemos tentar imaginar a fantasia espaço para 10 ou 100 cidades. É difícil desenhar, mas fácil de conceituar.
Terminarei dizendo algumas palavras sobre a fórmula em si . Como eu disse, outras referências fornecem boas informações sobre os cálculos.
Primeiro em duas dimensões. A fórmula para o cosseno do ângulo entre dois vetores é derivada da diferença trigonométrica (entre o ângulo ae ângulo b):
Essa fórmula é muito semelhante à fórmula do produto escalar:
onde
cos(a)
corresponde aox
valor esin(a)
oy
valor, para o primeiro vector, etc. O único problema, é quex
,y
, etc, não são exactamente oscos
esin
valores, para estes valores necessitam de ser lido no círculo unitário. É aí que o denominador da fórmula entra em ação: dividindo pelo produto pelo comprimento desses vetores, as coordenadasx
ey
são normalizadas.fonte
Aqui está minha implementação em c #.
fonte
Por simplicidade, estou reduzindo o vetor aeb:
Então semelhança de cosseno (Theta):
então o inverso de cos 0,5 é 60 graus.
fonte
Este código Python é minha tentativa rápida e suja de implementar o algoritmo:
fonte
Usando o exemplo de Bill Bell, duas maneiras de fazer isso em [R]
ou aproveitando o desempenho do método crossprod () ...
fonte
Este é um
Python
código simples que implementa a similaridade de cosseno.fonte
fonte
Código JAVA simples para calcular a semelhança de cosseno
fonte
Dois vetores A e B existem em um espaço 2D ou 3D, o ângulo entre esses vetores é semelhança de cos.
Se o ângulo for maior (pode atingir no máximo 180 graus), que é Cos 180 = -1 e o ângulo mínimo é 0 grau. cos 0 = 1 implica que os vetores estão alinhados um com o outro e, portanto, os vetores são semelhantes.
cos 90 = 0 (o que é suficiente para concluir que os vetores A e B não são de todo semelhantes e, como a distância não pode ser negativa, os valores do cosseno serão de 0 a 1. Portanto, mais ângulo implica implica em reduzir a similaridade (visualizando também faz sentido)
fonte