deep learning (六)logistic(邏輯斯蒂)回歸中L2范數的應用


zaish上一節講了線性回歸中L2范數的應用,這里繼續logistic回歸L2范數的應用。

先說一下問題:有一堆二維數據點,這些點的標記有的是1,有的是0.我們的任務就是制作一個分界面區分出來這些點。如圖(標記是1的樣本用+表示,0的用紅點表示):

image

這其實是一個二分類問題,然后我們就想到了logistic回歸模型。這是一個概率模型,

即預測在x已知時,標記為1的概率:image那么標記為0的概率為:image

那么分別根據每個樣本的標記y是1還是0分別帶入到每個概率模型(每個樣本只帶入一個模型,而不是兩個都帶入),然后就得出了對數似然估計,也就是

cost function,這也就是之前我們做的。

現在我要說點不同的東西,先說一下之前理解的線性回歸中的image,我之前以為就是樣本的所有維度變量的線性疊加。其實這里的線性回歸不光是這樣,我理解的太狹隘了。這里的x,包括前面的x指的是樣本特征的向量!不是很明白么,繼續解釋一下,一個樣本是[x1,x2],那么這個樣本的特征可以是x=   [x1,x2],但是這個樣本的特征也可以不光是這些,比如這個樣本的特征還可以是x=[x1,x1平方,x2,x2平方,x1x2].懂了吧?特征是你自己從觀察值中提取出來的,你想是什么就是什么,而不只是觀察值本身。再比如,有一幅圖像,那么這幅圖像的特征不光可以是像素值,還可以用很多方法來得到你想要的圖像的特征。而這里說的線性回歸應該指的是特征的線性回歸模型。所以上一節確實是線性回歸模型。所以從觀察值中如何找特征,找哪些特征也是一個很重要的問題。

現在我們的樣本觀察值有兩維,即image,並且我們根據觀察值,取的特征為:

image

這是一個29維的特征向量,我們先根據每一個樣本的觀察值得到每一個樣本29維的特征向量。這個程序,程序下載入口這個網站已經給出了:

   1: function xFeature= map_feature(u, v)
   2: %u,v 向量每個元素分別是每個樣本的第一維,第二維的觀察值
   3: degree= 6;
   4:     xFeature= ones(size(u(:,1)));
   5:     for i = 1:degree
   6:         for j = 0:i
   7:            xFeature(:, end+1) = (u.^(i-j)).*(v.^j);
   8:            %xFeature 矩陣的每一行是每一個樣本的特征向量
   9:         end
  10:     end

加入L2正則項的cost function是:

image

這里θ是從θ0開始的,一直到θ28.θ0就是θX中常數項的那個參數。所以這個公式表明θ0是不用加上去的。即常數項的那個參數不參與cost function的規則相。

公式中的x(i)就是前面得到的每一個樣本的28維特征向量

現在我們要對這個cost function 最小化來得到模型的參數。我們使用牛頓法進行迭代:

image

我們知道(之前的一節中)沒有正則項時候的cost function的一次導為:

image

二次導數為:

image

帶了L2正則項的cost function 的一次導為:

image也就是:image,θ’是θ這個模型參數向量(這里第一個元素師θ0,也就是θX常數項的參數)的第一個元素θ0=0的向量。

二次導為:

image

