Pandas矩阵到距离矩阵尽可能快

时间:2017-06-28 13:48:48

标签: python performance loops pandas

我想使用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中实现?这是真的吗?

1 个答案:

答案 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))))