给定一组 3D 点,一般问题是找到a, b, c
平面方程的系数,形式为:
z = a*x + b*y + c
这样得到的平面就是best fit可能到那组点。
-
In 这个答案 https://stackoverflow.com/a/20700063/1391441, 功能scipy.优化.最小化 http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.optimize.minimize.html就是用来解决这个问题的。
它依赖于对系数的初始猜测,并最小化误差函数,该误差函数将每个点到平面表面的距离相加。
-
In 这段代码 https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6(基于这另一个答案 https://stackoverflow.com/a/18648210/97160) the scipy.linalg.lstsq http://docs.scipy.org/doc/scipy-0.16.1/reference/generated/scipy.linalg.lstsq.html函数用于解决相同的问题(当限制为一阶多项式时)。
它解决了C
在等式中z = A*C
, where A
是的串联x,y
点集的坐标,z
is the z
集合的坐标,以及C
是a,b,c
系数。
与上述方法中的代码不同,该方法似乎不需要对平面系数进行初始猜测。
自从minimize
函数需要初始猜测,这意味着它可能会也可能不会收敛到最优解(取决于猜测的好坏)。第二种方法是否有类似的警告,或者它会返回始终精确的解决方案?
最小二乘法 (scipy.linalg.lstsq
) 保证收敛。事实上,存在一个封闭形式的解析解(由下式给出)(A^T A)^-1 A^Tb
(where ^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
。所以我们实际上可以使用最小二乘法得到更高阶多项式!
简要说明一下:实际上,所有不使用精确解析解的求解器通常都会停止在实际答案的某个可接受的范围内,因此我们很少会得到exact解,但它往往非常接近,以至于我们在实践中认为它是精确的。此外,即使是最小二乘求解器也很少使用解析解,而是采用更快的方法,例如牛顿法。
如果你要改变优化问题,情况就不是这样了。对于某些类别的问题,我们通常可以找到最佳值(其中最大的一类称为凸优化问题 - 尽管有许多非凸问题,我们可以在某些条件下找到最佳值)。
如果您有兴趣了解更多信息,请查看凸优化 https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf博伊德和范登堡。第一章不需要太多的数学背景,它概述了一般优化问题以及它与可解优化问题(如线性和凸规划)的关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)