《用Python学习数值分析--最小二乘》

2017-08-31

  我不太想写“程序员系列之”或者“程序员数学之”这样的标题,便弄个小标题吧,每个人的工作不同,要求的知识点深度也不一样,如果有需要,看看即可。最小二乘,对于计算机系的同学来讲是非常重要的数学基础,它对于数理统计的重要性无需多言了。做算法的同学所需的”数值分析“、”最优化“两门课程之中,least squares是重点。机器学习教材ESL一上来就是重点讲解least squares。总之,一句话总结:这个问题,值得你花上一天、甚至几天的时间去完整的学习。至于”最小二乘“意义、使用场景和推导计算过程,在数值分析的书里是没有仔细讲解的,需要结合着看”优化”课程的教材来看。直观教学,请参考链接6、7 youtube上的视频,很简短的图形化演示教程,比看书快多了。但是,之后的详细推导计算过程,最好还是参考Introdution to Optimization 的 第12章。
  Least-squares 问题可以分为两类: linear least squaresnonlinear least squares

一,线性最小二乘
  对于linear最小二乘的问题,需要用QR分解。对于非对称方程组,主要使用GMRES方法。需要提到的是,矩阵于1850年左右被提出,解方程组的工具determinant却在1693 被提出。最小二乘问题的本质是最优化问题,和矩阵并无必然关系。我们面临的问题是解方程。矩阵只是其中一种表述方式。
  numpy和scipy分别提供了线性、非线性最小二乘问题求解的函数。由此我们也可猜测被使用的范围是不同的,作为更加底层的numpy,线性二乘被更广泛的使用。参考代码1可知:

  绿色曲线是根据点击生成的点按照二次曲线拟合二乘的。scipy.optimize.curve_fit() 内部就是使用nonlinear least squares来计算的,只是封装了一下。

二、非线性最小二乘
  对于non-linear最小二乘问题,解决方法有高斯-牛顿法、QR分解、Singular Value分解、梯度法、直接搜索法。不过,高斯-牛顿法(Levenberg-Marquardt修正)还是最重要的。scipy.optimize.least_squares()是重点(还有一个leastsq() ,这是一个deprecated的函数),它有17个明确的参数,可见算法的复杂度。所幸的是,绝大部分情况下,我们并不需要自己实现这些算法,只是简单的了解使用重点即可,且只有两个参数是需要显式提供的。这里简单讲解一下此函数。
  fun是你认为数据符合某类函数,如上图,你可以认为这些数据可以拟合为线性函数,只是采样的噪声有点大;也可以是二次函数,也可以是其他任何一类函数。
  x0是迭代的初始点,是一个vector。所有迭代法需要初始迭代点。
  其他的参数都可以是默认的。
  jac 表示雅可比矩阵,如果我们没有提供雅可比矩阵,就采用有限差分法来模拟。因为我们这样写程序,表述能力实在有限,没有办法根据fun对象来推导它的雅可比矩阵。当然了,有限差分法
  method是最小化的算法:trf’, ‘dogbox’, ‘lm’。执行最小化的算法,
  ftol,xtol,gtol:是用来控制误差的。
  x_scale,loss,f_scale,max_nfev,diff_step: loss参数很重要,就是loss function,默认是使用最小二乘,
  tr_solver,tr_options,jac_sparsity:和trust region最小化算法相关的参数,即当method为trf或dogbox时有效。

三、最小二乘很重要  
  非线性最小二乘也是optimization的重点内容,也是机器学习的regression问题中很重要的组成部分。Linear Regression的cost function是最小二乘。通常线性回归分析法是最基本的分析方法,遇到非线性回归问题可以借助数学手段化为线性回归问题处理。

 

 

  1. https://en.wikipedia.org/wiki/Least_squares
  2. https://www.zhihu.com/question/37031188
  3. 《正态分布的前世今生》 靳志辉
  4. Numerical Analysis    Timothy Sauer  chapt 4
  5. Introduction to Optimization    Edwin K. P. Chong
  6. Why a "least squares regression line" is called that
  7. Statistics 101: Simple Linear Regression
  8. scipy least_squares
如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)