使用欧氏距离的 Numpy 数组的邻接矩阵
Adjacency Matrix from Numpy array using Euclidean Distance
有人可以帮助我了解如何根据所有行之间的欧氏距离从 numpy 数组生成加权邻接矩阵,即 0 和 1、0 和 2、.. 1 和 2,...?
给定以下输入矩阵 (5, 4) 的示例:
matrix = [[2,10,9,6],
[5,1,4,7],
[3,2,1,0],
[10, 20, 1, 4],
[17, 3, 5, 18]]
我想获得一个包含节点之间最小距离的加权邻接矩阵 (5,5),即
if dist(row0, row1)= 10,77 and dist(row0, row2)= 12,84,
--> the output matrix will take the first distance as a column value.
我已经用下面的代码解决了生成邻接矩阵的第一部分:
from scipy.spatial.distance import cdist
dist = cdist( matrix, matrix, metric='euclidean')
我得到以下结果:
array([[ 0. , 10.77032961, 12.84523258, 15.23154621, 20.83266666],
[10.77032961, 0. , 7.93725393, 20.09975124, 16.43167673],
[12.84523258, 7.93725393, 0. , 19.72308292, 23.17326045],
[15.23154621, 20.09975124, 19.72308292, 0. , 23.4520788 ],
[20.83266666, 16.43167673, 23.17326045, 23.4520788 , 0. ]])
但我还不知道如何指定我们 select 的邻居数量,例如每个节点 2 个邻居。例如,我们定义邻居的数量 N = 2,然后对于每一行,我们只选择具有两个最小距离的两个邻居,结果是:
[[ 0. , 10.77032961, 12.84523258, 0, 0],
[10.77032961, 0. , 7.93725393, 0, 0],
[12.84523258, 7.93725393, 0. , 0, 0],
[15.23154621, 0, 19.72308292, 0. , 0 ],
[20.83266666, 16.43167673, 0, 0 , 0. ]]
假设 a
是您的欧氏距离矩阵,您可以使用 np.argpartition
选择每行 n
min/max 个值。请记住,对角线始终为 0 且欧氏距离为非负数,因此要在每行中保留两个最近点,您需要每行保留三个最小值(包括对角线上的 0)。但是,如果你想做最大,这不成立。
a[np.arange(a.shape[0])[:,None],np.argpartition(a, 3, axis=1)[:,3:]] = 0
输出:
array([[ 0. , 10.77032961, 12.84523258, 0. , 0. ],
[10.77032961, 0. , 7.93725393, 0. , 0. ],
[12.84523258, 7.93725393, 0. , 0. , 0. ],
[15.23154621, 0. , 19.72308292, 0. , 0. ],
[20.83266666, 16.43167673, 0. , 0. , 0. ]])
您可以使用这个更简洁的解决方案从矩阵中获取最小的 n。尝试以下 -
dist.argsort(1).argsort(1)
在 axis=1 上创建了一个排名顺序(最小为 0,最大为 4),而 <= 2 决定了您需要从排名顺序中获得的 nsmallest 值的数量。 np.where
将其过滤或替换为 0。
np.where(dist.argsort(1).argsort(1) <= 2, dist, 0)
array([[ 0. , 10.77032961, 12.84523258, 0. , 0. ],
[10.77032961, 0. , 7.93725393, 0. , 0. ],
[12.84523258, 7.93725393, 0. , 0. , 0. ],
[15.23154621, 0. , 19.72308292, 0. , 0. ],
[20.83266666, 16.43167673, 0. , 0. , 0. ]])
这适用于任何轴,或者如果您还想从矩阵中获取 nlargest 或 nsmallest。
有人可以帮助我了解如何根据所有行之间的欧氏距离从 numpy 数组生成加权邻接矩阵,即 0 和 1、0 和 2、.. 1 和 2,...?
给定以下输入矩阵 (5, 4) 的示例:
matrix = [[2,10,9,6],
[5,1,4,7],
[3,2,1,0],
[10, 20, 1, 4],
[17, 3, 5, 18]]
我想获得一个包含节点之间最小距离的加权邻接矩阵 (5,5),即
if dist(row0, row1)= 10,77 and dist(row0, row2)= 12,84,
--> the output matrix will take the first distance as a column value.
我已经用下面的代码解决了生成邻接矩阵的第一部分:
from scipy.spatial.distance import cdist
dist = cdist( matrix, matrix, metric='euclidean')
我得到以下结果:
array([[ 0. , 10.77032961, 12.84523258, 15.23154621, 20.83266666],
[10.77032961, 0. , 7.93725393, 20.09975124, 16.43167673],
[12.84523258, 7.93725393, 0. , 19.72308292, 23.17326045],
[15.23154621, 20.09975124, 19.72308292, 0. , 23.4520788 ],
[20.83266666, 16.43167673, 23.17326045, 23.4520788 , 0. ]])
但我还不知道如何指定我们 select 的邻居数量,例如每个节点 2 个邻居。例如,我们定义邻居的数量 N = 2,然后对于每一行,我们只选择具有两个最小距离的两个邻居,结果是:
[[ 0. , 10.77032961, 12.84523258, 0, 0],
[10.77032961, 0. , 7.93725393, 0, 0],
[12.84523258, 7.93725393, 0. , 0, 0],
[15.23154621, 0, 19.72308292, 0. , 0 ],
[20.83266666, 16.43167673, 0, 0 , 0. ]]
假设 a
是您的欧氏距离矩阵,您可以使用 np.argpartition
选择每行 n
min/max 个值。请记住,对角线始终为 0 且欧氏距离为非负数,因此要在每行中保留两个最近点,您需要每行保留三个最小值(包括对角线上的 0)。但是,如果你想做最大,这不成立。
a[np.arange(a.shape[0])[:,None],np.argpartition(a, 3, axis=1)[:,3:]] = 0
输出:
array([[ 0. , 10.77032961, 12.84523258, 0. , 0. ],
[10.77032961, 0. , 7.93725393, 0. , 0. ],
[12.84523258, 7.93725393, 0. , 0. , 0. ],
[15.23154621, 0. , 19.72308292, 0. , 0. ],
[20.83266666, 16.43167673, 0. , 0. , 0. ]])
您可以使用这个更简洁的解决方案从矩阵中获取最小的 n。尝试以下 -
dist.argsort(1).argsort(1)
在 axis=1 上创建了一个排名顺序(最小为 0,最大为 4),而 <= 2 决定了您需要从排名顺序中获得的 nsmallest 值的数量。 np.where
将其过滤或替换为 0。
np.where(dist.argsort(1).argsort(1) <= 2, dist, 0)
array([[ 0. , 10.77032961, 12.84523258, 0. , 0. ],
[10.77032961, 0. , 7.93725393, 0. , 0. ],
[12.84523258, 7.93725393, 0. , 0. , 0. ],
[15.23154621, 0. , 19.72308292, 0. , 0. ],
[20.83266666, 16.43167673, 0. , 0. , 0. ]])
这适用于任何轴,或者如果您还想从矩阵中获取 nlargest 或 nsmallest。