最小二乘算法之我见(一)
来源:互联网 发布:mac俄罗斯红色号 编辑:程序博客网 时间:2024/05/22 07:58
提到最小二乘算法,大家一定会首先想到用它进行直线拟合,那么下面我就从直线拟合开始说起:
一、基本直线拟合
给定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/) 中,用了不同的直线表示方法,即参数式直线方程,也给出了相应代码,可参考。
- 最小二乘算法之我见(一)
- PLS 偏最小二乘算法 demo <一>
- 最小二乘(LS)与总体最小二乘(TLS)总结一
- 偏最小二乘回归(PLSR)算法原理
- 偏最小二乘回归(PLSR)算法原理
- 投影矩阵与最小二乘(一)
- 投影矩阵与最小二乘(一)
- 最小二乘回归树生成算法
- 最小二乘算法 C 语言实现
- 最小二乘学习算法基础
- 最小二乘曲线拟合——C语言算法实现一
- 回归分析-(偏)最小二乘
- 最小二乘(Least Squares)
- 最小二乘问题(下)
- 说说最小二乘
- 最小二乘拟合
- 最小二乘
- 最小二乘拟合
- 使用python和android模拟器做android程序的自动化测试
- 移位操作
- 实现点击箭头,展示更多text内容
- http://www.jianshu.com/p/cf446be43ae8
- 用js写一个可以拖拽的浮动窗口
- 最小二乘算法之我见(一)
- 自定义环形菜单
- Linux 内核 SCSI IO 子系统分析
- Android ICU data 文件编译
- 用IO流写的一个登录注册的小程序
- tomcat中同时部署两个项目的问题
- Groovy快速入门掌握及环境搭建(ubuntu 14.04+IntelliJ 13)
- Android Settings app内存泄露问题
- 多线程 NSThread GCD NSOperation 基础篇