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