2013-05-28 4 views
2

나는 1, 4, 3, 마찬가지로 1 (ID1) 3 PHP에서 (ID1) 사이의 코사인 유사도를 계산하려면, 4 공식은 다음과 같이 될 것이다 :코사인 유사성 PHP

유사성 = (1.1 × 3.1 + 1.4 × 3.4)/((1.1)^2 + (3.4)^2)^0.5) = (4 * 4 + 8 * 4)/(((16 + 16 + 64)^0.5) (16 + 16)^0.5))

내 데이터 집합은 다음과 같다 :

ID1 ID2 Value 
1  1  4  
1  3  4  
1  4  8  
3  1  4  
3  4  4  
4  1  8  
4  3  4 

이것에 대한 PHP에서 코사인 유사성을 계산하기위한 코드가 있습니까?

+0

[코사인 유사도] (http://en.wikipedia.org/wiki/Cosine_similarity)는 기본이며 수식처럼 보이지 않습니다 ... 더 많은 빛을 공유하고 그 값이 어떻게 관련되어 있는지 알 수 있습니까? ID1, ID2 및 값 – Baba

+0

ID1의 각 값은 벡터를 나타내며 ID2는 해당 부분을 나타냅니다. 즉, 1.1 1.3 1.4가 벡터 인 경우 점 뒤의 값은 1에 대한 ID2입니다. 따라서 ID1은 벡터입니다. 그래서 나는 1과 3의 상응하는 값을 비교하고 있습니다 (A와 B 벡터 resp로 가져옵니다). 따라서 코사인 유사도는 위키에서 제공 한 것과 같습니다. – user2044770

답변

3

수식은 프로그래밍 언어와 상관없이 수학에서 일반적입니다.

는 길이 n의 두 벡터가있는 경우 :

u = (u1, u2, ...., un) and v = (v1, v2, ...., vn) 

그런 다음 코사인 유사성 (일명 도트 제품)입니다 :

u1*v1 + u2*v2 + .... + un*vn 
_____________________________ 
    len(u) * len(v) 

len(u) = sqrt(u1*u1 + u2*u2 + .... + un*un); 비슷하게

+0

네,하지만 큰 데이터 세트가 있습니다. 어떻게하면 각 Id1 값 사이의 유사성을 계산할 수 있고 동시에 코드가 최적이 될 수 있도록 루프를 통과해야합니까? – user2044770

+1

수식을 물었습니다. 이제는 차선책이라고 가정하고 있습니까? 잠시 전에 당신도 이해하지 못했습니다. 미친 것처럼 병렬화 할 수 있어야합니다. – duffymo

+0

나는 내 질문에 공식을 이미 썼다. 제 질문은 분명히 공식이 아닌 코드를 요구합니다. 먼저 질문을 읽어보십시오. – user2044770