1. 程式人生 > >ufldl學習筆記與編程作業:Linear Regression(線性回歸)

ufldl學習筆記與編程作業:Linear Regression(線性回歸)

cal bug war 環境 art link 行數 ear sad


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






ufldl學習筆記與編程作業:Linear Regression(線性回歸)