下午好,
我从一个类似于以下内容的表开始:
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距离。
关于如何实现此目标的任何想法吗?
答案 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
有关更多详细信息,请参见pdist
和squareform
文档。
请注意,如果您的实际功能比您所描述的“城市街区”更复杂,那么仍然可以将这些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”功能具有相同的结果,但是您可以看到如何根据需要现在对其进行调整。