首页 > 代码库 > 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