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
ufldl學習筆記與編程作業:Linear Regression(線性回歸)