sklearn:测量不同自变量集之间的相似性

sklearn: Measuring similarities between different sets of independent variables

假设,我们有

 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 个元素是相同的点,而只有一个元素发生了变化。也就是说:

注意我是如何指定这两种方式的!事实上,第一个列表中的一个点可能最接近第二个列表中的一个点,但反之则不然! (即第二个列表中可能有一个点实际上最接近第一个列表中的同一点)。

另外,请注意在最后一个要点中我们有 3 个最接近 [1,1] 的点。但是,在多个点最接近给定点的情况下,我想消除那些已经找到 different 最近点的点。例如,在最后一个要点中,我将 points2 中的 [2,1] 作为最接近 [1,1] 的点,因为 points2 中的 [0,1] 认为 [0,1]points1 中最接近,类似地 [1,0]points2 中认为 [1,0]points1 中最接近,所以它们已经是 "shipped" 或 "busy".

我的问题

现在给定两个相同维度的数组(如上),即它们包含相同数量的点,我希望能够找到一个匹配项(或如果没有唯一匹配项则匹配)这样:

我该怎么做?

我的尝试

  1. 首先,我尝试编写一个函数来循环遍历 points1 中的点,并针对每个点计算到 [=13= 中每个点的距离].在此之后,我将遍历这些距离列表中的每一个,对它们进行排序并找到最小值。因此,我会将每个点与距离最小的点相匹配。然而,这就陷入了一个问题,如果 a 最接近 be,并不意味着 b 最接近 a,因此你最终会得到许多点匹配到一个点的匹配,依此类推。

    1. 我尝试使用 sklearn.metrics.pairwise_distances_argmin_min(Y,X),您可以阅读 here,但它似乎做的事情与我想要的略有不同,因为再次没有将每个点与一个且仅一个匹配。 (或者更好的是,在它的输出中,实际上我认为它只是根据最先声明的点来选择它)

你有什么建议吗?

基本上给定两个点列表(大小相同)我想按距离匹配点(我想任何距离度量都可以,也许欧几里德和曼哈顿最好)。如果可能的话,在找到这个匹配后,我希望能够输出一个"similarity score"。有什么想法吗?

计算list1 和list2 中所有元素之间的所有距离。订购这些距离。 (实际上这些将是包含距离和对两个端点的引用的对象)获取最小距离并将该距离的端点配对。 然后获取下一个最小距离,其中 none 个端点已配对。继续,直到所有点都配对。

不幸的是,这个算法的复杂度为 O(n2)。只要您必须将列表与只有几百(或可能是数千)个元素进行比较,它就可以工作。超过它可能会非常慢...