matlab代碼即:

   2: %之后就不用再增加一列了。后面的theta參數也不用n+1了。
   3: [m, n] = size(x);
   4: % Initialize fitting parameters
   5: theta = zeros(n, 1);%參數θ向量是一個列向量。
   6: % Define the sigmoid function
   7: g = inline('1.0 ./ (1.0 + exp(-z))'); 
   8: % setup for Newton's method
   9: MAX_ITR = 15;%牛頓迭代法的次數
  10: J = zeros(MAX_ITR, 1);%初始化15次迭代的cost function 值,J是為了之后畫圖
  11: % Lambda 是L2正則項的參數
  12: lambda = 1;%lambda=0,1,10,修改這個地方,運行3次可以得到3種結果。
  13: % Newton's Method
  14: for i = 1:MAX_ITR
  15:     z = x * theta;
  16:     h = g(z);%z,h都是m*1的列向量,m是樣本的個數
  17:     % Calculate J (for testing convergence)
   1: x = map_feature(x(:,1), x(:,2));%得到的x第一列都是1,經過這個函數后已經增加了,
  18:     J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h))+ ...
  19:     (lambda/(2*m))*norm(theta([2:end]))^2;
  20:   %norm(theta([2:end]))就是歐氏距離,所以還要平方。要知道是2:end,不是1:end
  21:   %前面說了
  22:     
  23:     % Calculate gradient and hessian.
  24:     G = (lambda/m).*theta; G(1) = 0; 
  25:     % extra term for gradient 
  26:     L = (lambda/m).*eye(n); L(1) = 0;
  27:     % extra term for Hessian  eye(n)是n維單位矩陣。
  28:     grad = ((1/m).*x' * (h-y)) + G;
  29:     H = ((1/m).*x' * diag(h) * diag(1-h) * x) + L;%除了G,L其他的公式matlab
  30:     %的表達形式都和以前一樣。
  31:     
  32:     % Here is the actual update
  33:     theta = theta - H\grad;
  34:   
  35: end

當我們得到logistic回歸模型的參數后,我們知道這個模型得到的是概率,我們如果想用這個模型進行分類,我們需要有一個分類假設,這里我們假設如果

h(x(i))>0.5,那么這個樣本X(i)就屬於label=1那一類,如果<0.5,那么這個樣本x(i)就屬於label=0那一類。於是我們推算出來:image

這個就是分界面。注意這里的x是那個29維的向量。因為我們要在那個輸入的觀察向量[u,v]那個面上畫出分界面,所以我們要把這里的x里面的元素各代表多少的u和v還原回去,那么這個分界面就是一個曲面了(因為有u,v都有高次方)。那么具體怎么畫哪,我們在u,v軸上畫出一個區域的數據格,把這個區域里面所有的[u,v]通過map_function 得到每一個29維的x向量, 然后通過image,得到這個區域所有對應的z,然后通過在這些z中畫出z=0的等高線,就得到了image的這個分界面。具體的matlab程序為:

   1: u = linspace(-1, 1.5, 200);
   2: v = linspace(-1, 1.5, 200);
   3: z = zeros(length(u), length(v));
   4:  
   5: % Evaluate z = theta*x over the grid
   6: for i = 1:length(u)
   7:     for j = 1:length(v)
   8:         z(i,j) = map_feature(u(i), v(j))*theta;
   9:     end
  10: end
  11: z = z'; % important to transpose z before calling contour
  12:  
  13: % Plot z = 0
  14: contour(u, v, z, [0, 0], 'LineWidth', 2)

這里有個疑惑的地方就是第11行為什么要對z轉置,這里說一下:假設區域如圖所示:

image

看上面程序的第6-8行,我們知道i=1,v=2的時候,那么z(1,2)就是圖中的紅點對應的z值,那么循環完之后就是有一個z矩陣,

那么接下來我們用contour這個畫等高線,后面的輸入是(u,v,z,[0,0]),這里的意思是根據u,v向量給出的坐標,然后和對應的z得到z的

曲面,然后后面的[0,0]意思是畫出z=0和z=0之間的等高線,也就是畫出z=0的等高線。這里有一個地方要注意的是u,v向量給出的坐標,然后和z

對應的方式是:比如u的第一個元素和v的第二個元素,對應的是z矩陣的第二行第一列z(2,1),也就是u對應的是矩陣z第幾列,v對應的是矩陣z的第幾行。然而,我們根據之前循環得到的矩陣知道,那里的z(2,1)是當i=2,v=1得到的,也就是u=2(u的第二個元素),v=1(v的第一個元素),所以我們草葯把循環得到的z轉置才可以使用contour函數。

 

實驗結果:

當L2正則項參數為0時,cost function的 收斂情況如圖:

image

此時分界面對樣本分界的情況如圖:

image

可以看出,分界面比較復雜,雖然對樣本分界的效果做到很精細,但我們做出的分界面是為了對未標注的樣本分類,過於復雜的分界面容易產生過擬合現象。

當L2正則項參數為1時,cost function的 收斂情況如圖:

image

可以看出,λ=1時收斂更快,說明正則項的系數增大會使模型變得簡單,從分界面對樣本分界的情況更可以看出來,如圖:

image

分界面更圓滑,雖然分界面不是很精細了,也有些誤分類,但是模型的簡單化可以防止過擬合現象,可能對未訓練樣本分類更好。

再看下λ=10時的情況:

image

image

 

這時候你可能會想我這時候取的特征中最高是觀察值的6次方,我們知道6次方最后得到的分界面肯定是很復雜的,如果我們把特征變的簡單一點,比如觀察值最高是3次方,這時候最后得到的分界面肯定比之前簡單(更極端的是特征就是觀察值,也就是說特征是觀察值的一次方,前面已經畫過了,是一條直線),我們驗證一下:

當特征最高是觀察值的3次方(λ=0):

收斂情況和分界面對樣本分界的情況分別是:

imageimage

我們看到模型確實更簡單了,收斂更快了(相比上面的六次方λ=0的情況)我個人感覺這個相比六次方那個特征假設模型更好,可以比較這個分界曲面的方向,並且比較圓滑,比較美,也比較符合樣本的走向。我認為更具有普適性。對未知樣本分類效果更好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM