2013-05-24 2 views
2

PHP에서 1 (ID1)과 3 (ID1) 사이의 코사인 유사성을 계산하고 싶습니다.PHP의 코사인 유사도

similarity = (1.1 * 3.1 + 1.4 * 3.4)/(((1.1)^2+(1.3)^2+(1.4)^2)^0.5)(((3.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

알고리즘되어야 언어에 구애받지 않습니다. PHP 구현을 찾고 있다는 것을 의미합니까? –

+0

예 PHP 구현을 찾고 있는데 – user2044770

답변

2

벡터 A와 B 사이의 유사성은 A와 B 사이의 내적으로서 2 개의 표준의 곱으로 나눔으로써 정규화 된 것으로 볼 수 있습니다.

PHP의 내적은 사이클없이 기록 될 수있다 :

$dot_product=array_sum(array_map(create_function('$a, $b', 'return $a * $b;'), $a1, $a2)); 

그래서 제 함수 작성 :

function dotp($arr1, $arr2){ 
    return array_sum(array_map(create_function('$a, $b', 'return $a * $b;'), $arr1, $arr2)); 
} 

이제 코사인 유사도이다

$similarity=dotp($id1,$id2)/sqrt(dotp($id1,$id1)*dotp($id2,$id2)) 
+0

하지만 각 ID1 값 사이의 유사성을 계산하려면 for 루프가 필요합니다. 즉 3과 4, 1과 4 사이의 유사성을 계산하려는 경우 필요합니다. – user2044770

+0

예를들 수 있습니까? 두 개 이상의 배열 (예 : $ id1, $ id2, $ id3 ... $ idN)이 있고 가능한 모든 쌍 사이의 N * (N-1)/2 유사도를 계산하고 싶습니까? – Jacopofar

+0

난 그냥 2 배열을 가지고 있지만 각 ID1 요소 사이의 유사성을 찾아야합니다. ID2 요소는 ID1의 일부입니다. ID1의 동일한 값에서 볼 수 있듯이 ID2의 값이 두 개 이상 있습니다. 위에 주어진 예제에서 1과 3, 1과 4, 3과 4 사이의 유사성을 찾아야합니다. – user2044770