我想计算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中的余弦相似度?
答案 0 :(得分:2)
矢量A和B之间的相似性可以看作是A和B之间的点积,通过将它除以两个范数的乘积来归一化。
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))