余弦相似度 PHP

4

我希望在PHP中计算1(ID1)和3(ID1)之间的余弦相似度,同样地,也需要计算1和4、3和4之间的余弦相似度。公式如下:

相似度 = (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中用于计算余弦相似度的代码?

余弦相似度是基本的,看起来与你的公式完全不同...你能分享更多的信息并进一步解释值如何与ID1、ID2和Value相关联吗? - Baba
ID1 中的每个值都表示一个向量,而 ID2 则表示相应的部分,例如 1.1、1.3、1.4 是一个向量,小数点后面的值在 ID2 中。因此,ID1 的 1 就是一个向量。因此,我正在比较 1 和 3 的相应值(将它们分别视为 A 和 B 向量)。因此,余弦相似度与维基百科中所述相同。 - user2044770
1个回答

4

这个公式在数学中很常见,与编程语言无关。

如果你有两个长度为n的向量:

u = (u1, u2, ...., un) and v = (v1, v2, ...., vn)

然后余弦相似度(也称点积)为:
u1*v1 + u2*v2 + .... + un*vn
_____________________________
     len(u) * len(v) 

len(u) = sqrt(u1*u1 + u2*u2 + .... + un*un) 表示向量u的长度,类似地可得到向量v的长度 len(v)


是的,但我有一个大数据集。我应该如何循环遍历,以便可以计算每个Id1值之间的相似性,并且代码同时也要优化? - user2044770
1
你要求公式,现在又认为它是次优的吗?刚才你甚至还没理解它。应该可以像疯狂地并行化。 - duffymo
我已经在我的问题中写了公式。我的问题清楚地要求提供代码而不是公式。请先阅读问题。 - user2044770
如果你知道公式,你应该能够编写代码...只需要比较两个数组相同索引位置的元素。 - Nate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接