Python 点与曲线之间的最小距离,某些点的优化程序失败

Python 点与曲线之间的最小距离,某些点的优化程序失败,python,numpy,mathematical-optimization,normals,scipy-optimize,Python,Numpy,Mathematical Optimization,Normals,Scipy Optimize,我有一个带有纬度和经度的数据集,我对其应用了四阶线性回归,然后使用scipy.optimize中的fmin_cobyla函数,得到了回归到每个数据点的最小距离(即) cobyla优化程序采用目标(即两点之间的距离)、初始猜测和约束(即,解决方案必须是回归曲线的一部分)。代码如下: def f(x): # Defines the regression equation return -1.28508857e-03 * x**4 + 7.06985581e-01 * x**3\

我有一个带有纬度和经度的数据集,我对其应用了四阶线性回归,然后使用
scipy.optimize
中的
fmin_cobyla
函数,得到了回归到每个数据点的最小距离(即)

cobyla
优化程序采用目标(即两点之间的距离)、初始猜测和约束(即,解决方案必须是回归曲线的一部分)。代码如下:

def f(x):
    # Defines the regression equation
    return -1.28508857e-03 * x**4 + 7.06985581e-01 * x**3\
           -1.45729975e+02 * x**2 + 1.33400956e+04 * x - 4.57556176e+05

def obj(X):
    # Defines the distance between two points
    # X is an array containing latitude and longitude
    # long_t and lat_t are global variables
    x, y = X
    return np.sqrt((x - long_t)**2 + (y - lat_t)**2)

def c1(X):
    # Creates the constraint so that a solution must be part of the regression curve
    x, y = X
    return f(x) - y

K = fmin_cobyla(obj, x0=[127.5, 33], cons=[c1])
例如,如果
long_t=141.2393842
lat_t=45.1779571
,我们可以绘制数据集、回归线和该点与曲线之间的线段,如下所示:

def f(x):
    # Defines the regression equation
    return -1.28508857e-03 * x**4 + 7.06985581e-01 * x**3\
           -1.45729975e+02 * x**2 + 1.33400956e+04 * x - 4.57556176e+05

def obj(X):
    # Defines the distance between two points
    # X is an array containing latitude and longitude
    # long_t and lat_t are global variables
    x, y = X
    return np.sqrt((x - long_t)**2 + (y - lat_t)**2)

def c1(X):
    # Creates the constraint so that a solution must be part of the regression curve
    x, y = X
    return f(x) - y

K = fmin_cobyla(obj, x0=[127.5, 33], cons=[c1])

然而,当我使用其他一些数据点进行测试时,优化者找不到解决方案,并将数据点本身作为解决方案。下面是一个具有
long\u t=130.4183692
lat\u t=31.5231443
的示例,其优化
K
输出
[130.41821497 31.52316012]
(基本上相同点):

正如我发现的,在对整个数据集进行优化后,回归曲线下方的所有数据点都会出现此问题:

起初,我认为这可能与初始猜测
x0
是曲线上方的一个设定点有关,从而使其在这些情况下找到局部最小值,但更改这些参数并没有取得成功,也没有通过将其设置在曲线下方,即数据点本身,靠近数据点的点或曲线上具有相同经度的点


为什么COBYLA Optimizer适用于曲线上方而非下方的数据点?我应该用这个乐观主义者来解决我试图解决的问题吗?如果没有,您会推荐哪种优化程序以及如何实现它?

我无法评论COBYLA优化程序的行为。但是,您可以通过注意到您的问题可以表述为关于
x
变量的无约束问题来简化问题,因为
y
可以被
f(x)
替换。然后,您可以调用
minimize\u scalar
以获得最佳值

让我们定义一个新的(标量)目标函数

def obj2(x):
    y = f(x)
    return np.sqrt((x - long_t)**2 + (y - lat_t)**2)
并为您在帖子中考虑的两个案例找到最佳的
x
。请注意,
minimize_scalar
不需要初始猜测

from scipy.optimize import minimize_scalar

# first (good) case
long_t = 141.2393842
lat_t = 45.1779571
sol1 = minimize_scalar(obj2)
print(sol1.x, f(sol1.x), c1([sol1.x, f(sol1.x)]))

# second (bad) case
long_t = 130.4183692
lat_t = 31.5231443
sol2 = minimize_scalar(obj2)
print(sol2.x, f(sol2.x), c1([sol2.x, f(sol2.x)]))

谢谢
minimize_scalar
完成了任务,没有数据点出现问题。