scipy 从向量列表计算距离矩阵

lmvvr0a8  于 2023-01-09  发布在  其他
关注(0)|答案(3)|浏览(151)

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

有没有一种"更整洁"或"Python"的方法来得到最终的距离矩阵?

798qvoo8

798qvoo81#

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

z9ju0rcb

z9ju0rcb2#

我能想到的最简单的方法是:

cdist(k,k,'cosine')
pw9qyyiw

pw9qyyiw3#

再次感谢@Divakar,它提供了一种更简洁的方法:

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

不能再好了!!
谢谢!

相关问题