logistics回歸簡單應用——梯度下降,梯度上升,牛頓算法(一)


警告:本文為小白入門學習筆記

由於之前寫過詳細的過程,所以接下來就簡單描述,主要寫實現中遇到的問題。

數據集是關於80人兩門成績來區分能否入學:

數據集:

http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex4/ex4.html

假設函數(hypothesis function):

$\displaystyle h_{\theta}(x)$ $\textstyle =$ $\displaystyle g(\theta^{T}x)=\frac{{1}}{1+e^{-\theta^{T}x}}$
  $\textstyle =$ $\displaystyle P(y=1\vert x;\theta)$

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2018.9.7補充

近日看了周志華的機器學習書,有對logistics回歸(又叫對數幾率回歸,是一個分類算法)有了新的理解,所以將對其中的數學原理進行描述。

對於二分類問題,最理想的是用單位階躍函數來表示,例如當x滿足條件時,y=1或y=0,但是問題是它不是一個連續函數,所以需要用一個連續函數來替換,於是就用到了對數幾率函數來替換

於是就得到上面那樣的假設函數。它的返回結果其實是一個概率值,也就是某一個點它屬於正樣本或負樣本的概率是多少,如果是正樣本的概率大那就划分到正樣本,負樣本同理。

對於概率 $\displaystyle P(y=1\vert x;\theta)$ 我們已經知道了訓練樣本中y和x的值,接下來如何求得參數theta的值。

首先補充一點概率論知識:

引自:https://blog.csdn.net/zengxiantao1994/article/details/72787849

其中:p(w):為先驗概率,表示每種類別分布的概率:條件概率,表示在某種類別前提下,某事發生的概率。而為后驗概率,表示某事發生了,並且它屬於某一類別的概率,有了這個后驗概率,我們就可以對樣本進行分類。后驗概率越大,說明某事物屬於這個類別的可能性越大,我們越有理由把它歸到這個類別下。

而我們需要求解的是后驗問題,即知道某個樣本是屬於正類或負累,求解它是正類或負類的概率是多少。

$\displaystyle P(y=1\vert x;\theta)$對於這個我們該如何求參數theta和b呢?

於是,我們可以通過“”極大似然估計“”來估計theta和b的值。

總結起來,最大似然估計的目的就是:利用已知的樣本結果,反推最有可能(最大概率)導致這樣結果的參數值。

原理:極大似然估計是建立在極大似然原理的基礎上的一個統計方法,是概率論在統計學中的應用。極大似然估計提供了一種給定觀察數據來評估模型參數的方法,即:“模型已定,參數未知”。通過若干次試驗,觀察其結果,利用試驗結果得到某個參數值能夠使樣本出現的概率為最大,則稱為極大似然估計。

這里我就不推導公式,有興趣可以查。求解參數的過程為:

  (1)寫出似然函數;

        (2)對似然函數取對數,並整理;

        (3)求導數;

        (4)解似然方程。

最終的表達式是

\begin{displaymath}
J(\theta)=\frac{{1}}{m}\sum_{i=1}^{m}\left[
-y^{(i)}\log(h_...
...
(1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))\right] \nonumber
\par
\end{displaymath}

求解這個可以用梯度下降方法或牛頓方法

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

代價函數(cost function):

\begin{displaymath}
J(\theta)=\frac{{1}}{m}\sum_{i=1}^{m}\left[
-y^{(i)}\log(h_...
...
(1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))\right] \nonumber
\par
\end{displaymath}

使用梯度下降算法求解theta:

 \begin{displaymath}
\nabla_{\theta}J = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} \nonumber \nonumber
\end{displaymath}

使用MATLAB實現:

 

function [jVal] = logCostFunction2(a)
%LOGCOSTFUNCTION2 此處顯示有關此函數的摘要
% 此處顯示詳細說明
g = inline('1.0 ./ (1.0 + exp(-z))');
x = load('ex4x.dat');
y = load('ex4y.dat');
m = length(y);
x = [ones(m, 1), x];
theta = zeros(size(x(1,:)))'; %3*1
%theta = ones(3,1);
J = zeros(500,1);

for iter = 1:500
w = zeros(3,1);
%梯度上升
for i = 1:m
c = x(i,:); %1*3
w = w + (g(c * theta) - y(i)) * c';
%w = w + (y(i) - g(c * theta)) * c';
end
%代價函數
f = 0;
for j = 1:m
b = x(j,:);
f = f + (y(j) .* log(g(b * theta)) + (1 - y(j)) .* log(1 - g(b * theta)));
end
%更新theta
theta = theta - (a * w / m);
%theta = theta + (a * w);
jVal = -1 ./ m .* f;
J(iter) = jVal; 
end
disp(theta);
%迭代次數和代價函數值圖像
figure(1);
plot(0:499,J(1:500),'r-');hold on;
xlabel('Number of iterations');
ylabel('Cost J');
%決策邊界
figure(2);
x1 = x(:,2);
x2 = - (theta(1) + theta(2) .* x1)./theta(3);
pos = find(y == 1);
neg = find(y == 0);
plot(x(pos,2),x(pos,3),'+');hold on;
plot(x(neg,2),x(neg,3),'o');hold on;
plot(x1(1:m),x2,'r');
end

 

設置不同的learning rate,獲得以下曲線:

可以看出當alpha = 0.0014時,曲線是藍色那條,可以看出曲線發生抖動,說明取值過大,其實我一開始就是應為選取alpha過大,導致一直獲取抖動的曲線,還有就是迭代次數不夠也會獲取不到最小值。

