【问题标题】:Pandas Matrix to Distance Matrix as fast as possiblePandas 矩阵到距离矩阵尽可能快
【发布时间】:2017-12-01 22:19:31
【问题描述】:

我想使用 sklearn 的余弦距离公式计算一个 NxN 相似度矩阵。我的问题是我的矩阵非常非常大。它有大约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中好像没有实现?这是真的吗?

【问题讨论】:

标签: python performance loops pandas


【解决方案1】:

使用 for 循环并不是理想的解决方案。我建议回退到 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))))

【讨论】:

  • 哦等等。为什么是 1-pd.Dataframe ?
  • 这取决于您要计算的内容。余弦距离和余弦相似度之间存在差异。查看维基百科了解更多信息en.wikipedia.org/wiki/Cosine_similarity
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-04
  • 2016-12-06
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多