下午好,
我从一个类似于下表的表格开始:
Attribute1 Attribute2 Attribute3
John 1 2 3
Jen 4 5 6
Jo 7 8 9我已经创建了一个函数-> dist (i,j),它计算表中任意两个人(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 0X是这两个人之间的L1距离。
你知道我该怎么做吗?
发布于 2019-03-01 02:49:40
您创建的函数看起来像标准的城市街区(曼哈顿)距离,这意味着您可以通过简单地调用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文档。
请注意,如果您的实际函数比您所描述的City Block函数更复杂,则仍然可以将这些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‘函数相同的结果,但如果需要,您可以看到现在如何调整它以满足您的需要。
https://stackoverflow.com/questions/54932278
复制相似问题