【问题标题】:Cosine Similarity PHP余弦相似度 PHP
【发布时间】:2013-05-24 02:06:22
【问题描述】:

我想在 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 中为此计算余弦相似度?

【问题讨论】:

  • Cosine Similarity 是基本的,看起来一点也不像你的公式......你能分享更多的光并打破它与 ID1 、 ID2 和 Value 的关系吗
  • ID1中的每个值代表一个向量,ID2代表对应的部分,如果即1.1 1.3 1.4是向量,点后的值在ID2中为1。因此ID1的1是向量。所以我比较了 1 和 3 的对应值(分别作为 A 和 B 向量)。所以余弦相似度与wiki中给出的相同。

标签: php cosine-similarity


【解决方案1】:

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

如果你有两个长度为 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); len(v) 也是如此

【讨论】:

  • 是的,但我有很大的数据集。我应该如何循环,以便我可以计算每个 Id1 值之间的相似性,同时代码是最优的?
  • 您要求的公式。现在你假设它是次优的?刚才你甚至不明白。应该可以疯狂地并行化。
  • 我已经在我的问题中写了公式。我的问题清楚地要求一个代码而不是公式。请先阅读问题。
  • 如果你知道公式,你应该能够创建代码......它只是比较两个数组的相同索引的元素。
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 2011-01-01
  • 2017-12-12
  • 1970-01-01
  • 2014-02-25
  • 2018-10-27
  • 2012-06-24
相关资源
最近更新 更多