2013-06-03 104 views
0

我在编码余弦相似度的PHP。有时候formula会给出一个结果。为了获得使用逆COS这个数字一定程度上,它需要是1和0上面的余弦相似度结果

之间我知道,我并不需要一个度,因为越接近1,越相似,它们是,越接近0越不相似。

不过,我不知道做什么上面1.一些它是否仅仅意味着它是完全不一样? 2是否比0更少?

你能说相似度顺序那种云:

最近1从下到0 - 最相似的,因为它移动从0到一个。 距离上面最近的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

我不知道如果我失去了一些东西,但我觉得你不是在申请之和的平方根的值在dict2(查询我假设)。

如果你没有规范化每个查询,你可以得到的结果大于一个。但是,由于它与正确结果的等级(成比例)相等,所以计算时间更快。

我希望这会有所帮助。