问题标签 [cosine-similarity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
4036 浏览

algorithm - 在一组向量中找到最佳余弦相似度

我有 n 个向量,每个向量都有 m 个元素(实数)。我想找到所有对中余弦相似度最大的对。

直接的解决方案需要 O(n 2 m) 时间。

有没有更好的解决方案?

更新

余弦相似度/距离和三角方程启发我,我可以用“弦长”代替“余弦相似度”,这会降低精度但会大大提高速度。(有许多解决度量空间中最近邻的现有解决方案,如ANN

0 投票
2 回答
2141 浏览

machine-learning - 余弦相似度多文档聚类的数学方法

余弦相似度:通常在比较两个文档时使用。它测量两个向量之间的角度。如果该值为零,则两个向量之间的角度为 90 度,并且它们不共享任何项。如果值为 1,则两个向量除了幅度之外是相同的。当数据稀疏、不对称并且缺乏特征的相似性时,使用余弦。

当我将余弦用于两个向量(文档)时,我将根据下表获得结果

然后将其标准化到最后。然后,我将得到余弦 Cos(v1,v2)= 90%

但是,如果我有 10 份文件,这意味着我得到了

然后我必须比较结果。

有什么快速的方法吗?我怎样才能得到 10 个或更多文件的 cos。

我知道我怎样才能得到两个文件的余弦但是我怎样才能得到更多的文件呢?我想要数学方法。

0 投票
1 回答
1354 浏览

node.js - 如何有效地计算文档流中文档之间的相似度

我收集文本文档(在 Node.js 中),其中一个文档i表示为单词列表。考虑到新文档以文档流的形式出现,计算这些文档之间相似度的有效方法是什么?

我目前对每个文档中单词的归一化频率使用 cos-similarity。由于可扩展性问题,我不使用 TF-IDF(词频,逆文档频率),因为我获得了越来越多的文档。

最初

我的第一个版本是从当前可用的文档开始,计算一个大的 Term-Document 矩阵A,然后计算S = A^T x AS(i, j)在通过norm(doc(i))和归一化之后norm(doc(j)))文档之间的 cos-similarityi以及j其词频分别为doc(i)doc(j)

对于新文件

收到新文件时该怎么办doc(k)?好吧,我必须计算这个文档与之前所有文档的相似度,这不需要构建整个矩阵。我可以取doc(k) dot doc(j)所有之前的内积j,结果是S(k, j),这很好。

麻烦

  1. SNode.js 中的计算真的很长。实在是太长了!所以我决定创建一个 C++ 模块,它可以更快地完成整个事情。确实如此!但我等不及了,我应该能够使用中间结果。而我所说的“不等待”的意思是

    一个。等待计算完成,但也
    b。等待构建矩阵A(这是一个大矩阵)。

  2. 计算 newS(k, j)可以利用这样一个事实,即文档中的单词比所有给定单词的集合(我用来构建整个矩阵A)少得多。因此,在 Node.js 中执行此操作看起来更快,避免占用大量额外资源来访问数据。

但是有没有更好的方法来做到这一点?

注意:我开始计算的原因S是我可以轻松地A在 Node.js 中构建,在那里我可以访问所有数据,然后在 C++ 中进行矩阵乘法并将其返回到 Node.js 中,这大大加快了整个过程. 但现在计算S变得不切实际,它看起来毫无用处。

注2:是的,我不必计算整体S,我可以只计算右上角的元素(或左下角的元素),但这不是问题。时间计算问题不是这个顺序。

0 投票
1 回答
604 浏览

java - 在 Java 中使用地图时出现意外/未定义的结果

我正在做一些工作来推荐文档,为此我使用了余弦相似度方法。这是该方法的代码:

问题是结果会根据参数传递的顺序而有所不同。例如,如果我调用cosineSimilarity(v1, v2)它将返回0.3,但如果我调用cosineSimilarity(v2, v1)它将返回一个完全不同的值。

我认为这与返回一个由地图支持的集合的事实有关Map.keySet() ,但我并不完全理解这一点的含义。

任何人都可以看到该方法出错的地方吗?

0 投票
1 回答
10582 浏览

matlab - 如何使用两个矩阵计算余弦相似度

我有两个矩阵,A(维度 M x N)和 B(N x P)。事实上,它们是向量的集合——A中的行向量,B中的列向量。我想得到每一对的余弦相似度分数ab其中a是矩阵A的向量(行)和矩阵b的向量(列) B.

我首先将矩阵相乘,得到矩阵C(维度 M x P)。

C = A*B

但是,为了获得余弦相似度分数,我需要将每个值除以C(i,j)两个对应向量的范数。您能建议在 Matlab 中执行此操作的最简单方法吗?

0 投票
2 回答
6411 浏览

java - 线程“主”java.lang.NumberFormatException 中的异常:Infinite 或 NaN

你能帮我解决这个问题吗.. 我正在尝试获取一个大十进制 (BigDecimal) 的日志,但我在下面收到一条异常错误消息:

这就是我所拥有的:

我在第二行得到了异常;我该如何解决这个问题?非常感谢你的好意。哦,顺便说一句,我正在尝试计算文本文件的“tf-idf”。

这是完整的代码

File[] corpus = new File("files//").listFiles(); int totalDocuments = (corpus.length) - 1; //-1 for the suspect document.

`

0 投票
3 回答
1084 浏览

machine-learning - 相似性检测技术可以应用于格式化为大 ASCII 编码整数字节数组的文本文档吗?

我想检测文件之间的相似之处。这样做的一种方法是对文件进行编码,以减少相似性算法的输入空间,然后为结果提供更准确的结果。这是通过仅考虑文档的信息特征来完成的。这样做的一种方法是将文件转换为遵循 tf-idf 频率的向量空间转换,这会放大信息量很大的术语并缩小频繁的术语。我的问题是这是否可以在不保留其文本表示的文档中完成。例如,假设首先将文档转换为一个大整数数组,其中其字符表示为其 ASCII 值。

0 投票
1 回答
660 浏览

similarity - 余弦相似度的预处理要求是什么?

余弦相似度的输入是两个向量,代表我要比较的两个不同数据。对向量的语义有要求吗?它可以简单地是每个文件的字节表示。然后计算每个字节的频率?这有意义吗?或者应该有一个文件的矢量化,其中每个维度不是来自文件的原始数据,而是一些元数据作为每个术语的频率,如果我们为文本文件或 tf-idf 编码模型说话?换一种说法:为了“正确”,余弦相似度是否要求对数据进行复杂的预处理步骤,或者我可以将其作为输入整数值给出,代表我的数据的每个字节,而不考虑文本或只是频率每个字节的术语?

0 投票
4 回答
5017 浏览

search - 将 TF-IDF(余弦相似度)与 pagerank 相结合?

给定一个查询,我有一个文档的余弦分数。我也有文件pagerank。有没有将两者结合起来的标准好方法?

我正在考虑将它们相乘

因为如果您的 pagerank 或 cosine-score 得分较低,则该文档并不有趣。

还是最好有一个加权和?

这是否更好?那么你的余弦分数可能为零,但页面排名很高,并且页面将显示在结果中。

0 投票
2 回答
2019 浏览

java - 如何有效地计算数百万个字符串之间的余弦相似度

我需要计算列表中字符串之间的余弦相似度。例如,我有一个超过 1000 万个字符串的列表,每个字符串都必须确定其自身与列表中每个其他字符串之间的相似性。我可以用来高效快速地完成此类任务的最佳算法是什么?分治算法是否适用?

编辑

我想确定哪些字符串与给定字符串最相似,并且能够拥有与相似度相关的度量/分数。我认为我想做的事情与最初不知道集群数量的集群一致。