最近开始在mooc上看吴恩达的《机器学习》课程,由于在线作业一直不能提交,总是提示错误,倒腾了一下午还是没能成,只好作罢。幸好手边有《机器学习实战》这本书,于是就用python来学习实现课程里面的算法。吴恩达的课程学习的第一个算法是线性回归,于是,我就开始看先学怎么写这个。
1.1理论部分:
回归的目的就是预测数值型的目标值。例如,你想要预测姐姐男友汽车的功率大小,公式如下:
这个方程就是回归方程(regression equation),其中的0.0015和-0.99称作回归系数(regression weights),求这些系数的过程就是回归。
线性回归(linear regression)是回归中最主要的部分,指其函数图像通常是线性的。
多变量线性回归的方程为:
其中可以令X0=1,变为了:
这样就可将theta和x,y都看作是向量,将theta向量转置后可以变成如下简洁的公式:
求解theta向量,可以使用梯度下降(gradient descent)和正规方程(normal equation)两种方法(具体请参看ng的讲义和视频),二者区别如下:
《机器学习实战》中采用了正规方程的方法,如下:
1.2代码实现:
代码还是比较容易理解的。由于有的矩阵可能没有逆,因此在stahdRegres函数中的if语句做出了判断,linalg.det()可以计算行列式。
下面开始绘制数据集散点图和最佳拟合直线图,为了省事,为就直接把书上的代码截下来了:
效果图如下:
至此,一个简单的线性回归算法就实现了。
因为没有用过matplotlib这个模块,因此有的代码我不是很明白,比如ax.scatter()中的代码,我将.flatten().A.[0]删除后,得到了如下的图:
我猜测.flatten().A.[0]应该是将集散点拉平把,希望懂得朋友能告诉我一下。
《机器学习实战》中说,如果直线上的数据点次序混乱,绘图时会出现问题,用了升序排列,xCopy.sort(0)这个方法。我试着将行代码去掉运行,得到了如下的图:
下面之所以会出现空白,是因为我将fig.add_subplot(111)改为了fig.add_subplot(211),即如下布局:
看来我还是得好好看看matplotlib了,以上几个图都属于尝试性的。学习任何东西,都应该鼓励尝试的,你说对吗?
1.3 总结
线性回归应该算是机器学习中比较简单的算法了。因为自己的水平有限,在学习公式和实现代码的时候,有过许多的地方。比如我将regression.py中的readline和readlines写混了,产生了列表超出范围的莫名错误。为了找到这个错误的原因,我用了足足半个小时的时间才发现了错误所在。当然,这是新手常犯的错误。我还是写的代码太少,看的代码也不多。
吴恩华的课程讲的比较简单,只是入门型的。《机器学习实战》线性回归那章的第二节,我就看的不大明白了,又涉及到了我没学过的东西。所以,还得再听听其他的课程,看看其他的文档。当然,这只是一个开始。