可以參考如下文章
https://blog.csdn.net/sinat_37965706/article/details/69204397
第一節中說了,logistic 回歸和線性回歸的區別是:線性回歸是根據樣本X各個維度的Xi的線性疊加(線性疊加的權重系數wi就是模型的參數)來得到預測值的Y,然后最小化所有的樣本預測值Y與真實值y'的誤差來求得模型參數。我們看到這里的模型的值Y是樣本X各個維度的Xi的線性疊加,是線性的。
Y=WX (假設W>0),Y的大小是隨着X各個維度的疊加和的大小線性增加的,如圖(x為了方便取1維):
然后再來看看我們這里的logistic 回歸模型,模型公式是:,這里假設W>0,Y與X各維度疊加和(這里都是線性疊加W)的圖形關系,如圖(x為了方便取1維):
我們看到Y的值大小不是隨X疊加和的大小線性的變化了,而是一種平滑的變化,這種變化在x的疊加和為0附近的時候變化的很快,而在很大很大或很小很小的時候,X疊加和再大或再小,Y值的變化幾乎就已經很小了。當X各維度疊加和取無窮大的時候,Y趨近於1,當X各維度疊加和取無窮小的時候,Y趨近於0.
這種變量與因變量的變化形式就叫做logistic變化。(注意不是說X各個維度和為無窮大的時候,Y值就趨近1,這是在基於W>0的基礎上,(如果W<0,n那么Y趨近於0)而W是根據樣本訓練出來,可能是大於0,也可能是小0,還可能W1>0,W2<0…所以這個w值是樣本自動訓練出來的,也因此不是說你只要x1,x2,x3…各個維度都很大,那么Y值就趨近於1,這是錯誤的。憑直覺想一下也不對,因為你連樣本都還沒訓練,你的模型就有一個特點:X很大的時候Y就很大。這種強假設肯定是不對的。因為可能樣本的特點是X很大的時候Y就很小。)
所以我們看到,在logistic回歸中,X各維度疊加和(或X各維度)與Y不是線性關系,而是logistic關系。而在線性回歸中,X各維度疊加和就是Y,也就是Y與X就是線性的了。
X各維度疊加和Y的關系不只是這一種,還可能是其他的比如:
為什么變量與因變量要選用logistic關系呢,因為這里(1)我們需要Y代表的是概率即Y∈(0,1)。(2)我們需要X各維度疊加和在0附近變化幅度比較大,並且是非線性的變化。而在很大或很小的時候,幾乎不變化,這是基於概率的一種認識與需要。感性的一個例子,想想你學習努力的程度與從60分提高到80分和80提高到100分並不是線性的。(3)這個關系的公式要在之后形成的cost function是凸函數。
所以就選擇了logistic。
前面已經說了,我們使用logistic回歸是用於二分類問題(y只有兩個值A,B,也可以寫成1和0,這都沒關系),回歸模型得到的結果不是預測樣本X對應的y值(注意下,在logistic回歸這里我們小寫y表示某個樣本Xi的類別,而大寫Y或Y(Xi)表示logistic回歸模型對某個樣本Xi預測為1的概率。其實這里最好把Y用其他字母表示,以免混淆,但是已經這里寫了,以后注意。),而是y=1的概率或y=0的概率。我們假設y=1的概率公式是:,那么y=0的概率就是
。(注意我們也可以y=0的概率公式為前面那一個,這里是任意的。這里不同的結果只是最終的W參數不同罷了。因為我們最終的W是訓練出來的,不管怎么樣,模型都會表現出樣本的特點來。只是我們習慣了把Y(X)當成y=1的logistic模型映射的概率)
還要注意這里我們不是對一個Xi都要分別預測出來y=1的概率和y=0的概率。而是對於一個Xi,如果它的yi=1,那么我們就用這個公式映射所對應的概率,如果對於一個Xi,如果它的yi=0,那么我們就用
這個公式映射所對應的概率。都是根據yi的值映射出來一個概率。
因為我們的Y是概率,我們不能利用最小誤差等,我們這里用的是極大化所有樣本的對數似然函數:。
yi表示的是Xi真實所屬的類別(1或0)。L(W)就是cost function。這里的目標函數值和W有關系,也就是X各維度線性疊加的那些權重有關系。
那么這些權重的物理意義是什么呢?就是X各維度與Y值關系的那個方向,聽起來可能很抽象,現在看一下具體例子(X為二維,但考慮將常數項變成齊次后X就是三維了,第一維是1,因此W也是三維的,第一維是常數項,大小不影響那個方向,主要考慮后面的兩個值的關系),比如:
當W=[-15 0.2 0.2],圖形為:(一種45°方向的關系)
當W=[-15 -0.2 -0.2],圖形為:(一種-45°方向的關系)
當W=[-15 0.2 0.01],圖形為:(一種0°方向(沿x軸形成的logistic關系)的關系)
當W=[-15 0.01 0.2],圖形為:(一種90°方向(沿y軸形成的logistic關系)的關系)
下面我們對L(W)求極值。
L(W)是negtive 的似然函數。只有是negtive的,才能用梯度下降法求最小值,如果不是negtive的,就要用梯度上升法求最大值了,我們一般不用那個。還要注意我們的代價函數不管是最小二乘法、誤差均方、似然函數等,都要求平均,就是前面加上1/m.利用梯度下降法求得的迭代公式是:,其中wj代表的是模型參數向量W的第j個元素。
α代表的是學習速率,yi表示的是第i個樣本向量的真實標簽(label),也就是第i個樣本向量所屬的類別(0或1),Y(Xi)表示的是回歸模型預測的第i個樣本向量為1的概率。xij表示的第i個樣本向量Xi的第j個元素。小心不要忘了Σ(i=1:m)。 還要注意因為梯度下降法梯度是目標函數分別對模型參數向量W的第每一個元素求偏導,所以這里W的第每一個元素的值是一個一個求出來的。當然在matlab中,雖然是按向量導入計算的數據,但是本質上還是一個一個計算的w的每個值,而不是直接求的這個向量是多少。后來又看了看,前面說的這就句話不對,雖然求偏導是分別對W的每一維度求,但是這個L(w)每一次迭代的梯度向量是可以一次求出來的,也是可以在公式里直接表達出來的。不是說公式中只能一次寫一個向量的一維,可以寫一個向量。而matlab與公式的區別在於,比如X這個樣本可以把所有的n個樣本都包括,不用Σ;而在公式中只能表示一個樣本,然后用Σ表示出所有樣本(正是這個原因,在matlab中寫的代碼才會和公式模樣不一樣)。而不是之前說的公式中只能表達一個樣本的一維。
我們注意到這個迭代公式和線性回歸的迭代公式形式是一樣的,只是在線性回歸中Y(Xi)為Xi的各維度線性疊加即WXi=WXi,而這里Xi的各維度線性疊加WXi以后,還要進行一次非線性映射(即logistic映射),非線性的映射到(0,1)之間Y(Xi)。所以也可以認為logstic回歸也是處理的線性問題,即也是求的各維度線性疊加的權重系數,只是求得了各維度線性疊加和以后,不是與Xi所屬的類別進行比較,而是非線性映射到所屬類別的概率,然后最大似然函數法求模型參數(也就是那個各維度線性疊加的權重,而后面的非線性映射logstic那里沒有參數)。
下面說一個例子:訓練樣本的特征為80個學生的兩門功課的分數,樣本值yi為對應的同學是否允許被上大學。訓練好以后,用訓練好的模型根據某個學生的成績預測是否被允許上大學?數據中給出被允許上大學為1,不被允許上大學為0。
程序代碼(梯度下降法):
1: clear all; close all; clc 2: x = load('ex4x.dat'); %每一行是一個樣本 3: y = load('ex4y.dat'); 4: [m, n] = size(x); 5: sample_num = m; 6: x = [ones(m, 1), x]; %x增加一維。因為前面文字或前幾節說了 7: % Plot the training data 8: % Use different markers for positives and negatives 9: figure; 10: pos = find(y == 1); neg = find(y == 0);%pos 和neg 分別是 y元素=1和0的所在的位置序號組成的向量 11: plot(x(pos, 2), x(pos,3), '+')%用+表示那些yi=1所對應的樣本 12: hold on 13: plot(x(neg, 2), x(neg, 3), 'o') 14: hold on 15: xlabel('Exam 1 score') 16: ylabel('Exam 2 score') 17: itera_num=500;%迭代次數 18: g = inline('1.0 ./ (1.0 + exp(-z))'); %這個就相當於制造了一個function g(z)=1.0 ./ (1.0 + exp(-z)) 19: plotstyle = {'b', 'r', 'g', 'k', 'b--', 'r--'}; 20: figure;%建立新的窗口 21: alpha = [ 0.0009, 0.001,0.0011,0.0012,0.0013 ,0.0014 ];%下面就分別用這幾個學習速率看看哪個更好 22: for alpha_i = 1:length(alpha) %alpha_i是1,2,...6,表示的是學習速率向量和曲線格式向量的坐標:alpha(alpha_i),plotstyle(alpha_i) 23: theta = zeros(n+1, 1);%thera表示樣本Xi各個元素疊加的權重系數,這里以向量形式表示,且初始都為0,三維向量 24: J = zeros(itera_num, 1);%J是個100*1的向量,第n個元素代表第n次迭代cost function的值(下面用negtive 的對數似然函數, 25: %因為是negtive 的,所以是求得極小值) 26: for i = 1:itera_num %計算出某個學習速率alpha下迭代itera_num次數后的參數 27: z = x * theta;%這個z是一個列向量,每一個元素是每一個樣本Xi的線性疊加和,因為X是所有的樣本,因此這里不是一個一個樣本算的, 28: %而是所有樣本一塊算的,因此z是一個包含所有樣本Xi的線性疊加和的向量。在公式中,是單個樣本表示法,而在matlab中都是所有的樣本一塊來。 29: h = g(z);%這個h就是樣本Xi所對應的yi=1時,映射的概率。如果一個樣本Xi所對應的yi=0時,對應的映射概率寫成1-h。 30: J(i) =(1/sample_num).*sum(-y.*log(h) - (1-y).*log(1-h));%損失函數的矢量表示法 這里Jtheta是個100*1的列向量。 31: grad = (1/sample_num).*x'*(h-y);%在程序中X是包括所有的X樣本,公式中只能是每一個樣本Xi,所以不能直接把公式照搬,所以要認真看看,代碼中相應改變一下。 33: theta = theta - alpha(alpha_i).*grad; 34: end 35: plot(0:itera_num-1, J(1:itera_num),char(plotstyle(alpha_i)),'LineWidth', 2) %此處一定要通過char函數來轉換因為包用()索引后得到的還是包cell, 36: %所以才要用char函數轉換,也可以用{}索引,這樣就不用轉換了。 37: %一個學習速率對應的圖像畫出來以后再畫出下一個學習速率對應的圖像。 38: hold on 39: if(1 == alpha(alpha_i)) %通過實驗發現alpha為0.0013 時效果最好,則此時的迭代后的theta值為所求的值 40: theta_best = theta; 41: end 42: end 43: legend('0.0009', '0.001','0.0011','0.0012','0.0013' ,'0.0014');%給每一個線段格式標注上 44: xlabel('Number of iterations') 45: ylabel('Cost function') 46: prob = g([1, 20, 80]*theta); %把[1, 20, 80]*theta這個帶入g(z)得到的就是在exam1=20、exam2=80的條件下,通過的概率(也就是Y=1)的概率是多少。 47: %畫出分界面 48: % Only need 2 points to define a line, so choose two endpoints 49: plot_x = [min(x(:,2))-2, max(x(:,2))+2];%兩個點就可以畫出來直線,這里這么取x1坐標是讓直接的視野更容易包含那些樣本點。 50: plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1));%分界面怎么畫呢?問題也就是在x1,x2坐標圖中找到 %那些將x1,x2帶入1/(1+exp(-wx))后,使其值>0.5的(x1,x2) 51: %坐標形成的區域,因為我們知道1/(1+exp(-wx))>0.5 52: %意味着該區域的(x1,x2)表示的成績允許上大學的概率>0.5,那么其他的區域就是不被允許上大學,那么1/(1+exp(-wx))=0.5解出來的一個關 %於x1,x2的方程就是那個分界面。 53: %我們解出來以后發現,這個方程是一個直線方程:w(2)x1+w(3)x2+w(1)=0 54: %注意我們不能因為這個分界面是直線,就認為logistic回歸是一個線性分類器,注意logistic回歸不是一個分類器,他沒有分類的功能, %這個logistic回歸是用來 55: %預測概率的,這里具有分類功能是因為我們硬性規定了一個分類標准:把>0.5的歸為一類,<0.5的歸於另一類。這是一個很強的假設, %因為本來我們可能預測了一個樣本 56: %所屬某個類別的概率是0.6,這是一個不怎么高的概率,但是我們還是把它預測為這個類別,只因為它>0.5.所以最后可能logistic回歸加上這 %個假設以后形成的分類器 57: %的分界面對樣本分類效果不是很好,這不能怪logistic回歸,因為logistic回歸本質不是用來分類的,而是求的概率。 58: figure; 59: plot(x(pos, 2), x(pos,3), '+')%把分界面呈現在樣本點上面,所以還要把樣本點畫出來。 60: hold on 61: plot(x(neg, 2), x(neg, 3), 'o') 62: hold on 63: plot(plot_x, plot_y) 64: legend('Admitted', 'Not admitted', 'Decision Boundary') 65: hold off 66:
當學習速率取不同的值時,迭代次數與cost function形成的不同的曲線 如圖所示:
當學習速率為0.0014時候,我們看到圖像開始振盪,說明學習速率過大了。
當我們將logistic回歸應用到分類器中時,如果我們假設p(Y(x)|x)>0.5歸為一類,p(Y(x)|x)<0.5歸為另一類。那么分類器分界面如圖:
當我們看到這個圖時,我們是不是有種感覺:這個logistic回歸比線性回歸復雜,為什么結果得到的那么差?
先說一句,我們不要用這個分界面來評價logistic回歸模型的好壞!!! 這個一會再說,我們先說這個分界面公式是怎么產生的。
分界面怎么畫呢?問題也就是在x1,x2坐標圖中找到那些將x1,x2帶入1/(1+exp(-wx))后,使其值>0.5的(x1,x2)坐標形成的區域,因為我們知道1/(1+exp(-wx))>0.5意味着該區域的(x1,x2)表示的成績允許上大學的概率>0.5,那么其他的區域就是不被允許上大學,那么1/(1+exp(-wx))=0.5解出來的一個關於x1,x2的方程就是那個分界面。我們解出來以后發現,這個方程是一個直線方程:w(2)x1+w(3)x2+w(1)=0 注意我們不能因為這個分界面是直線,就認為logistic回歸是一個線性分類器,注意logistic回歸不是一個分類器,他沒有分類的功能,這個logistic回歸是用來預測概率的,這里具有分類功能是因為我們硬性規定了一個分類標准:把>0.5的歸為一類,<0.5的歸於另一類。這是一個很強的假設,因為本來我們可能預測了一個樣本所屬某個類別的概率是0.6,這是一個不怎么高的概率,但是我們還是把它預測為這個類別,只因為它>0.5.所以最后可能logistic回歸加上這個假設以后形成的分類器
的分界面對樣本分類效果不是很好,這不能怪logistic回歸,因為logistic回歸本質不是用來分類的,而是求的概率。
牛頓法
牛頓法的闡述可以看我寫的梯度下降法與牛頓法的解釋與對比 http://www.cnblogs.com/happylion/p/4172632.html
注意一下,在這個例子中,我們要求G,我們不是利用這個公式,這個太麻煩了,而是直接在剛才目標函數一次求導的基礎上繼續求導,二次導為:
matlab程序中的形式具體看程序。
牛頓法程序clear all; close all; clx = load('ex4x.dat');
y = load('ex4y.dat'); [m, n] = size(x); % Add intercept term to x x = [ones(m, 1), x]; % Plot the training data % Use different markers for positives and negatives figure pos = find(y); neg = find(y == 0);%find是找到的一個向量,其結果是find函數括號值為真時的值的編號 plot(x(pos, 2), x(pos,3), '+') hold on plot(x(neg, 2), x(neg, 3), 'o') hold on xlabel('Exam 1 score') ylabel('Exam 2 score') % Initialize fitting parameters theta = zeros(n+1, 1); % Define the sigmoid function g = inline('1.0 ./ (1.0 + exp(-z))'); % Newton's method MAX_ITR = 7; J = zeros(MAX_ITR, 1); for i = 1:MAX_ITR % Calculate the hypothesis function z = x * theta; h = g(z);%是可以以向量形式給g()函數輸入的,不是因為所有函數都可以這么輸,而是這個函數里面有個exp()函數, %是可以的。z的每一維在exp()中分別計算,對應h里的每一維。 % Calculate gradient and hessian. % The formulas below are equivalent to the summation formulas % given in the lecture videos. grad = (1/m).*x' * (h-y);% H = (1/m).*x' * diag(h) * diag(1-h) * x;%因為在matlab中,是以所有樣本一塊作為X輸入的,所以這里的h是一個 %向量,里面的元素是每個樣本映射的logistic回歸模型的概率,這樣兩個對角矩陣乘出來,還是一個對角矩陣,每個對角 %元是每個樣本的hi*(1-hi)。這樣做就是適應公式在matlab下的表現形式,是正確的,我驗算了。 % Calculate J (for testing convergence) J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h)); theta = theta - H\grad;%是這樣的,matlab里 \ 是左除,/ 是右除。如果是數字計算,則左除和右除是等效的,例如 3/2 = 2\3。
%而對於矩陣運算,則二者不等效。矩陣除法在 matlab 里定義為矩陣求逆后相乘。例如 A的逆矩陣是 A1,則 B/A = B*A1,A\B = A1*B。
%矩陣乘法不滿足交換律,因此需要有左右除法之分。矩陣求逆的命令是 inv矩陣乘法不滿足交換律,因此需要有左右除法之分。
end % Display theta theta % Calculate the probability that a student with % Score 20 on exam 1 and score 80 on exam 2 % will not be admitted prob = 1 - g([1, 20, 80]*theta) %畫出分界面 % Plot Newton's method result % Only need 2 points to define a line, so choose two endpoints plot_x = [min(x(:,2))-2, max(x(:,2))+2]; % Calculate the decision boundary line,plot_y的計算公式見博客下面的評論。 plot_y = (-1./theta(3)).*(theta(2).*plot_x +theta(1)); plot(plot_x, plot_y) legend('Admitted', 'Not admitted', 'Decision Boundary') hold off % Plot J figure plot(0:MAX_ITR-1, J, 'o--', 'MarkerFaceColor', 'r', 'MarkerSize', 8) xlabel('Iteration'); ylabel('J') % Display J J
結果可看 http://www.cnblogs.com/tornadomeet/archive/2013/03/16/2963919.html