Logistic Regression and Newton's Method
數據是40個考上大學的小朋友和40個沒有考上大學的小朋友在兩次測驗中的成績,和他們是否通過的標簽。
根據數據建立這兩次測驗與是否進入大學的二分類模型。
在二分類任務中,我們需要找到一個函數,來擬合特征輸入X和預測輸出Y,理想的函數是階躍函數,但是由於階躍函數不具備良好的數學性質(如可導性),我們可以選擇sigmoid函數。
牛頓法基本公式介紹
使用S函數
帶入特征X之后,h(x)便可以看作是Y發生的概率,只是可以看作而已 。
損失函數J()定義為:
這個損失函數的定義是用的極大似然法,我們對對率回歸模型最大化“對數似然”就可以得到,
極大似然本質就是讓每個樣本屬於其真實標記的概率越大越好。
我們需要用牛頓法迭代參數來使損失函數達到最小值。
牛頓迭代公式如下
對應的梯度公式如下:
海森矩陣如下:
其中X(i)是n+1維的向量,X(i)*X(i)'是(n+1)*(n+1)的矩陣,而h(x(i))和y(i)是歸一化以后的數據。
這個公式在代碼實現的時候,有一點點需要注意的,正確實現如下:
H=1./m.*(x'*diag(h)*diag(1-h)'*x);
其中diag(h)*diag(1-h)'表示生成一個(n+1)*(n+1)矩陣,矩陣每一個對角元素是h*(1-h)。(我當時第一次敲公式的時候就直接敲成了h*(1-h)',結果死活迭代不對)
牛頓法對於迭代次數的要求不高,大約需要5-15次。但是牛頓法每次迭代的復雜度是O(n*3),
與梯度下降法相比,梯度法對迭代次數要求很高,但是每次迭代的復雜度是O(n)。
所以在選擇數值優化算法進行凸優化的時候,當n<1000時,我們優先選用牛頓法,當n>1000時,我們選擇梯度下降。
代碼實現:
clc clear all; close all; x = load('ex4x.dat');%加載數據 y = load('ex4y.dat'); %%%%--------------------數據預處理----------------------%%%%%% m = length(y); x = [ones(m, 1), x]; % sigma = std(x);%取方差 % mu = mean(x);%取均值 % x(:,2) = (x(:,2) - mu(2))./ sigma(2);%歸一化 % x(:,3) = (x(:,3) - mu(3))./ sigma(3);%歸一化 g = inline('1.0 ./ (1.0 + exp(-z))'); theta = zeros(size(x(1,:)))'; % initialize fitting parameters J = zeros(8, 1); %初始化損失函數 for num_iterations = 1:8 h=g(x*theta);%計算S函數 deltaJ=1/m.*x'*(h-y);%梯度 H = (1/m).*x' * diag(h) * diag(1-h) * x; J(num_iterations) = 1/m*sum(-y'*log(h)-(1-y)'*log(1-h));%牛頓法損失函數計算 theta = theta-H^(-1)*deltaJ;%% 參數更新 end x1=[1,20,80]; h=g(x1*theta)%預測
最后預測出來的概率是這個小朋友通過測試的概率,為0.332;
另外,牛頓法並不要求數據歸一化,當然,你也可以這樣做。