【发布时间】:2019-02-01 11:57:07
【问题描述】:
我有两个 numpy 数组:
数组 1:500,000 行 x 100 列
数组 2:160,000 行 x 100 列
我想找出 数组 1 中的每一行 和 数组 2 之间的最大余弦相似度。换句话说,我计算数组 1 中的第一行和数组 2 中的所有行之间的余弦相似度,并找到最大的余弦相似度,然后我计算数组 1 中的第二行和数组 1 中的所有行之间的余弦相似度数组2,求最大余弦相似度;并对数组 1 的其余部分执行此操作。
我目前使用sklearn 的cosine_similarity() 函数并执行以下操作,但速度极慢。我想知道是否有一种更快的方法不涉及多处理/多线程来完成我想做的事情。另外,我拥有的数组并不稀疏。
from sklearn.metrics.pairwise import cosine_similarity as cosine
results = []
for i in range(Array1.shape[0]):
results.append(numpy.max(cosine(Array1[None,i,:], Array2)))
【问题讨论】:
-
除非我误解了这个问题,否则你知道这总是需要对行进行 80000000000 次操作吗?
-
是的……这就是为什么它这么慢。任务的性质如下: Array2 是 160k 文档的数字表示。 Array1 是 500k 文档的数字代表。我想找出 500k 文档中的每一个最相似的 160k 文档中的哪一个,因此使用余弦相似度 l。
-
好的。我的观点是,无论优化如何,都需要很长时间才能做到这一点。问题可能不在于
cosine_similarity。 -
这是一个有趣的问题,我会试一试。
-
老实说,鉴于您选择的工具,您正在做的事情似乎是一个好方法。您正在对一行和整个第二个数组之间进行矢量化计算。这是一个好方法。也许考虑这篇文章? stackoverflow.com/questions/47625437/…
标签: python numpy scikit-learn cosine-similarity