繁体   English   中英

优化器在某些点上失败的点和曲线之间的最小距离

[英]Minimum distance between a point and a curve with optimiser failing for some points

我有纬度和经度,其余施加4阶线性回归,然后继续以获得的最小距离(即,数据集法线向量使用),以每个数据点的回归fmin_cobyla从功能scipy.optimize ,因为我有在本指南中找到。

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.2393842lat_t = 45.1779571 ,我们可以绘制数据集、回归线以及该点与曲线之间的线段,如下所示:

COBYLA 寻找解决方案

但是,当我使用其他一些数据点进行测试时,优化器找不到解决方案,而是将数据点本身作为解决方案。 以下是long_t = 130.4183692lat_t = 31.5231443 ,其优化K输出[130.41821497 31.52316012] (本质上是同一点):

COBYLA 进入恐慌模式

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

查找此问题的模式

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

为什么 COBYLA 优化器适用于曲线上方的那些数据点,但不适用于曲线下方? 我应该使用这个优化器来解决我想要解决的问题吗? 如果没有,您会推荐哪种优化器以及如何实现它?

我无法评论 COBYLA 优化器的行为。 但是,您可以通过注意到您的问题可以表述为关于x变量的无约束问题来简化事情,因为y可以替换为f(x) 然后您可以调用minimize_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)]))
 143.4644668848802 43.30848453915678 0.0 129.46933497340797 32.164809729438275 0.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM