我想使用sklearn的余弦距离公式计算NxN相似度矩阵。我的问题是我的Matrix非常大。它有大约1000个条目。我目前的做法非常缓慢,我需要一个真正的加速。有人可以帮助我加速代码吗?
for i in similarity_matrix.columns:
for j in similarity_matrix.columns:
if i == j:
similarity_matrix.ix[i,j] = 0
else:
similarity_matrix.ix[i,j] = cosine(documents[int(i)], documents[int(j)])
奖金任务:此外我想使用加权余弦公式。但似乎没有在sklearn中实现?这是真的吗?
答案 0 :(得分:3)
使用for-loops不是理想的解决方案。我建议回到scipy的pdist函数。我的读物是,你不是说你的矩阵有1000个条目但1000x1000?但Scipy可以轻松处理这个问题。
import numpy as np
from scipy.spatial.distance import pdist
res = pdist(documents.T, 'cosine')
distances = 1-pd.DataFrame(squareform(res), index=documents.columns, columns=documents.columns)
我有理解你的体重矢量的样子吗?是一个恒定的价值? Pdist允许添加自定义功能。例如,您可以使用numpy(也非常快)计算余弦距离
pdist(X, lambda u, v: np.dot(np.dot(u, v), weightvec) / (norm(np.multiply(u, weightvec)) * norm(np.multiply(v, weightvec))))