首页 > 代码库 > ufldl学习笔记与编程作业:Linear Regression(线性回归)
ufldl学习笔记与编程作业:Linear Regression(线性回归)
ufldl学习笔记与编程作业:Linear Regression(线性回归)
ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践。在deep learning高质量群里面听一些前辈说,不必深究其他机器学习的算法,可以直接来学dl。
于是最近就开始搞这个了,教程加上matlab编程,就是完美啊。
新教程的地址是:http://ufldl.stanford.edu/tutorial/
本节学习链接:http://ufldl.stanford.edu/tutorial/supervised/LinearRegression/
从一个最简单的线性回归,可以很清晰地看出建模解决问题的一般思路。
1 定义目标函数;
2 最优化目标函数:求偏导数,求梯度。通过最优化的手段,比如梯度下降,拟牛顿发等。求出最优解。
这里的习题比较特殊,不需要我们自己实现梯度下降法。
而是对参数求出目标函数的偏导数,然后把剩下的最优化工作交给一个叫minFunc的函数去做了。
本来这节只需要读者用最简单的for循环来实现,后面有一个章节才要求用向量化的方法。
由于对线性回归算是比较熟悉了,这里就偷懒,直接用向量化方法实现了。
linear_regression.m代码如下:
function [f,g] = linear_regression(theta, X,y) % % Arguments: % theta - A vector containing the parameter values to optimize. % X - The examples stored in a matrix. % X(i,j) is the i'th coordinate of the j'th example. % y - The target value for each example. y(j) is the target for example j. % m=size(X,2);%列数 n=size(X,1);%行数 f=0; g=zeros(size(theta)); h = theta' * X; f = (1/2)*h*h';%刚开始算错了目标函数,其实目标函数就是代价函数,而不是假设函数 g = X*((h-y)'); % % TODO: Compute the linear regression objective by looping over the examples in X. % Store the objective function value in 'f'. % % TODO: Compute the gradient of the objective with respect to theta by looping over % the examples in X and adding up the gradient for each example. Store the % computed gradient in 'g'.
结果如下:
对于向量化编程,感觉要对立面所有的矩阵在脑海里都要有一个印象才行。
没印象的话,多在纸上多画几下就好。
此前也写过一篇《
从零单排入门机器学习:线性回归(linear regression)实践篇
》。里面提到这点。
其实,今晚做这个作业的时候,遇到两个坑。
第一个是求错f,我以为f是求假设函数的值H,其实是要求目标函数,代价函数。
开始还看到是库函数minFunc里面调用的函数报错,以为人家给的代码有bug。
后来发现自己求错了。
第二个是Octave调用C代码。比如lbfgsAddC.c和lbfgsProdC.c。这两个文件在mex文件夹里。
查了相关资料,才知道,先要编译为mex文件,才能被Octave调用。
m文件一般跟mex同目录。应该也可以指定文件夹,具体没深究。
https://www.gnu.org/software/octave/doc/interpreter/Getting-Started-with-Mex_002dFiles.html#Getting-Started-with-Mex_002dFiles
编译c为mex:
mkoctfile --mex myhello.c
mkoctfile 在Octave的bin目录里,这玩意还要调用gcc和g++。
所以得把gcc和g++所在目录添加到环境变量。
本文作者:linger
本文链接:http://blog.csdn.net/lingerlanlan/article/details/38377023