点和曲线之间的最小距离,其中某些点没有优化器

时间:2019-07-25 21:56:22

标签: python numpy mathematical-optimization normals scipy-optimize

我有一个包含经度和纬度的数据集,我对其应用了四阶线性回归,然后使用{{1}来获取到回归的每个数据点的最小距离(即normal vector) }从fmin_cobyla开始运行,就像我在此guide中发现的那样。

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

COBYLA finding a solution

但是,当我在其他一些数据点上进行测试时,优化器找不到解决方案,而是将数据点本身作为解决方案。以下是lat_t = 45.1779571long_t = 130.4183692的示例,它们的优化lat_t = 31.5231443输出K(基本上是同一点):

COBYLA entering panic mode

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

Finding patterns for this issue

起初,我认为可能与初始猜测[130.41821497 31.52316012]是曲线上方的设定点有关,因此可以使它们在这些情况下找到局部最小值,但是更改这些参数并没有取得成功,都不能通过将其设置在曲线下方,数据点本身,靠近数据点的点或曲线上经度相同的点来实现。

为什么COBYLA优化器适用于曲线上方而不是下方的那些数据点?我是否应该使用此优化程序解决我要解决的问题?如果没有,您会推荐哪种优化器以及如何实现呢?

1 个答案:

答案 0 :(得分:1)

我无法评论COBYLA优化器的行为。但是,您可以简化操作,只需注意您的问题就可以针对x变量表达为不受约束的问题,因为y可以替换为{{1} }。然后,您可以致电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)]))