2013-10-16 4 views
25

나는 분류 된 텍스트의 코퍼가있다. 이것들로부터 벡터를 만듭니다. 각 벡터는 하나의 문서에 해당합니다. 벡터 구성 요소는 TFIDF 값으로 계산 된이 문서의 단어 가중치입니다. 다음으로 모든 클래스가 하나의 벡터로 표현되는 모델을 만듭니다. 모델에는 코퍼스의 클래스만큼 많은 벡터가 있습니다. 모델 벡터의 성분은,이 클래스의 벡터로부터 취해진 모든 성분 값의 평균으로서 계산됩니다. 분류되지 않은 벡터의 경우 이러한 벡터 사이의 코사인을 계산하여 모델 벡터와의 유사성을 결정합니다.벡터 공간 모델 : 코사인 유사성 대 유클리드 거리

질문 :

1) 나는 유클리드 거리가 유사성을 계산하는 분류되지 않은 모델 벡터 사이에 사용할 수 있습니까?

2) 유클리드 거리가 두 벡터 사이의 각도 코사인 대신 유사도 측정으로 사용될 수없는 이유는 무엇입니까?

감사합니다.

+0

이 질문 오프 주제 것으로 보인다. http://stats.stackexchange.com/을 시도하십시오. –

답변

26

한 비공식적 인 것이 아니라 직관적 인 방법은 벡터의 두 구성 요소를 고려하는 것입니다 : 방향크기. 크기가 그 방향으로 얼마나 강한 반면

방향은 "환경 설정"벡터의/"잠재 변수"/ "스타일"/ "감정"이다.

문서를 분류 할 때 전반적인 정서로 문서를 분류하기 때문에 각도 거리를 사용합니다.

유클리드 거리 (Euclidean distance)는 방향 대신에 L2- 랭스 (2 차원 경우의 크기)에 의해 클러스터링되는 문서의 영향을받습니다. 나는. 서로 다른 방향의 벡터는 원점으로부터의 거리가 유사하기 때문에 밀집 할 수 있습니다. (python의) 지혜로운

+1

"유클리드 거리가있는 경우"방향이 다른 벡터는 원점과의 거리가 비슷하기 때문에 밀집 할 것입니다. "-> 이것이 어떻게 사실입니까? 극단적 인 경우, 크기가 같은 두 개의 정반대 벡터를 고려하십시오. 원점과의 거리가 같더라도 큰 유클리드 거리를 갖습니다. – xenocyon

+2

@xenocyon 원점까지의 크기가 작은 경우를 고려하십시오. – kizzx2

+1

감정 -1, 1, 100을 가진 세 개의 문서가있는 경우 두 개는 더 가깝습니다 : 처음 두 번째 또는 두 번째? 나는 당신이 작업하고있는 특정 문제를 안다면 대답 할 수 있다고 생각합니다. – BallpointBen

17

질문에 대해 역순으로 답변 해 드리겠습니다. 두 번째 질문의 경우 코사인 유사성과 유클리드 거리는 벡터 유사성을 측정하는 두 가지 방법입니다. 전자는 원점에 대한 벡터의 유사성을 측정하는 반면, 후자는 벡터를 따라 특정 관심 지점 간의 거리를 측정합니다. 둘 중 하나를 단독으로 사용하거나 조합하여 사용하거나 다른 많은 방법으로 유사성을 판단 할 수 있습니다. 자세한 내용은 Michael Collins 강의에서 these 슬라이드를 참조하십시오.

첫 번째 질문은 명확하지 않지만 두 가지 벡터 사이의 거리를 찾기 위해 문서 또는 "모델"을 비교하는지 여부에 관계없이 두 측정 기준을 사용할 수 있어야합니다 (전통적으로 클러스터, 여기서 모델은 모든 클러스터의 합계입니다). 이것에 대해 생각하는

5

전산 시간 :

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

[아웃] :이 통계에 대해하지 프로그래밍 때문에

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

계산 시간이 현명하므로 유클리드가 더 좋다고 말하는가 ..? – Aaron

+0

이 결과에서 계산 시간 간에는 큰 차이가없는 것처럼 보입니다. 따라서, 사용 방법을 결정할 때 계산 시간으로 인도 할 수 없습니다. – Gathide