让我们做一些计算余弦相似度的快速基准测试,以便我们对其性能有一个基本的了解
timeit.timeit('cosine_similarity(x,y)',setup='from sklearn.metrics.pairwise import cosine_similarity; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=20000)
4.5380048290098784
timeit.timeit('cosine(x,y)',setup='from scipy.spatial.distance import cosine; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=20000)
0.6468068649992347
所以看起来scipy's cosine 的性能优于sklearn,所以我们可能不会从切换实现中受益......继续。
如果您想对包含 17k 个条目的矩阵执行成对余弦相似度,则大致相当于 17k^2 评估 == 289,000,000 这已经很多了,尤其是如果您的向量也是高维的,则更是如此.
让我们看看在您输入的thousandth 上完成余弦相似性的速度有多快,所以289,000 评估。
timeit.timeit('cosine(x,y)',setup='from scipy.spatial.distance import cosine; import numpy as np; x,y = np.random.random(100),np.random.random(100)',number=int((17000**2)/1000))
9.857225538988132
大约需要 10 秒。由于这会随着案例的数量线性增长......您可以预计花费 10,000 秒,或者不到 3 小时来执行大约 3 亿次余弦相似度运算(在我的例子中,是长度为 100 的向量)。
所以余弦相似度计算只需要花费一定的时间。可以潜在改进代码的一种方法是,您可以将余弦相似性存储在新数据帧或新系列中,然后使用索引将其连接到原始数据帧,而不是在循环的每次迭代中添加到数据帧使用at 方法(可能很慢)。
如果所有这些都有意义,那么您的计算负载就足够高,以至于一台小型笔记本电脑开始感到虚弱。你接下来做什么取决于你的用例——这需要做一次吗?只需运行它并忘记它。
需要偶尔但不要太频繁?使用 python 的multiprocessing 模块(重要的是不要使用multithreading,在这种情况下它不起作用)并行化你的实现(如果你有四个内核,一次使用所有内核)。
需要经常运行吗?您可能需要更多硬件,或研究云计算解决方案 - 您会惊讶于妥善管理的云计算设置的经济实惠程度。