1.前言
相似度计算,在很多业务中都有需要。比如:推荐系统、相似度词文检测等等,它有很多种实现方式,今天我就余弦相似度算法进行一个介绍与实现
2.介绍
向量空间余弦相似度(Cosine Similarity), 用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小 ,所以,我们可以用特征值进行相似度的判断。它的二维坐标系公式如下:

公式展开如下:

从二维推导到多维如下:

3.代码实现
<?php
declare(strict_types=1);
function cos_sim_distance($a, $b)
{
$result = 0;
if (is_array($a) && is_array($b)) {
$ab = 0;
$sumA = 0;
$sumB = 0;
foreach ($a as $ka => $itemA) {
foreach ($b as $kb => $itemB) {
if (!($ka ^ $kb)) {
$ab += ($itemA * $itemB);
$sumA += $itemA ** 2;
$sumB += $itemB ** 2;
}
}
}
$result = (double)($ab / (sqrt($sumA) * sqrt($sumB)));
}
return round($result, 2);
}
$a = [3, 0, 1, 3];
$b = [1, 10, 3, 0];
$c = [1, 0];
$d = [9, 10];
var_dump(cos_sim_distance($a, $b));
var_dump(cos_sim_distance($c, $d));
4.缺点
向量空间余弦相似度 算法只能判断个人特征值之间的差异,而不能判断特征值数值的差异,上面代码中,第二个输出是0.67。而实际如果特征值的语义为喜好程度的话,那么不喜欢和喜欢也就被误认为是相似性的结果。
5.参考
如无特殊说明,文章均为本站原创,转载请注明出处。如发现有什么不对的地方,希望得到您的指点。网络博主
http://blog.sina.com.cn/s/blog_62b83291010127bf.html