【问题标题】:compute distance matrix from list of vectors从向量列表计算距离矩阵
【发布时间】:2017-06-09 21:00:23
【问题描述】:

假设我有一个向量列表,我想从中生成一个距离矩阵。什么是一种巧妙的方法?例如,我有一个包含 3 个向量的列表:

k = [[2, 4, 7], [3, 4, 7], [5,1,3]]
distance = pairwise_distances(v1, v2, metric='cosine', n_jobs=-1)

期望的输出:给定向量列表的余弦距离的 numpy 数组。

array([[ 1.        ,  0.00638545,  0.28778769],
       [ 0.00638545,  1.        ,  0.21402251],
       [ 0.28778769,  0.21402251,  1.        ]])

这就是我所做的:使用 itertools.combinations 获得所有组合。计算每对的距离。然后,将距离度量实际放置在“正确”单元格(需要列表中原始向量的索引)变得有点混乱。

combs = list(itertools.combinations(k, 2))
print combs

是否有一种“更简洁”或“pythonic”的方式来获取最终距离矩阵?

【问题讨论】:

  • 既然你已经标记了Scipy - 你看过cdist, pdist, squareform in Scipy吗?
  • 嗯,方形看起来很有希望。我知道 pdist,cdist。感谢您指出。让我试一试。
  • 还要注意距离矩阵是对称的,对角线为1,只需要计算一个三角形部分。
  • 即只计算 i
  • distance 矩阵的对角线将为 0。

标签: python numpy scipy


【解决方案1】:

根据@Divakar 的建议,我得到了我想要的。对于那些正在寻找答案的人来说,这里是 sn-p:

distance_vectors = [cosine_distance([pair[0]], [pair[1]]) for pair in combs]
print distance_vectors

distance_vectors = [x[0][0] for x in distance_vectors]
print distance_vectors
X = squareform(np.array(distance_vectors))
print X

而且,是的(感谢@Warren),距离矩阵的对角线为零。

【讨论】:

  • pdist 有一个余弦度量。因此,您可以直接使用它,从而避免第一步的循环。
【解决方案2】:

再次感谢@Divakar,这是一种更紧凑的方式:

k = [[2, 4, 7], [3, 4, 7], [5,1,3]]
dm = pdist(np.array(k), 'cosine')
dm = squareform(dm)
print dm

再好不过了!!

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    相关资源
    最近更新 更多