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 个元素是相同的点,而只有一个元素发生了变化。也就是说:
points2
中的[0,0]
是points1
中离[0,0]
最近的点,points1
中的[0,0]
是离points1
最近的点[0,0]
在 points2
.
points2
中的[0,1]
是points1
中最接近[0,1]
的点,points1
中的[0,1]
是最接近points1
中的点[0,1]
在 points2
.
points2
中的[1,0]
是points1
中最接近[1,0]
的点,points1
中的[1,0]
是最接近points1
中的点[1,0]
在 points2
.
[0,1]
, [1,0],
[2,1]
in points2
是最接近 points1
中的 [1,1]
和 [1,1]
中的点points1
是 points2
中最接近 [2,1]
的点
注意我是如何指定这两种方式的!事实上,第一个列表中的一个点可能最接近第二个列表中的一个点,但反之则不然! (即第二个列表中可能有一个点实际上最接近第一个列表中的同一点)。
另外,请注意在最后一个要点中我们有 3 个最接近 [1,1]
的点。但是,在多个点最接近给定点的情况下,我想消除那些已经找到 different 最近点的点。例如,在最后一个要点中,我将 points2
中的 [2,1]
作为最接近 [1,1]
的点,因为 points2
中的 [0,1]
认为 [0,1]
在 points1
中最接近,类似地 [1,0]
在 points2
中认为 [1,0]
在 points1
中最接近,所以它们已经是 "shipped" 或 "busy".
我的问题
现在给定两个相同维度的数组(如上),即它们包含相同数量的点,我希望能够找到一个匹配项(或如果没有唯一匹配项则匹配)这样:
points1
中的每个点都与 points2
中的一个且仅一个点匹配。这样 points2
中的每个点都与 points1
中的一个点匹配。
- 这些匹配是因为它们最接近。想象一下,我只有这些点列表中的一个,并且我对每个点应用了随机冲击。然后我想基本上 "guess" 每个点的去向(它们应该是最近的,但不要介意这部分)。
我该怎么做?
我的尝试
首先,我尝试编写一个函数来循环遍历 points1
中的点,并针对每个点计算到 [=13= 中每个点的距离].在此之后,我将遍历这些距离列表中的每一个,对它们进行排序并找到最小值。因此,我会将每个点与距离最小的点相匹配。然而,这就陷入了一个问题,如果 a 最接近 be,并不意味着 b 最接近 a,因此你最终会得到许多点匹配到一个点的匹配,依此类推。
- 我尝试使用
sklearn.metrics.pairwise_distances_argmin_min(Y,X)
,您可以阅读 here,但它似乎做的事情与我想要的略有不同,因为再次没有将每个点与一个且仅一个匹配。 (或者更好的是,在它的输出中,实际上我认为它只是根据最先声明的点来选择它)
你有什么建议吗?
基本上给定两个点列表(大小相同)我想按距离匹配点(我想任何距离度量都可以,也许欧几里德和曼哈顿最好)。如果可能的话,在找到这个匹配后,我希望能够输出一个"similarity score"。有什么想法吗?
计算list1 和list2 中所有元素之间的所有距离。订购这些距离。 (实际上这些将是包含距离和对两个端点的引用的对象)获取最小距离并将该距离的端点配对。
然后获取下一个最小距离,其中 none 个端点已配对。继续,直到所有点都配对。
不幸的是,这个算法的复杂度为 O(n2)。只要您必须将列表与只有几百(或可能是数千)个元素进行比较,它就可以工作。超过它可能会非常慢...
假设,我们有
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]
是points1
中离[0,0]
最近的点,points1
中的[0,0]
是离points1
最近的点[0,0]
在points2
.[0,1]
是points1
中最接近[0,1]
的点,points1
中的[0,1]
是最接近points1
中的点[0,1]
在points2
.[1,0]
是points1
中最接近[1,0]
的点,points1
中的[1,0]
是最接近points1
中的点[1,0]
在points2
.[0,1]
,[1,0],
[2,1]
inpoints2
是最接近points1
中的[1,1]
和[1,1]
中的点points1
是points2
中最接近
points2
中的points2
中的points2
中的[2,1]
的点
注意我是如何指定这两种方式的!事实上,第一个列表中的一个点可能最接近第二个列表中的一个点,但反之则不然! (即第二个列表中可能有一个点实际上最接近第一个列表中的同一点)。
另外,请注意在最后一个要点中我们有 3 个最接近 [1,1]
的点。但是,在多个点最接近给定点的情况下,我想消除那些已经找到 different 最近点的点。例如,在最后一个要点中,我将 points2
中的 [2,1]
作为最接近 [1,1]
的点,因为 points2
中的 [0,1]
认为 [0,1]
在 points1
中最接近,类似地 [1,0]
在 points2
中认为 [1,0]
在 points1
中最接近,所以它们已经是 "shipped" 或 "busy".
我的问题
现在给定两个相同维度的数组(如上),即它们包含相同数量的点,我希望能够找到一个匹配项(或如果没有唯一匹配项则匹配)这样:
points1
中的每个点都与points2
中的一个且仅一个点匹配。这样points2
中的每个点都与points1
中的一个点匹配。- 这些匹配是因为它们最接近。想象一下,我只有这些点列表中的一个,并且我对每个点应用了随机冲击。然后我想基本上 "guess" 每个点的去向(它们应该是最近的,但不要介意这部分)。
我该怎么做?
我的尝试
首先,我尝试编写一个函数来循环遍历
points1
中的点,并针对每个点计算到 [=13= 中每个点的距离].在此之后,我将遍历这些距离列表中的每一个,对它们进行排序并找到最小值。因此,我会将每个点与距离最小的点相匹配。然而,这就陷入了一个问题,如果 a 最接近 be,并不意味着 b 最接近 a,因此你最终会得到许多点匹配到一个点的匹配,依此类推。- 我尝试使用
sklearn.metrics.pairwise_distances_argmin_min(Y,X)
,您可以阅读 here,但它似乎做的事情与我想要的略有不同,因为再次没有将每个点与一个且仅一个匹配。 (或者更好的是,在它的输出中,实际上我认为它只是根据最先声明的点来选择它)
- 我尝试使用
你有什么建议吗?
基本上给定两个点列表(大小相同)我想按距离匹配点(我想任何距离度量都可以,也许欧几里德和曼哈顿最好)。如果可能的话,在找到这个匹配后,我希望能够输出一个"similarity score"。有什么想法吗?
计算list1 和list2 中所有元素之间的所有距离。订购这些距离。 (实际上这些将是包含距离和对两个端点的引用的对象)获取最小距离并将该距离的端点配对。 然后获取下一个最小距离,其中 none 个端点已配对。继续,直到所有点都配对。
不幸的是,这个算法的复杂度为 O(n2)。只要您必须将列表与只有几百(或可能是数千)个元素进行比较,它就可以工作。超过它可能会非常慢...