点和曲线之间的最小距离,优化器对某些点失败
Minimum distance between a point and a curve with optimiser failing for some points
我有一个包含纬度和经度的数据集,我对其应用了四阶线性回归,然后继续获得最小距离(即 normal vector) to each datapoint to the regression using the fmin_cobyla
function from scipy.optimize
, as I had found in this guide.
cobyla
优化器采用 objective(即两点之间的距离)、初始猜测和约束(即解必须是回归曲线的一部分)。代码如下:
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
,我们可以绘制数据集、回归线和该点与曲线之间的线段,如下所示:
然而,当我用其他一些数据点进行测试时,优化器无法找到解决方案并将数据点本身作为解决方案。下面是一个 long_t = 130.4183692
和 lat_t = 31.5231443
的例子,其优化 K
输出 [130.41821497 31.52316012]
(本质上是同一个点):
据我所知,在对整个数据集应用优化后,低于 回归曲线的所有数据点都会出现此问题:
起初,我认为这可能与初始猜测有关 x0
是曲线上方的一个设定点,从而使其在这些情况下找到局部最小值,但更改这些参数并没有产生效果成功,无论是将其设置在曲线下方,数据点本身,靠近数据点的点还是曲线上相同经度的点。
为什么 COBYLA 优化器适用于曲线上方的数据点,但不适用于曲线下方的数据点?我应该使用这个优化器来解决我要解决的问题吗?如果不是,您会推荐哪个优化器以及如何实现它?
我无法评论 COBYLA 优化器的行为。但是,您可以通过注意您的问题可以表述为关于 x
变量的 unconstrained 问题来简化事情,因为 y
可以替换为 f(x)
。然后你可以打电话给 minimize_scalar
给你最佳值。
所以让我们定义一个新的(标量)objective函数作为
def obj2(x):
y = f(x)
return np.sqrt((x - long_t)**2 + (y - lat_t)**2)
并为您在 post 中考虑的两种情况找到最佳 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
我有一个包含纬度和经度的数据集,我对其应用了四阶线性回归,然后继续获得最小距离(即 normal vector) to each datapoint to the regression using the fmin_cobyla
function from scipy.optimize
, as I had found in this guide.
cobyla
优化器采用 objective(即两点之间的距离)、初始猜测和约束(即解必须是回归曲线的一部分)。代码如下:
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
,我们可以绘制数据集、回归线和该点与曲线之间的线段,如下所示:
然而,当我用其他一些数据点进行测试时,优化器无法找到解决方案并将数据点本身作为解决方案。下面是一个 long_t = 130.4183692
和 lat_t = 31.5231443
的例子,其优化 K
输出 [130.41821497 31.52316012]
(本质上是同一个点):
据我所知,在对整个数据集应用优化后,低于 回归曲线的所有数据点都会出现此问题:
起初,我认为这可能与初始猜测有关 x0
是曲线上方的一个设定点,从而使其在这些情况下找到局部最小值,但更改这些参数并没有产生效果成功,无论是将其设置在曲线下方,数据点本身,靠近数据点的点还是曲线上相同经度的点。
为什么 COBYLA 优化器适用于曲线上方的数据点,但不适用于曲线下方的数据点?我应该使用这个优化器来解决我要解决的问题吗?如果不是,您会推荐哪个优化器以及如何实现它?
我无法评论 COBYLA 优化器的行为。但是,您可以通过注意您的问题可以表述为关于 x
变量的 unconstrained 问题来简化事情,因为 y
可以替换为 f(x)
。然后你可以打电话给 minimize_scalar
给你最佳值。
所以让我们定义一个新的(标量)objective函数作为
def obj2(x):
y = f(x)
return np.sqrt((x - long_t)**2 + (y - lat_t)**2)
并为您在 post 中考虑的两种情况找到最佳 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