最小二乘算法之我见(一)
2016-04-29 13:30
337 查看
提到最小二乘算法,大家一定会首先想到用它进行直线拟合,那么下面我就从直线拟合开始说起:
一、基本直线拟合
给定N个二维空间中的点,每个点用
来表示,最小二乘法进行直线拟合的基本思想是通过最小化下面的误差函数来求取直线参数:
求取误差函数对两个直线参数的偏导数,并令其值为0:
简单整理,可以列出如下二元一次方程组:
按照如下方式定义3个变量:
其中矩阵A的行列式为:
通过解二元一次方程组或者利用矩阵求逆运算,可以得到直线参数:
至此,我们求出了拟合出来的直线方程:
这篇博文中(http://blog.sina.com.cn/s/blog_648868460100hevs.html)也给出了类似的解法,而且还分析了相关系数。
二、"正规方程(Normal Equation)" 解法
斯坦福大学机器学习课程CS229中,Andrew Ng讲到用Normal Equation来求解线性回归(回归和拟合大体上一致):用m来表示点的数目,此外,误差函数与我的定义也稍有不同,求解过程如下:
首先定义一系列符号:
这里要注意的是,X矩阵的最后一列全是1,即将每个点的x坐标扩展成齐次坐标形式。
最终求得参数为:
三、扩展1——平面拟合
本质上,上述两种方法是一致的;但从可扩展性来说,正规方程方法要优于传统方法,比如,如果要进行平面拟合,传统方法要解三元一次方程组;而正规方程方法天然是可以扩展的,可以很容易扩展到平面拟合,甚至更高维空间(超平面拟合)。
在这篇博文中(http://bbs.bccn.net/thread-287643-1-1.html),eastlife0108 给出了直线拟合、平面拟合到超平面拟合的统一代码,可参考。
四、扩展2——一般线性拟合(二次曲线等)
另外一个扩展就是从直线拟合到二次曲线(抛物线)以及高次曲线拟合,这也属于线性拟合范畴,因为待求参数之间是没有相互关系的(不知道这样解释合不合理?),而像神经网络或者Deep Learning中,后一层的参数是前面所有层参数的函数,因此是非线性的。对于非线性拟合,没有像正规方程那样的close-form解法,更没有解析解,只能用最优化算法迭代求解,比如,梯度下降法,牛顿法等;而对于线性拟合,既可以像正规方程那样来求解,也可以用最优化算法迭代求解。
有些跑题了,继续说扩展2,从直线拟合到二次曲线(抛物线)以及高次曲线拟合,这篇博文(http://blog.csdn.net/jairuschan/article/details/7517773/)
给出了算法原理和代码,可参考。
五、特殊情况
我们回到第一部分,即基本直线拟合,看看有什么纰漏。你会发现当矩阵A的行列式值等于0时(对应的情况是所有的点的x坐标值是完全一样的,即直线方程为:x=c),该方法失效了;同样,正规方法的方法也失效了,因为X矩阵的转置与X矩阵相乘得到的矩阵不可逆。
解决办法就是像博文(http://blog.sina.com.cn/s/blog_a4b7770601016f33.html)那样,用类似a*x+b*y+c=0这种通用形式来表示直线方程。在《计算机视觉——一种现代方法》一书中的“摄像机的几何标定”章节中就是用这种方法来进行直线拟合的。
此外,博文(http://buaagc.blog.163.com/blog/static/72788394200951134251578/) 中,用了不同的直线表示方法,即参数式直线方程,也给出了相应代码,可参考。
一、基本直线拟合
给定N个二维空间中的点,每个点用
来表示,最小二乘法进行直线拟合的基本思想是通过最小化下面的误差函数来求取直线参数:
求取误差函数对两个直线参数的偏导数,并令其值为0:
简单整理,可以列出如下二元一次方程组:
按照如下方式定义3个变量:
其中矩阵A的行列式为:
通过解二元一次方程组或者利用矩阵求逆运算,可以得到直线参数:
至此,我们求出了拟合出来的直线方程:
这篇博文中(http://blog.sina.com.cn/s/blog_648868460100hevs.html)也给出了类似的解法,而且还分析了相关系数。
二、"正规方程(Normal Equation)" 解法
斯坦福大学机器学习课程CS229中,Andrew Ng讲到用Normal Equation来求解线性回归(回归和拟合大体上一致):用m来表示点的数目,此外,误差函数与我的定义也稍有不同,求解过程如下:
首先定义一系列符号:
这里要注意的是,X矩阵的最后一列全是1,即将每个点的x坐标扩展成齐次坐标形式。
最终求得参数为:
三、扩展1——平面拟合
本质上,上述两种方法是一致的;但从可扩展性来说,正规方程方法要优于传统方法,比如,如果要进行平面拟合,传统方法要解三元一次方程组;而正规方程方法天然是可以扩展的,可以很容易扩展到平面拟合,甚至更高维空间(超平面拟合)。
在这篇博文中(http://bbs.bccn.net/thread-287643-1-1.html),eastlife0108 给出了直线拟合、平面拟合到超平面拟合的统一代码,可参考。
四、扩展2——一般线性拟合(二次曲线等)
另外一个扩展就是从直线拟合到二次曲线(抛物线)以及高次曲线拟合,这也属于线性拟合范畴,因为待求参数之间是没有相互关系的(不知道这样解释合不合理?),而像神经网络或者Deep Learning中,后一层的参数是前面所有层参数的函数,因此是非线性的。对于非线性拟合,没有像正规方程那样的close-form解法,更没有解析解,只能用最优化算法迭代求解,比如,梯度下降法,牛顿法等;而对于线性拟合,既可以像正规方程那样来求解,也可以用最优化算法迭代求解。
有些跑题了,继续说扩展2,从直线拟合到二次曲线(抛物线)以及高次曲线拟合,这篇博文(http://blog.csdn.net/jairuschan/article/details/7517773/)
给出了算法原理和代码,可参考。
五、特殊情况
我们回到第一部分,即基本直线拟合,看看有什么纰漏。你会发现当矩阵A的行列式值等于0时(对应的情况是所有的点的x坐标值是完全一样的,即直线方程为:x=c),该方法失效了;同样,正规方法的方法也失效了,因为X矩阵的转置与X矩阵相乘得到的矩阵不可逆。
解决办法就是像博文(http://blog.sina.com.cn/s/blog_a4b7770601016f33.html)那样,用类似a*x+b*y+c=0这种通用形式来表示直线方程。在《计算机视觉——一种现代方法》一书中的“摄像机的几何标定”章节中就是用这种方法来进行直线拟合的。
此外,博文(http://buaagc.blog.163.com/blog/static/72788394200951134251578/) 中,用了不同的直线表示方法,即参数式直线方程,也给出了相应代码,可参考。
相关文章推荐
- 20145315 《Java程序设计》实验四实验报告
- Java Executors(线程池)
- [IOS 开发] 安装CocoaPods
- 炉石传说-鱼人骑士-斩杀计算器-Android
- IIS:错误处理
- 要删除共享的初始登陆名 cmd下输入net use * /delete
- 使用python和android模拟器做android程序的自动化测试
- GDOI2016酱油记
- Xamarin之百度地图要点
- setter,getter,@property,@synthesize
- 整数规划求解有向图最短路径问题环路解决方法
- 我为什么反对RESTful
- spark1.4
- 20145315 《Java程序设计》第九周学习总结
- MongoDB -- MongoClient连接池用法
- 剑指offer(4) 两个栈实现队列
- 几个玩具代码(不用main的编程)
- Webx系列之文件上传
- yii2 rbac权限控制详细操作步骤
- chr(), hex()