我想在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的最接近匹配来获得。
答案 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
),您可以修剪搜索空间以帮助限制组合的数量。例如,您可以安全地排除Y
中X
中不是 k - 最近邻居的所有点,其中 k < / em>是X
的维度。
如果你确实有一个庞大的搜索空间并且修剪不足以减轻问题,或者如果你将反复计算它并且它成为一个明显的瓶颈,你将需要采用更复杂的方法。在我的头脑中,我认为the A* algorithm似乎是适合这个问题的。对于可接受的启发式函数,可以使用X
中每个点与Y
中最近邻居的距离之和。在每次迭代中,将X
中的一个点分配给最近的邻居,然后使用该点继续向下移动树并移除其受让人。如果x
中的给定X
具有多个最近邻居(例如,x = 2
且Y
包含1和3),则必须在搜索空间中包含这两个选项。
由于所有全局最优值X
和Y
的可证明属性,x
中至少有一个X
,这将达到全局最优被分配到Y
中最近的邻居。因此,所描述的树将包含所有可能的全局最优,并且因为 A * 是广度优先搜索,所以保证找到其中一个。
如果您需要走这条路线,可能还值得在cs.stackexchange.com询问,因为可能有更合适的算法。
答案 1 :(得分:-1)
这是一个优化问题。您需要的是使用匈牙利算法,它完全符合您的要求。