決策邊界:

theta0 = -0.0193
theta1 = 0.0474
theta2 = -0.0236

y = theta‘ * x;

因為我是對照着開頭網頁上的內容去做的,那個網站上是使用牛頓算法求解,我使用的是梯度下降算法,我發現它們有很大誤差,但是看迭代次數和損失函數圖像,的確正常下降到最小值,但是誤差怎么會這么大?百度了幾篇博客學習:

----------------------------------------------------------------------------------------------------------------------------------------------

 分界面怎么畫呢?問題也就是在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回歸本質不是用來分類的,而是求的概率。

摘自 : https://www.cnblogs.com/happylion/p/4169945.html

----------------------------------------------------------------------------------------------------------------------------------------------

對此我還有一個問題,我發現同一個問題有的人用梯度上升方法求解,而用梯度下降法也能求解,所以有對梯度上升和梯度下降進行了了解:

這是合並后的代價函數:

這個代價函數,是對於一個樣本而言的。給定一個樣本,我們就可以通過這個代價函數求出,樣本所屬類別的概率,而這個概率越大越好,所以也就是求解這個代價函數的最大值。既然概率出來了,那么最大似然估計也該出場了。

對比上面我使用的代價函數:

\begin{displaymath}
J(\theta)=\frac{{1}}{m}\sum_{i=1}^{m}\left[
-y^{(i)}\log(h_...
...
(1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))\right] \nonumber
\par
\end{displaymath}

會發現區別,他們之間相差一個負號,這樣就明白了。

於是我又用梯度上升方法實現一次:

 

theta:

0.9781
0.2580
-0.1540

雖然alpha的取值,和最后theta值有很大的區別,但是最后的圖像差不多一樣不精確.

假如一個同學科目1為20 分,科目2為80分

0.21% 這個准確性的確很低

---------------------------------------------------------------------------------------------------------------------------------------------

 

對此我還是決定用牛頓方法再求解一次:

代價函數(cost Function):

\begin{displaymath}
J(\theta)=\frac{{1}}{m}\sum_{i=1}^{m}\left[
-y^{(i)}\log(h_...
...
(1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))\right] \nonumber
\par
\end{displaymath}

牛頓方法是:

\begin{displaymath}
\theta^{(t+1)}=\theta^{(t)}-H^{-1}\nabla_{\theta}J \nonumber
\end{displaymath}

\begin{displaymath}
\nabla_{\theta}J = \frac{1}{m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x^{(i)} \nonumber \nonumber
\end{displaymath}

\begin{displaymath}
H & = & \frac{1}{m}\sum_{i=1}^{m}\left[h_{\theta}(x^{(i)})\l...
...^{(i)})\right)x^{(i)}\left(x^{(i)}\right)^{T}\right] \nonumber
\end{displaymath}

MATLAB實現:

 

function [ jVal ] = logNewton(  )
g = inline('1.0 ./ (1.0 + exp(-z))');
x = load('ex4x.dat');
y = load('ex4y.dat');
m = length(y);
x = [ones(m, 1), x];
theta = zeros(size(x(1,:)))'; %3*1
%theta = ones(3,1);
J = zeros(20,1);
for iter = 1:20
    w = zeros(3,1);
    %求偏導
    for i = 1:m
        c = x(i,:); %1*3
        w = w + (g(c * theta) - y(i)) * c';
    end
    %Hessian 
    f = 0;
    for j = 1:m
        b = x(j,:);
        f = f + (g(b * theta) .* (1 - g(b * theta)) * b' * b);
    end
     %代價函數
    l = 0;
    for j = 1:m
        b = x(j,:);
        l = l + (y(j) .* log(g(b * theta)) + (1 - y(j)) .* log(1 - g(b * theta)));
    end
    %更新theta
    theta = theta - ( f\ w); %inv(f)*w
    jVal = -1 ./ m .* l;
    J(iter) = jVal; 
end
disp(theta);
%迭代次數和代價函數值圖像
figure(1);
plot(0:19,J(1:20),'o--');hold on;
xlabel('Number of iterations');
ylabel('Cost J');
%決策邊界
figure(2);
x1  = x(:,2);
x2 =  - (theta(1) + theta(2) .* x1)./theta(3);
pos = find(y == 1);
neg = find(y == 0);
plot(x(pos,2),x(pos,3),'+');hold on;
plot(x(neg,2),x(neg,3),'o');hold on;
plot(x1(1:m),x2,'r');
end

別人家的代碼(只有迭代部分):https://www.cnblogs.com/tornadomeet/archive/2013/03/16/2963919.html

for i = 1:MAX_ITR
    % Calculate the hypothesis function
    z = x * theta;
    h = g(z);%轉換成logistic函數
    
    % 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;%hessian矩陣的矢量表示法
    
    % Calculate J (for testing convergence)
    J(i) =(1/m)*sum(-y.*log(h) - (1-y).*log(1-h));%損失函數的矢量表示法
    
    theta = theta - H\grad;%是這樣子的嗎?
end

所以說熟練使用矩陣知識可以簡單化很多問題。

圖像:

可以看出遞歸將近6次后就獲取最小值;

決策邊界:

theta:

-16.3787
0.1483
0.1589

這樣看起來要准確許多,接下來我們來預測一下,假如一個同學科目1為20 分,科目2為80分

那么被錄取的可能性為33.17%


免責聲明!

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



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