解决方案
这是用于拟合表单点的完整工作示例(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]
这意味着,粗略地说,最小化是找到一组随机测试点的质心,正如预期的那样。如果您想对表单的点进行 2D 拟合(x, y)
,您可以执行以下操作:
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)