任务是找到一个坐标为(x,0)的点,以使距原始集合的最远点(距离为欧几里得)的距离最小。 我的想法是找到找到像这样的欧氏距离的函数的最小值:
import matplotlib.pyplot as plt
from scipy.spatial.distance import cdist
from scipy.optimize import minimize
def function_3(points_x, points_y):
dots = np.array([points_x,points_y])
ans = minimize(cdist(dots,points1),x0=0)
return(ans)
但是看来我做错了什么...有人可以提建议吗?
答案 0 :(得分:2)
下面是(x, 0)
形式的拟合点的完整工作示例:
from scipy.spatial.distance import cdist
from scipy.optimize import minimize
# set up a test set of 100 points to fit against
n = 100
xyTestset = np.random.rand(n,2)*10
def fun(x, xycomp):
# x is a vector, assumed to be of size 1
# cdist expects a 2D array, so we reshape xy into a 1x2 array
xy = np.array((x[0], 0)).reshape(1, -1)
return cdist(xy, xycomp).max()
fit = minimize(fun, x0=0, args=xyTestset)
print(fit.x)
输出:
[5.06807808]
粗略地说,这意味着最小化正按预期找到随机测试点集的质心。如果您想对(x, y)
形式的点进行2D拟合,则可以执行以下操作:
from scipy.spatial.distance import cdist
from scipy.optimize import minimize
# set up a test set of 100 points to fit against
n = 100
xyTestset = np.random.rand(n,2)*10
def fun(x, xycomp):
# x is a vector, assumed to be of size 2
return cdist(x.reshape(1, -1), xycomp).max()
fit = minimize(fun, x0=(0, 0), args=xyTestset)
print(fit.x)
输出:
[5.21292828 5.01491085]
正如您所期望的,它再次大致是xyTestset
中100个随机点的质心。
您遇到的问题是scipy.optimize.minimize
对第一个参数fun
的形式有非常特定的期望。 fun
应该是一个以x
作为第一个参数的函数,其中x
是要最小化的值的一维向量。 fun
也可以接受其他参数。必须通过args
参数将它们传递到最小化中,并且它们的值是恒定的(即,在最小化过程中它们不会改变)。
此外,您应该注意,适合(x, 0)
的情况可以简化。它实际上是一维问题,因此您所需要做的就是计算点之间的x距离。您可以完全忽略y距离,而仍然得到相同的结果。
此外,您无需最小化即可解决您所陈述的问题。重心是使到最远点的距离最小的点(与说“最小化所有点的距离”相同)。质心的坐标是一组点中每个坐标的均值,因此,如果将点存储在Nx2数组xydata
中,则可以通过执行以下操作来计算质心:
xydata.mean(axis=1)