zaish上一節講了線性回歸中L2范數的應用,這里繼續logistic回歸L2范數的應用。
先說一下問題:有一堆二維數據點,這些點的標記有的是1,有的是0.我們的任務就是制作一個分界面區分出來這些點。如圖(標記是1的樣本用+表示,0的用紅點表示):
這其實是一個二分類問題,然后我們就想到了logistic回歸模型。這是一個概率模型,
那么分別根據每個樣本的標記y是1還是0分別帶入到每個概率模型(每個樣本只帶入一個模型,而不是兩個都帶入),然后就得出了對數似然估計,也就是
cost function,這也就是之前我們做的。
現在我要說點不同的東西,先說一下之前理解的線性回歸中的,我之前以為就是樣本的所有維度變量的線性疊加。其實這里的線性回歸不光是這樣,我理解的太狹隘了。這里的x,包括前面的x指的是樣本特征的向量!不是很明白么,繼續解釋一下,一個樣本是[x1,x2],那么這個樣本的特征可以是x= [x1,x2],但是這個樣本的特征也可以不光是這些,比如這個樣本的特征還可以是x=[x1,x1平方,x2,x2平方,x1x2].懂了吧?特征是你自己從觀察值中提取出來的,你想是什么就是什么,而不只是觀察值本身。再比如,有一幅圖像,那么這幅圖像的特征不光可以是像素值,還可以用很多方法來得到你想要的圖像的特征。而這里說的線性回歸應該指的是特征的線性回歸模型。所以上一節確實是線性回歸模型。所以從觀察值中如何找特征,找哪些特征也是一個很重要的問題。
現在我們的樣本觀察值有兩維,即,並且我們根據觀察值,取的特征為:
這是一個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是:
這里θ是從θ0開始的,一直到θ28.θ0就是θX中常數項的那個參數。所以這個公式表明θ0是不用加上去的。即常數項的那個參數不參與cost function的規則相。
公式中的x(i)就是前面得到的每一個樣本的28維特征向量
現在我們要對這個cost function 最小化來得到模型的參數。我們使用牛頓法進行迭代:
我們知道(之前的一節中)沒有正則項時候的cost function的一次導為:
二次導數為:
帶了L2正則項的cost function 的一次導為:
也就是:
,θ’是θ這個模型參數向量(這里第一個元素師θ0,也就是θX常數項的參數)的第一個元素θ0=0的向量。
二次導為:
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那一類。於是我們推算出來:
這個就是分界面。注意這里的x是那個29維的向量。因為我們要在那個輸入的觀察向量[u,v]那個面上畫出分界面,所以我們要把這里的x里面的元素各代表多少的u和v還原回去,那么這個分界面就是一個曲面了(因為有u,v都有高次方)。那么具體怎么畫哪,我們在u,v軸上畫出一個區域的數據格,把這個區域里面所有的[u,v]通過map_function 得到每一個29維的x向量, 然后通過,得到這個區域所有對應的z,然后通過在這些z中畫出z=0的等高線,就得到了
的這個分界面。具體的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轉置,這里說一下:假設區域如圖所示:
看上面程序的第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的 收斂情況如圖:
此時分界面對樣本分界的情況如圖:
可以看出,分界面比較復雜,雖然對樣本分界的效果做到很精細,但我們做出的分界面是為了對未標注的樣本分類,過於復雜的分界面容易產生過擬合現象。
當L2正則項參數為1時,cost function的 收斂情況如圖:
可以看出,λ=1時收斂更快,說明正則項的系數增大會使模型變得簡單,從分界面對樣本分界的情況更可以看出來,如圖:
分界面更圓滑,雖然分界面不是很精細了,也有些誤分類,但是模型的簡單化可以防止過擬合現象,可能對未訓練樣本分類更好。
再看下λ=10時的情況:
這時候你可能會想我這時候取的特征中最高是觀察值的6次方,我們知道6次方最后得到的分界面肯定是很復雜的,如果我們把特征變的簡單一點,比如觀察值最高是3次方,這時候最后得到的分界面肯定比之前簡單(更極端的是特征就是觀察值,也就是說特征是觀察值的一次方,前面已經畫過了,是一條直線),我們驗證一下:
當特征最高是觀察值的3次方(λ=0):
收斂情況和分界面對樣本分界的情況分別是:
我們看到模型確實更簡單了,收斂更快了(相比上面的六次方λ=0的情況)我個人感覺這個相比六次方那個特征假設模型更好,可以比較這個分界曲面的方向,並且比較圓滑,比較美,也比較符合樣本的走向。我認為更具有普適性。對未知樣本分類效果更好。