问题描述
最小二乘(scipy.linalg.lstsq
)保证收敛。实际上,有一个封闭形式的解析解(由给出(A^T A)^-1
A^Tb
(其中^T
矩阵转置和^-1
矩阵求逆)
但是,标准优化问题通常无法解决-我们不能保证找到一个最小值。然而,对于给定的公式,发现一些a, b, c
这样z = a*x + b*y +
c
,我们有一个线性优化问题(的约束条件和目标是变量,我们正在努力,以优化线性)。线性优化问题通常可以解决,因此scipy.optimize.minimize
应收敛到最优值。
注意:即使我们这样做,它在约束中也是线性的z = a*x + b*y + d*x^2 + e*y^2 +
f
-我们不必将自身限制为的线性空间(x,y)
,因为我们已经有了这些点(x, y, x^2,
y^2)
。对于我们的算法,这些看起来就像矩阵中的点A
。因此,实际上我们可以使用最小二乘法获得一个高阶多项式!
实际上,所有不使用精确解析解的求解器通常都停在实际答案的可接受范围内,因此,很少有我们获得 精确 解的情况,但往往如此最后,我们接受它在实践中是准确的。此外,即使是最小二乘解算器也很少使用分析解决方案,而是求助于更快的方法,例如牛顿法。
如果要更改优化问题,那将不是事实。我们通常可以为某些类型的问题找到一个最佳值(其中最大的一类称为凸优化问题- 尽管有很多非凸问题可以在某些条件下找到一个最佳值)。
如果您想了解更多信息,请查看Boyd和Vandenberghe的Convex Optimization。第一章不需要太多的数学背景,它概述了一般的优化问题及其与线性和凸规划等可解决的优化问题的关系。
解决方法
给定3D中的一组点,通常的问题是找到a,b,c
以下形式的平面方程的系数:
z = a*x + b*y + c
从而使所得平面 最适合 该组点。
- 在此SO答案中,函数scipy.optimize.minimize用于解决此问题。
它依赖于对系数的初始猜测,并最小化了将每个点到平面表面的距离相加的误差函数。
- 在此代码中(基于此另一个SO答案),scipy.linalg.lstsq函数用于解决相同的问题(仅限于一阶多项式时)。
它C
在等式中求解z = A*C
,其中A
是x,y
点集的坐标的并置,z
是点集的z
坐标,C
是a,c
系数。
与上述方法中的代码不同,此代码似乎不需要对平面系数进行初步猜测。
由于该
minimize
函数需要初始猜测,因此这意味着它可能会收敛或可能不会收敛到最优解(取决于猜测的好坏)。第二种方法是否有类似的警告,还是会返回始终精确的解决方案?