PHP中的余弦相似性

PHP中的余弦相似性,php,cosine-similarity,Php,Cosine Similarity,我想计算PHP中1(ID1)和3(ID1)之间的余弦相似性。 公式如下: 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

我想计算PHP中1(ID1)和3(ID1)之间的余弦相似性。 公式如下:

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中有计算余弦相似性的算法吗?

向量a和B之间的相似性可以看作是a和B之间的点积,通过除以两个范数的乘积进行归一化

PHP中的点积可以在没有for循环的情况下编写:

$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))

算法应该与语言无关。你是说你在寻找一个PHP实现吗?是的,我在寻找一个PHP实现,但如果我想计算每个ID1值之间的相似性,即如果我想计算3和4之间的相似性,1和4之间的相似性,我需要一个for循环。你能举个例子吗?你的意思是你有两个以上的数组(例如:$id1,$id2,$id3…$idN)并且想要计算所有可能对之间的N*(N-1)/2相似性?我只有两个数组,但我需要找到每个id1元素之间的相似性。ID2元素是ID1的一部分,正如您可以看到的一样,对于相同的ID1值,我有不止一个ID2值。从上面给出的例子中,我需要找到1和3、1和4、3和4之间的相似性。