最近邻矢量匹配无需替换

时间:2018-03-03 07:02:36

标签: r nearest-neighbor

我想在R中执行以下操作:对于向量X中的每个元素,我想要向量Y中的最近邻居,使得每个X-Y匹配之间的绝对差值的总和最小化。向量Y至少与向量X一样长。

问题是:我想在没有更换的情况下这样做。例如,给定:

X= c(3, 6)
Y= c(1, 2, 4, 10),

我想获得Z= c(2, 4),因为匹配3到2和6到4会产生比匹配3到4和6到10更小的总距离。

*这是我的第一个堆栈问题,所以提前道歉我在提出问题时遇到的任何错误。

更新:要使用@ merv更具说明性的示例和术语,我正在寻找匹配的全局最优,而不是局部最优(第一/贪婪匹配)。例如,如果X= c(3,7)Y= c(1,4,12),我想获得曼哈顿距离为5的Z= c(1, 4)。我不想要第一个/贪婪的匹配,这将是{{1 - 这将通过找到3的最接近匹配,然后是7的最接近匹配来获得。

2 个答案:

答案 0 :(得分:2)

暴力

如果您可以假设大多数输入的大小都很小,那么最简单的方法是扩展搜索空间的所有可能组合。

uniqueNearestNeighbor <- function (X, Y) {
  zs <- combn(Y, length(X))
  dists <- apply(zs, 2, function (z) sum(abs(X - z)))
  return(zs[,which.min(dists)])
}

请注意,这假设您的向量都已排序。

> uniqueNearestNeighbor(c(3, 7), c(1, 4, 12))
[1] 1 4

如果您有一个较大的搜索空间(Y),但是低维输入(X),您可以修剪搜索空间以帮助限制组合的数量。例如,您可以安全地排除YX中不是 k - 最近邻居的所有点,其中 k < / em>是X的维度。

算法方法

如果你确实有一个庞大的搜索空间并且修剪不足以减轻问题,或者如果你将反复计算它并且它成为一个明显的瓶颈,你将需要采用更复杂的方法。在我的头脑中,我认为the A* algorithm似乎是适合这个问题的。对于可接受的启发式函数,可以使用X中每个点与Y中最近邻居的距离之和。在每次迭代中,将X中的一个点分配给最近的邻居,然后使用该点继续向下移动树并移除其受让人。如果x中的给定X具有多个最近邻居(例如,x = 2Y包含1和3),则必须在搜索空间中包含这两个选项。

由于所有全局最优值XY的可证明属性,x中至少有一个X,这将达到全局最优被分配到Y中最近的邻居。因此,所描述的树将包含所有可能的全局最优,并且因为 A * 是广度优先搜索,所以保证找到其中一个。

如果您需要走这条路线,可能还值得在cs.stackexchange.com询问,因为可能有更合适的算法。

答案 1 :(得分:-1)

这是一个优化问题。您需要的是使用匈牙利算法,它完全符合您的要求。