假设,我们有
points1 = np.array([[0,0], [1,1], [0,1],[1,0]])
points2 = np.array([[2,1], [0,0], [1,0],[0,1]])
现在它们是按建筑顺序排列的不过,这只是一个mve,在我的应用程序中,每个数组的元素都将被洗牌。(这里我们可以使用
np.random.shuffle()
)。如果查看数据集,可以看到3个元素是相同的点,而其中只有一个元素发生了更改换句话说:
[0,0]
中的points2
是最接近[0,0]
中points1
的点,而[0,0]
中的points1
是最接近[0,0]
中points2
的点。[0,1]
中的points2
是最接近[0,1]
中points1
的点,而[0,1]
中的points1
是最接近[0,1]
中points2
的点。[1,0]
中的points2
是最接近[1,0]
中points1
的点,而[1,0]
中的points1
是最接近[1,0]
中points2
的点。[0,1]
中的[1,0],
,[2,1]
points2
是最接近[1,1]
中points1
的点,而[1,1]
中的points1
是最接近[2,1]
中points2
的点注意我是如何指定这两种方式的!事实上,第一个列表中的一个点可能最接近第二个列表中的一个点,但反过来可能不正确!(即,第二个列表中可能有一个点实际上最接近第一个列表中的同一点)。
另外,请注意,在最后一个要点中,我们有3个点最接近
[1,1]
。但是,在多个点最接近给定点的情况下,我想消除那些已经找到不同最接近点的点例如,在最后一个要点中,我将把[2,1]
中的points2
作为最接近[1,1]
的点,因为[0,1]
中的points2
认为[0,1]
中的points1
是最接近的,而[1,0]
中的points2
认为[1,0]
中的points1
是最接近的,所以它们已经“发货”或“忙碌”。我的问题
现在给定两个相同维度的数组(如上所述),即它们包含相同数量的点,我希望能够找到匹配项(如果没有唯一的匹配项,则为匹配项),以便:
points1
中的每个点都与points2
中的一个且只有一个点匹配使points2
中的每个点与points1
中的一个且仅一个点匹配。这些匹配是因为它们是最接近的想象一下,我只有一个点列表,我对每个点应用了随机的冲击。然后我想基本上“猜猜”每一个点到哪里去了(它们应该是最接近的,但不要介意这一部分)。
我该怎么做?
我的尝试
首先,我试着编写一个函数,循环遍历
points1
中的每个点,并计算到points2
中每个点的距离。在这之后,我会检查每一个距离列表,排序并找出最小值。因此,我会将每个点与最小距离的点相匹配。然而,这就陷入了这样一个问题:如果a是最接近的,并不意味着b是最接近a的,因此你可以最终得到匹配,其中许多点然后被匹配到一个点,以此类推。我试过用
sklearn.metrics.pairwise_distances_argmin_min(Y,X)
来阅读here,但它似乎做了一些与我想要的略有不同的事情,因为再次没有将每一个点都匹配到一个并且只有一个点。(或者更好的是,在它的输出中,实际上我认为它只是根据首先声明为最接近的点来选择它)你有什么建议吗?
基本上给出了两个点列表(大小相同),我想用距离来匹配这些点(我想任何距离指标都可以,也许欧几里德和曼哈顿是最好的)。如果可能的话,在找到匹配之后,我希望能够输出一个“相似度得分”。有什么想法吗?
最佳答案
计算list1和list2中所有元素之间的所有距离排列这些距离(实际上,这些对象将包含距离和对两个端点的引用)获取最小距离并配对该距离的端点。
然后得到下一个最小的距离,其中没有一个端点是成对的。继续,直到所有点都配对。
不幸的是,该算法具有O(N2)复杂度。只要您只需要将list与几百个(或者几千个)元素进行比较,它就可以工作。除此之外,它可能会非常缓慢。。。
关于python - sklearn:测量不同组自变量之间的相似性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45794540/