用python实现线性回归算法

最近开始在mooc上看吴恩达的《机器学习》课程,由于在线作业一直不能提交,总是提示错误,倒腾了一下午还是没能成,只好作罢。幸好手边有《机器学习实战》这本书,于是就用python来学习实现课程里面的算法。吴恩达的课程学习的第一个算法是线性回归,于是,我就开始看先学怎么写这个。

1.1理论部分:

回归的目的就是预测数值型的目标值。例如,你想要预测姐姐男友汽车的功率大小,公式如下:

线性回归-汽车功率

 

这个方程就是回归方程(regression equation),其中的0.0015和-0.99称作回归系数(regression weights),求这些系数的过程就是回归。

线性回归(linear regression)是回归中最主要的部分,指其函数图像通常是线性的。

多变量线性回归的方程为:

线性回归1

其中可以令X0=1,变为了:

线性回归2

这样就可将theta和x,y都看作是向量,将theta向量转置后可以变成如下简洁的公式:线性回归3

 

求解theta向量,可以使用梯度下降(gradient descent)和正规方程(normal equation)两种方法(具体请参看ng的讲义和视频),二者区别如下:

梯度下降与正规方程比较

 

《机器学习实战》中采用了正规方程的方法,如下:

正规方程

 

1.2代码实现:

regression代码

代码还是比较容易理解的。由于有的矩阵可能没有逆,因此在stahdRegres函数中的if语句做出了判断,linalg.det()可以计算行列式。

下面开始绘制数据集散点图和最佳拟合直线图,为了省事,为就直接把书上的代码截下来了:

2014-10-29 15:12:22 的屏幕截图

效果图如下:

sorted

至此,一个简单的线性回归算法就实现了。

因为没有用过matplotlib这个模块,因此有的代码我不是很明白,比如ax.scatter()中的代码,我将.flatten().A.[0]删除后,得到了如下的图:

no-flatten

我猜测.flatten().A.[0]应该是将集散点拉平把,希望懂得朋友能告诉我一下。

《机器学习实战》中说,如果直线上的数据点次序混乱,绘图时会出现问题,用了升序排列,xCopy.sort(0)这个方法。我试着将行代码去掉运行,得到了如下的图:

没排序

 

下面之所以会出现空白,是因为我将fig.add_subplot(111)改为了fig.add_subplot(211),即如下布局:

2014-10-29 15:27:02 的屏幕截图

看来我还是得好好看看matplotlib了,以上几个图都属于尝试性的。学习任何东西,都应该鼓励尝试的,你说对吗?

1.3 总结

线性回归应该算是机器学习中比较简单的算法了。因为自己的水平有限,在学习公式和实现代码的时候,有过许多的地方。比如我将regression.py中的readline和readlines写混了,产生了列表超出范围的莫名错误。为了找到这个错误的原因,我用了足足半个小时的时间才发现了错误所在。当然,这是新手常犯的错误。我还是写的代码太少,看的代码也不多。

吴恩华的课程讲的比较简单,只是入门型的。《机器学习实战》线性回归那章的第二节,我就看的不大明白了,又涉及到了我没学过的东西。所以,还得再听听其他的课程,看看其他的文档。当然,这只是一个开始。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注