在Python中将距离矩阵重新排列为块形式

时间:2019-02-22 11:56:27

标签: python

考虑这个非常简单的示例,其中我计算了一些数据的成对距离矩阵:

import numpy as np
from sklearn.metrics import pairwise_distances
import matplotlib.pyplot as plt

data = [[0, 1], [5, 6], [5, 6], [5,6], [0, 1], [0, 1]]
dist = pairwise_distances(data)

plt.imshow(dist)

Distance matrix

我如何使该矩阵尽可能对角线?即它应该看起来像这样: Expected output

这似乎是一项常见的任务,必须有一个scipysklearn函数,但我找不到任何函数。 感谢您的帮助!

编辑: 需要明确的是:我希望根据距离值本身对矩阵进行排序。

同时对行和列进行聚类可以实现这一点,但是我不知道如何做到这一点。

1 个答案:

答案 0 :(得分:2)

似乎您要尝试执行的操作似乎在某种程度上等效于clustering algorithms-即将彼此靠近的元素分组,从而形成多个元素簇。一旦有了这些聚类,每个聚类中的距离应比其余距离小,然后您只需为每个组排列块即可。

您可能想看一下已经在Python中实现的集群算法 here的一个很好的比较;而某些聚类算法需要您预先指定期望的聚类,而另一些则可能更容易控制参数。

使用聚类,您的算法应为:

  1. 计算集群
  2. 对元素进行重新排序,以使它们按簇块排序(即[1,1,1,2,2,3,3,3,...])
  3. 从理论上讲,对角线现在应该非常低

如何对每个聚类中的元素进行排序,或者如何对聚类进行排序(可能因为我们需要对“对角线尽可能大”的正确定义)还不够明确,但是看看这是否对您有用?