最优搜索,找到与其他点的距离之和最小的点
Optimal search, finding a point where the sum of distances to other points is the smallest
我有k个点,我想找到一个离它们最近的(不同的)点(新点和给定点之间的距离之和最小)
飞机上八分
如何编写一个程序,在 n 维 space 中给定 k 个点(例如 10 维 space 中的 16 个点)
如何编写这样的求解器?
但是,我不想使用现成的功能,虽然我会接受这样的解决方案
与其他点的距离之和最小的点称为这些点的空间中位数,也称为geometric median。可以通过R包Gmedian
.
中实现的Weiszfeld算法推导出来
让我们用你的例子试试:
library(Gmedian)
X <- rbind(
c(3, 4),
c(5, 3),
c(1, 8),
c(4, 6),
c(6, 6),
c(0, 1),
c(4, 6),
c(2, 1)
)
W <- Weiszfeld(X)
> W
$median
[,1] [,2]
[1,] 3.472091 4.607492
$iter
[1] 76
这是获取距离总和的方法:
smedian <- c(W$median)
sum(
apply(X, 1, function(x){
sqrt(crossprod(x-smedian))
})
)
# 21.95253
正如你所看到的,空间中位数与你得到的不同((4,4)
),并且距离之和小于你得到的(22.84819
)。
我有k个点,我想找到一个离它们最近的(不同的)点(新点和给定点之间的距离之和最小)
飞机上八分
如何编写一个程序,在 n 维 space 中给定 k 个点(例如 10 维 space 中的 16 个点)
如何编写这样的求解器?
但是,我不想使用现成的功能,虽然我会接受这样的解决方案
与其他点的距离之和最小的点称为这些点的空间中位数,也称为geometric median。可以通过R包Gmedian
.
让我们用你的例子试试:
library(Gmedian)
X <- rbind(
c(3, 4),
c(5, 3),
c(1, 8),
c(4, 6),
c(6, 6),
c(0, 1),
c(4, 6),
c(2, 1)
)
W <- Weiszfeld(X)
> W
$median
[,1] [,2]
[1,] 3.472091 4.607492
$iter
[1] 76
这是获取距离总和的方法:
smedian <- c(W$median)
sum(
apply(X, 1, function(x){
sqrt(crossprod(x-smedian))
})
)
# 21.95253
正如你所看到的,空间中位数与你得到的不同((4,4)
),并且距离之和小于你得到的(22.84819
)。