说我有一个矢量列表,我想从中生成一个距离矩阵。什么是一个简洁的方法呢?例如,我有一个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"得到最终距离矩阵的方法?
答案 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
无法改善!!
谢谢!