我有一个包含经度和纬度的数据集,我对其应用了四阶线性回归,然后使用{{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
,我们可以绘制数据集,回归线以及该点和曲线之间的线段,如下所示:
但是,当我在其他一些数据点上进行测试时,优化器找不到解决方案,而是将数据点本身作为解决方案。以下是lat_t = 45.1779571
和long_t = 130.4183692
的示例,它们的优化lat_t = 31.5231443
输出K
(基本上是同一点):
我发现,对整个数据集应用优化后,低于回归曲线的所有数据点都会出现此问题:
起初,我认为可能与初始猜测[130.41821497 31.52316012]
是曲线上方的设定点有关,因此可以使它们在这些情况下找到局部最小值,但是更改这些参数并没有取得成功,都不能通过将其设置在曲线下方,数据点本身,靠近数据点的点或曲线上经度相同的点来实现。
为什么COBYLA优化器适用于曲线上方而不是下方的那些数据点?我是否应该使用此优化程序解决我要解决的问题?如果没有,您会推荐哪种优化器以及如何实现呢?
答案 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)]))