1. 程式人生 > >Logistic迴歸與牛頓法(附Matlab實現)

Logistic迴歸與牛頓法(附Matlab實現)

迴歸,是一種連續模型,受噪聲的影響較大,一般都是用來做預測的,但也有除外,比如本文要講的Logistic迴歸就是用來做分類的。

Logistic Regress

Logistic一般用於二分類問題,不同於之前講的線性迴歸,它是用一條直線來分割兩種不同類別的樣本。其函式形式為

若令,則可以等價為

這個函式也叫sigmoid函式。其函式影象如下

得到了Logistic迴歸模型後,接著就要找到合適的θ去擬合它了。

首先假設

可得概率公式

再假設訓練集獨立同分布,類似於線性迴歸,這裡也用最大似然估計得

將其對數化

接著求導

其中上式第一行到第二行之間其實有一個很有意思的東西,g(θ)的一個性質

之後也和雷同的和上文一樣,這裡可以直接用梯度下降法來求解

幾乎一模一樣,只是其中的hx)變了,其實Logistic迴歸和線性迴歸都是屬於同一個模型-----廣義線性模型(Generalized Linear ModelsGLM),這個具體下一次再寫。

Newton's Method

除了用梯度下降,我們還可有用一個新的方法來解決這個問題,一個更快的方法----牛頓法(Newtons method

先介紹下這種方法,牛頓法主要是找到一個函式等於0的值,即當f(θ)=0時,θ的取值。它的更新公式為

至於它的具體操作用文字很難說清楚(文筆太爛了),這接用例子說明吧

從最左圖看起,其中直線y=0和函式

f(θ)相交於θ=1.3的位置,其中1.3就是我們要求的東西。這裡假設θ從初始值為4.5開始更新(如中間圖),作θ=4.5在函式f(θ)上的切線,這條切線和y=0的交點處的θ值就是更新後的θ位置(從最右圖可以看出),暫且將更新後的θ定義為θ1,從圖中可得f’(θ)=f(θ)/(θ θ1),進而可得(θ θ1= f(θ)/f’(θ),很眼熟,和公式中的最後一項一樣,這裡f(θ)/f’(θ)就是每一次要更新的差值,反覆迭代,直到新的θ等於0。

說完方法,就得開始用該方法解決問題了,這裡用牛頓法來求最大似然函式l(θ)的極大值,即l’(θ)=0。公式變為

又由於θ是一個向量值,最後的更新表示式為

其中Hhessian矩陣,其形式為

PS:與梯度下降法相比,牛頓法的迭代次數更少,收斂的更快,但其每一次的花費卻比梯度下降發更大,因為其中要處理hessian矩陣。


In Matlab

下面是用Matlab實現牛頓法的具體程式碼,資料集是亂找的,在程式碼中就不顯示出來了。

% Logstic Regress with Newton's Method

clear all; close all; clc

% data 
% x(20*2)為資料的特徵矩陣
x = [0.230000 0.394000;
.......
0.780000 0.282000];
% y(20*1)為資料的標記矩陣
y = [0;
    ......
    1];

[m, n] = size(x);

% x0 = 1
x = [ones(m, 1), x]; 

% plot the datas
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('axis X')
ylabel('axis Y')

% Initialize fitting parameters
theta_new = zeros(n+1, 1);
theta_old = ones(n+1, 1);
e = 0.00000000001;

% Define the sigmoid function
g = inline('1.0 ./ (1.0 + exp(-z))'); 

% Newton's method
while ((theta_new - theta_old)*(theta_new - theta_old)' > e)
    theta_old = theta_new;
    % Calculate the hypothesis function
    z = x * theta_new;
    h = g(z);
     
    % Calculate gradient and hessian.
    grad = x' * (h-y);
    H = x' * diag(h) * diag(1-h) * x;
 
    theta_new = theta_new - H\grad;          
end

theta_new

plot_x = [x(:,2)];
plot_y = (-1./theta_new(3)).*(theta_new(2).*plot_x +theta_new(1));
plot(plot_x, plot_y)
legend('Label 1', 'Label 2', 'Decision Boundary')
hold off


下圖是未經處理的資料集plot出來的圖。


下圖是處理後的圖



思考


儘管Logistic迴歸和線性迴歸的目的並不相同,一個是分類,一個是預測,但從本質上講Logistic迴歸仍然是一種線性迴歸,只是在迴歸的結果上又加上了一層對映,將其對映到可分類的情況(其中帶入到sigmoid函式的是,而z線上性迴歸中是等於hx)的)。g(z)可以將連續值對映到01上。

疑問


Hessian矩陣的向量表示式是怎麼來的?