前言:
本文主要是來練習多變量線性回歸問題(其實本文也就3個變量),參考資料見網頁:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex3/ex3.html.其實在上一篇博文Deep learning:二(linear regression練習)中已經簡單介紹過一元線性回歸問題的求解,但是那個時候用梯度下降法求解時,給出的學習率是固定的0.7.而本次實驗中學習率需要自己來選擇,因此我們應該從小到大(比如從0.001到10)來選擇,通過觀察損失值與迭代次數之間的函數曲線來決定使用哪個學習速率。當有了學習速率alpha后,則本問問題求解方法和上面的沒差別。
本文要解決的問題是給出了47個訓練樣本,訓練樣本的y值為房子的價格,x屬性有2個,一個是房子的大小,另一個是房子卧室的個數。需要通過這些訓練數據來學習系統的函數,從而預測房子大小為1650,且卧室有3個的房子的價格。
實驗基礎:
dot(A,B):表示的是向量A和向量B的內積。
又線性回歸的理論可以知道系統的損失函數如下所示:
其向量表達形式如下:
當使用梯度下降法進行參數的求解時,參數的更新公式如下:
當然它也有自己的向量形式(程序中可以體現)。
實驗結果:
測試學習率的結果如下:
由此可知,選用學習率為1時,可以到達很快的收斂速度,因此最終的程序中使用的學習率為1.
最終使用梯度下降法和公式法的預測結果如下:
可以看出兩者的結果是一致的。
實驗主要程序及代碼:
%% 方法一:梯度下降法 x = load('ex3x.dat'); y = load('ex3y.dat'); x = [ones(size(x,1),1) x]; meanx = mean(x);%求均值 sigmax = std(x);%求標准偏差 x(:,2) = (x(:,2)-meanx(2))./sigmax(2); x(:,3) = (x(:,3)-meanx(3))./sigmax(3); figure itera_num = 100; %嘗試的迭代次數 sample_num = size(x,1); %訓練樣本的次數 alpha = [0.01, 0.03, 0.1, 0.3, 1, 1.3];%因為差不多是選取每個3倍的學習率來測試,所以直接枚舉出來 plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'}; theta_grad_descent = zeros(size(x(1,:))); for alpha_i = 1:length(alpha) %嘗試看哪個學習速率最好 theta = zeros(size(x,2),1); %theta的初始值賦值為0 Jtheta = zeros(itera_num, 1); for i = 1:itera_num %計算出某個學習速率alpha下迭代itera_num次數后的參數 Jtheta(i) = (1/(2*sample_num)).*(x*theta-y)'*(x*theta-y);%Jtheta是個行向量 grad = (1/sample_num).*x'*(x*theta-y); theta = theta - alpha(alpha_i).*grad; end plot(0:49, Jtheta(1:50),char(plotstyle(alpha_i)),'LineWidth', 2)%此處一定要通過char函數來轉換 hold on if(1 == alpha(alpha_i)) %通過實驗發現alpha為1時效果最好,則此時的迭代后的theta值為所求的值 theta_grad_descent = theta end end legend('0.01','0.03','0.1','0.3','1','1.3'); xlabel('Number of iterations') ylabel('Cost function') %下面是預測公式 price_grad_descend = theta_grad_descent'*[1 (1650-meanx(2))/sigmax(2) (3-meanx(3)/sigmax(3))]' %%方法二:normal equations x = load('ex3x.dat'); y = load('ex3y.dat'); x = [ones(size(x,1),1) x]; theta_norequ = inv((x'*x))*x'*y price_norequ = theta_norequ'*[1 1650 3]'
參考資料:
Deep learning:二(linear regression練習)