python - 点与曲线之间的最小距离,优化器对某些点失败

标签 python numpy mathematical-optimization normals scipy-optimize

我有一个包含纬度和经度的数据集,我对其应用了四阶线性回归,然后继续使用 fmin_cobyla 获取每个数据点到回归的最小距离(即 normal vector )。来自 scipy.optimize 的函数,正如我在 guide 中找到的那样.

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 finding a solution

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

COBYLA entering panic mode

据我所知,在对整个数据集应用优化后,所有低于回归曲线的数据点都会出现此问题:

Finding patterns for this issue

起初,我认为这可能与最初的猜测 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

关于python - 点与曲线之间的最小距离,优化器对某些点失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57210613/

相关文章:

python - Cython:为什么 size_t 比 int 快?

python - 我不明白为什么我的数据集中的列是 NaN

python - 比较矩阵中相邻单元格的更好方法

module - Mathematica 模块不返回值

python - NLopt 无效参数

python - 用于查找和替换 .csv 中文本的脚本不适用于 "=$"

python - Python 2.7.x 中部分函数的动态生成

python - 在 for 循环内构造一个 numpy 数组

Python/numpy 追加数组、转置并另存为 csv

math - Mathematica 中的整数优化?