从矢量列表计算距离矩阵

时间:2017-01-24 20:50:11

标签: python numpy scipy

说我有一个矢量列表,我想从中生成一个距离矩阵。什么是一个简洁的方法呢?例如,我有一个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

有没有" neater"或" pythonic"得到最终距离矩阵的方法?

2 个答案:

答案 0 :(得分:2)

根据@Divakar的建议,我得到了我想要的东西。这里是那些正在寻找答案的人的片段:

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),距离矩阵的对角线为零。

答案 1 :(得分:0)

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

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

无法改善!!

谢谢!

相关问题