similitud example distancia coseno calculo vector distance euclidean-distance cosine

vector - example - similitud coseno formula



Modelo de espacio vectorial: similitud coseno vs distancia euclidiana (3)

Tengo corpora de texto clasificado. De estos creo vectores. Cada vector corresponde a un documento. Los componentes de vectores son pesos de palabras en este documento calculados como valores de TFIDF. A continuación, construyo un modelo en el que cada clase se presenta con un solo vector. El modelo tiene tantos vectores como clases en el corpus. El componente de un vector modelo se calcula como la media de todos los valores componentes tomados de los vectores en esta clase. Para los vectores no clasificados, determino la similitud con un vector modelo al calcular el coseno entre estos vectores.

Preguntas:

1) ¿Puedo usar la distancia euclidiana entre el vector no clasificado y el modelo para calcular su similitud?

2) ¿Por qué la distancia euclidiana no puede usarse como medida de similitud en lugar de coseno de ángulo entre dos vectores y viceversa?

¡Gracias!


Responderé las preguntas en orden inverso. Para su segunda pregunta, la similitud del coseno y la distancia euclidiana son dos formas diferentes de medir la similitud del vector. El primero mide la similitud de los vectores con respecto al origen, mientras que el segundo mide la distancia entre puntos particulares de interés a lo largo del vector. Puede usarlos de forma aislada, combinarlos y usar ambos, o ver una de muchas otras maneras de determinar la similitud. Vea these diapositivas de una conferencia de Michael Collins para más información.

Su primera pregunta no es muy clara, pero debería poder usar cualquier medida para encontrar una distancia entre dos vectores, independientemente de si está comparando documentos o sus "modelos" (que tradicionalmente se describiría como clústeres, donde el el modelo es la suma de todos los clusters).


Una forma informal pero bastante intuitiva de pensar sobre esto es considerar los 2 componentes de un vector: dirección y magnitud .

La dirección es la "preferencia" / "estilo" / "sentimiento" / "variable latente" del vector, mientras que la magnitud es qué tan fuerte es hacia esa dirección.

Al clasificar documentos, nos gustaría categorizarlos por su sentimiento general, por lo que usamos la distancia angular.

La distancia euclídea es susceptible a documentos agrupados por su norma L2 (magnitud, en el caso bidimensional) en lugar de dirección. Es decir, los vectores con direcciones bastante diferentes se agruparían porque sus distancias desde el origen son similares.


Tiempo computacional (en python ):

import time import numpy as np for i in range(10): start = time.time() for i in range(10000): a, b = np.random.rand(100), np.random.rand(100) np.dot(a, b) / ( np.linalg.norm(a) * np.linalg.norm(b)) print ''Cosine similarity took'', time.time() - start start = time.time() for i in range(10000): a, b = np.random.rand(100), np.random.rand(100) 2 * (1 - np.dot(a, b) / ( np.linalg.norm(a) * np.linalg.norm(b))) print ''Euclidean from 2*(1 - cosine_similarity) took'', time.time() - start start = time.time() for i in range(10000): a, b = np.random.rand(100), np.random.rand(100) np.linalg.norm(a-b) print ''Euclidean Distance using np.linalg.norm() took'', time.time() - start start = time.time() for i in range(10000): a, b = np.random.rand(100), np.random.rand(100) np.sqrt(np.sum((a-b)**2)) print ''Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took'', time.time() - start print ''--------------------------------------------------------''

[fuera]:

Cosine similarity took 0.15826010704 Euclidean from 2*(1 - cosine_similarity) took 0.179041862488 Euclidean Distance using np.linalg.norm() took 0.10684299469 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.113723039627 -------------------------------------------------------- Cosine similarity took 0.161732912064 Euclidean from 2*(1 - cosine_similarity) took 0.178358793259 Euclidean Distance using np.linalg.norm() took 0.107393980026 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111194849014 -------------------------------------------------------- Cosine similarity took 0.16274189949 Euclidean from 2*(1 - cosine_similarity) took 0.178978919983 Euclidean Distance using np.linalg.norm() took 0.106336116791 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111373186111 -------------------------------------------------------- Cosine similarity took 0.161939144135 Euclidean from 2*(1 - cosine_similarity) took 0.177414178848 Euclidean Distance using np.linalg.norm() took 0.106301784515 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.11181807518 -------------------------------------------------------- Cosine similarity took 0.162333965302 Euclidean from 2*(1 - cosine_similarity) took 0.177582979202 Euclidean Distance using np.linalg.norm() took 0.105742931366 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111120939255 -------------------------------------------------------- Cosine similarity took 0.16153883934 Euclidean from 2*(1 - cosine_similarity) took 0.176836967468 Euclidean Distance using np.linalg.norm() took 0.106392860413 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110891103745 -------------------------------------------------------- Cosine similarity took 0.16018986702 Euclidean from 2*(1 - cosine_similarity) took 0.177738189697 Euclidean Distance using np.linalg.norm() took 0.105060100555 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110497951508 -------------------------------------------------------- Cosine similarity took 0.159607887268 Euclidean from 2*(1 - cosine_similarity) took 0.178565979004 Euclidean Distance using np.linalg.norm() took 0.106383085251 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.11084485054 -------------------------------------------------------- Cosine similarity took 0.161075115204 Euclidean from 2*(1 - cosine_similarity) took 0.177822828293 Euclidean Distance using np.linalg.norm() took 0.106630086899 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.110257148743 -------------------------------------------------------- Cosine similarity took 0.161051988602 Euclidean from 2*(1 - cosine_similarity) took 0.181928873062 Euclidean Distance using np.linalg.norm() took 0.106360197067 Euclidean Distance using np.sqrt(np.sum((a-b)**2)) took 0.111301898956 --------------------------------------------------------