java余弦相似度问题

标签 java math

我开发了一些java程序来计算基于TF*IDF的余弦相似度。它运作良好。但是有一个问题.... :(

例如: 如果我有以下两个矩阵并且我想计算余弦相似度它不起作用,因为行的长度不相同

doc 1
1 2 3
4 5 6

doc 2
1 2 3 4 5 6
7 8 5 2 4 9

如果行和列的长度相同,那么我的程序运行良好,但如果行和列的长度不同,则程序运行不正常。

有什么建议吗???

最佳答案

我不确定你的实现,但 cosine distance两个 vector 的点积等于这些 vector 的归一化点积。

两个矩阵的点积可以表示为 a 。 b = aTb。因此,如果矩阵的长度不同,则无法通过点积来确定余弦。

现在,在标准的 TF*IDF 方法中,矩阵中的术语应由 term, document 索引,因此任何未出现在文档中的术语在矩阵中都应显示为零。

现在您设置它的方式似乎表明您的两个文档有两个不同的矩阵。我不确定这是否是您的意图,但它似乎不正确。

另一方面,如果您的一个矩阵应该是您的查询,那么它应该是一个 vector 而不是矩阵,以便转置产生正确的结果。

TF*IDF 的完整解释如下:

好的,在经典的 TF*IDF 中,您构建了一个术语文档矩阵 a。矩阵 a 中的每个值都以 ai,j 为特征,其中 i 是术语,j 是文档.该值是局部权重、全局权重和归一化权重的组合(尽管如果您对文档进行归一化,则归一化权重应该为 1)。因此 ai,j = fi,j*D/di,其中 fi,j 是词i在文档j中出现的频率,D是文档大小,di是文档的个数包含术语 i 的文档。

您的查询是指定为 b 的术语 vector 。对于查询中的每个术语 bi,q 都引用查询 q 的术语 i。 bi,q = fi,q 其中 fi,q 是查询中术语 i 的频率q。在这种情况下,每个查询都是一个 vector ,多个查询形成一个矩阵。

然后我们可以计算每个 vector 的单位 vector ,这样当我们进行点积时,它会产生正确的余弦值。为了获得单位 vector ,我们将矩阵 a 和查询 b 除以它们的 Frobenius norm。 .

最后,我们可以通过对给定查询的 vector b 进行转置来计算余弦距离。因此每次计算一个查询(或 vector )。这表示为 bTa。最终结果是一个 vector ,其中包含每个术语的得分,其中得分越高表示文档排名越高。

关于java余弦相似度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2315987/

相关文章:

java - 如何迭代 HashMap<String, ArrayList<Car>>

math - 给定非常大的值的 OpenGL 远平面会剪辑所有内容

c++ - 在 C++ 中查找序列中的第 N 项

algorithm - 类背包优化问题的遗传算法

java jama矩阵问题

java - 托管语言是否锁定刷新并重新加载 native 库的变量?

java - 将 com.google.android.maps.* 包从 Eclipse 导入到 Android Studio 时出错

java - IntelliJ 和控制台输出颜色

java - 使用 Java 收集所有 VersionOne Assets 及其所有属性

java - 与字符 "\"斗争,试图用 mathjax 显示数学公式