2013-06-03 6 views
0

PHP에서 코사인 유사성을 코딩하고 있습니다. 때로는 formula이 결과를 제공합니다. inverse cos을 사용하여이 수에서 차수를 도출하려면 1과 0 사이 여야합니다.코사인 유사성 결과가 하나 이상

나는 1을 더 가깝게할수록 차수가 필요 없다는 것을 안다. , 0에 가까울수록 덜 유사합니다.

그러나 나는 1보다 큰 숫자를 어떻게 만들지 모르겠다. 그것은 단지 그것이 완전히 다른 것을 의미 하는가? 2가 0보다 덜 유사합니까? -이 0에서 하나의 이동으로 가장 유사한

가장 가까운

0 아래로 아래에서 1 :

당신은 유사성의 순서는 종류의가는 것을 말할 수 있습니다. 위의 1에서 가장 가깝습니다 - 멀어 질수록 덜 비슷해집니다.

감사합니다.

내 코드의 요청은 다음과 같습니다

$norm1 = 0; 
foreach ($dict1 as $value) { 
    $valuesq = $value * $value; 
    $norm1 = $norm1 + $valuesq; 
} 
$norm1 = sqrt($norm1); 
$dot_product = array_sum(array_map('bcmul', $dict1, $dict2)); 
$cospheta = ($dot_product)/($norm1*$norm2); 

당신에게 값의 종류 내가 갖는 아이디어 제공하려면 :

0.9076645291077 

2.0680991116095 

1.4015600717928 

1.0377360186767 

1.8563586243689 

1.0349674872379 

1.2083865384822 

2.3000034036913 

0.84280491429133 
+1

? 코드를 보여줄 수 있습니까? – Tap

+0

@Tap 코드를 추가했습니다. – samiles

+0

cospheta가 1보다 큰 결과를 가져 오는 $ dict1 및 $ dict2 값의 예를 들려 줄 수 있습니까? – Tap

답변

1

당신의 수학은 훌륭하지만 당신이 표준을 계산하는 뭔가를 놓치고 있다고 생각합니다. 다음과 같이 자신의 기능이 수학을 이동하는 경우 그것은 잘 작동 :

<?php 
function calc_norm($arr) { 
    $norm = 0; 
    foreach ($arr as $value) { 
     $valuesq = $value * $value; 
     $norm = $norm + $valuesq; 
    } 
    return(sqrt($norm)); 
} 

$dict1 = array(5,0,97); 
$dict2 = array(300,2,124); 

$dot_product = array_sum(array_map('bcmul', $dict1, $dict2)); 
$cospheta = ($dot_product)/(calc_norm($dict1)*calc_norm($dict2)); 

print_r($cospheta); 

> 어떻게 내적을 계산하는

-1

인해 floating point arithmetic의 변덕에를, 당신은 할 수 있습니다 컴퓨터가 사용하는 이진 형식으로 표현 될 때 계산이 정확하지 않습니다. 아마도 당신은 그냥 내릴 수 있습니다. 숫자가 0보다 약간 작은 경우에도 마찬가지입니다.

0

나는 뭔가를 놓치고 있는지 모르겠다.하지만 dict2의 값에 합계와 제곱근을 적용하지 않았다고 생각한다.

쿼리 당 정규화되지 않은 경우 결과가 1보다 커질 수 있습니다. 그러나 이것은 정확한 결과에 대해 등가 (비례)로 순위를 매기므로 계산이 더 빠르다.

이 정보가 도움이되기를 바랍니다.

관련 문제