基于函数计算nxn距离矩阵

时间:2019-02-28 18:44:46

标签: python-3.x pandas numpy

下午好,

我从一个类似于以下内容的表开始:

      Attribute1   Attribute2   Attribute3
John     1              2            3
Jen      4              5            6
Jo       7              8            9

我已经创建了一个函数-> dist(i,j),该函数计算表中任何2个人(i和j)之间的L1距离。例如,John和Jen之间的L1距离为dist(0,1)= | 4-1 |。 + | 5-2 | + | 6-3 | =9。还要注意,我将每个人都称为他们的行索引(John = 0,Jen = 1,依此类推)。

前进,我需要创建距离矩阵,该矩阵将计算所有成对人的距离。它将如下所示:

      John  Jen  Jo
John   0     x    x
Jen    x     0    x
Jo     x     x    0

x是这两个人之间的各自L1距离。

关于如何实现此目标的任何想法吗?

1 个答案:

答案 0 :(得分:3)

您创建的函数看起来像标准的City Block(Manhattan)距离,这意味着您可以通过轻松调用SciPy库函数来做到这一点:

from scipy.spatial.distance import squareform, pdist
dm = pd.DataFrame(squareform(pdist(df, metric='cityblock')), index=df.index, columns=df.index)

结果:

      John  Jen    Jo
John   0.0  9.0  18.0
Jen    9.0  0.0   9.0
Jo    18.0  9.0   0.0

有关更多详细信息,请参见pdistsquareform文档。

请注意,如果您的实际功能比您所描述的“城市街区”更复杂,那么仍然可以将这些SciPy函数与自定义的距离度量结合使用。

尽管对于这种特定情况不是必需的,但是如果需要的话,这里是如何应用自定义距离函数的方法。首先创建一个函数,将两行作为输入,并返回一个距离数字:

def my_distance_function(row1, row2):
    return np.abs(row1 - row2).sum()

然后应用如下:

dm = pd.DataFrame(squareform(pdist(df, metric=my_distance_function)), index=df.index, columns=df.index)

这与SciPy库中的“ cityblock”功能具有相同的结果,但是您可以看到如何根据需要现在对其进行调整。