二元逻辑回归 · 数学推导过程及代码实现完全解析
文章目錄
- 概述
- 兩個重要函數
- 預測的基本思想
 
- 二元邏輯回歸
- 線性模型的簡單回顧
- 從線性回歸到二元邏輯回歸
- 參數怎么估計
- 梯度下降
- 牛頓迭代
 
最近修改:2021/6/17
原文《從二元邏輯回歸到多元邏輯回歸 · 推導過程完全解析》經過多次修改后變得越來越長,因此筆者將其分為兩部分:
第一部分:二元邏輯回歸 · 數學推導過程及代碼實現完全解析
 第二部分:多元邏輯回歸 · 數學推導過程及代碼實現完全解析
概述
以下是此篇文章要用的包
# 加載包 import numpy as np import seaborn as sns import matplotlib.pyplot as plt sns.set_style('darkgrid')兩個重要函數
二元邏輯回歸的出發點是sigmoid函數
 S(x)=11+e?x=ex1+exS(x)= \frac{1}{1+e^{-x}}= \frac{e^{x}}{1+e^{x}} S(x)=1+e?x1?=1+exex?
Sigmoid函數能將實數域的連續數映射到0,1區間,概率的取值范圍就在0,1之間,因此可以用來做概率的預測。
以下是Sigmoid函數的代碼和圖像
x=np.arange(-10,10) y=1/(1+np.exp(-x)) plt.plot(x,y)Output:
多元邏輯回歸的出發點是softmax函數
 S(x)=exi∑j=1kexjS(x)=\frac{e^{x_i}}{\sum_{j=1}^{k}e^{x_j}} S(x)=∑j=1k?exj?exi??
 Softmax函數也是將實數域的連續數映射到0,1區間,進而可以理解為是概率。
以下是softmax函數的代碼和圖像
圖像的特點:
- 設向量x=[0,1,2,3,…,49],其輸出也是一個向量y
- 這里Softmax函數會將x里的每個數映射到0,1區間
- 并且y里元素加和為一
- 數越大,其輸出也越大,即概率越大。
Output:
 the sum of y=1.0
預測的基本思想
我們想處理分類問題,最基本的統計模型便是邏輯回歸,之所以使用它,最主要的原因是其輸出是在0,1之間。
注意,我們并不是直接輸出類別編號,而是一個概率值
然后我們會根據情況的不同來確定一個閾值,通常這個閾值定在0.5。比如,二元模型中(類別0和1),我的輸出是P(Y=1)=0.75(0.75>0.5),則認為此時Y是屬于類別1的。
二元邏輯回歸
線性模型的簡單回顧
要解釋二元邏輯回歸,我們得先來了解下什么是線性模型
首先這個模型建立在兩個個假設上
- 假設yyy和XXX之間是一個線性關系
- yi(i=1,2,3,...,n)y_i(i=1,2,3,...,n)yi?(i=1,2,3,...,n)是獨立同分布
yyy和XXX之間的線性關系
y=Xβy=Xβ y=Xβ
因變量yyy是一個nx1向量
y=[y1y2?yn]y= \left[ \begin{matrix} y_1 \\ y_2 \\ \vdots\\ y_n \end{matrix} \right] y=??????y1?y2??yn????????
帶截距項的自變量XXX是一個nx(m+1)的矩陣
 X=[1x11x12...x1m1x21x21...x2m???1xn1xn2...xnm]X= \left[ \begin{matrix} 1&x_{11}&x_{12}&...&x_{1m}\\ 1&x_{21}&x_{21}&...&x_{2m}\\ \vdots&\vdots&&\vdots\\ 1&x_{n1}&x_{n2}&...&x_{nm} \end{matrix} \right] X=??????11?1?x11?x21??xn1??x12?x21?xn2??......?...?x1m?x2m?xnm????????
帶截距項的參數βββ是一個mx1向量
 β=[β0β1β2?βm]β= \left[ \begin{matrix} β_0 \\ β_1 \\ β_2 \\ \vdots\\ β_m \end{matrix} \right] β=????????β0?β1?β2??βm??????????
從線性回歸到二元邏輯回歸
對于二值因變量yiy_iyi?(yi=0y_i=0yi?=0或yi=1y_i=1yi?=1),我們的假設是yi(i=1,2,...,n)y_i(i=1,2,...,n)yi?(i=1,2,...,n) 獨立同分布Bernouli分布,即
yi~Bernouli(P(yi=1))y_i\sim Bernouli (P(y_i=1)) yi?~Bernouli(P(yi?=1))
 首先我們想到用最基本的線性回歸來估計yiy_iyi?,在Bernouli分布中,yiy_iyi?的均值是P(yi=1)P(y_i= 1)P(yi?=1),因此我們的預測模型為
E(yi)=P(yi=1)=xiβE(y_i) = P(y_i= 1) =x_iβ E(yi?)=P(yi?=1)=xi?β
但這樣做的缺點就是xiβx_iβxi?β的取值可能會落在[0,1]之外,受Sigmoid函數的啟發,我們將預測模型改成
 E(yi)=P(yi=1)=11+e?xiβE(y_i) = P(y_i = 1) =\frac{1}{1+e^{-x_iβ}} E(yi?)=P(yi?=1)=1+e?xi?β1?
 β=(β0,β1,…βm)′,且xi=(1,xi1,xi2,…,xim),即xiβ=β0+xi1β1+...+ximβmβ = (β_0, β_1, … β_m)',且 x_i= (1, x_{i1}, x_{i2}, … ,x_{im}),即x_iβ=β_0+x_{i1}β_1+...+x_{im}β_mβ=(β0?,β1?,…βm?)′,且xi?=(1,xi1?,xi2?,…,xim?),即xi?β=β0?+xi1?β1?+...+xim?βm?
參數怎么估計
前面知道YiY_iYi? 服從Bernouli分布,既然分布已知了,我們自然會想到用極大似然估計的方法去估計參數,此時的似然函數是
 L(β)=f(y1,y2,..,yn)=∏j=1npiyj(1?pi)1?yi=∏j=1n(pi1?pi)yi(1?pi)L(β)=f(y_1,y_2,..,y_n)=\prod_{j=1}^np_i^{y_j}(1-p_i)^{1-y_i}=\prod_{j=1}^n(\frac{p_i}{1-p_i})^{y_i}(1-p_i) L(β)=f(y1?,y2?,..,yn?)=j=1∏n?piyj??(1?pi?)1?yi?=j=1∏n?(1?pi?pi??)yi?(1?pi?)
 其中pi=P(Yi=1)=11+e?xiβp_i=P(Y_i = 1)=\frac{1}{1+e^{-x_iβ}}pi?=P(Yi?=1)=1+e?xi?β1?,又發現這樣的關系Logpi1?pi=xiβLog\frac{p_i}{1-p_i}=x_iβLog1?pi?pi??=xi?β,為了之后計算方便,先對上式兩邊取對數得到
LogL(β)=Logf(y1,y2,..,yn)=∑j=1nyj(Logpi)+(1?yj)(Log(1?pi))(1)LogL(β)=Logf(y_1,y_2,..,y_n)=\sum_{j=1}^n y_j(Logp_i)+(1-y_j)(Log(1-p_i))\tag1 LogL(β)=Logf(y1?,y2?,..,yn?)=j=1∑n?yj?(Logpi?)+(1?yj?)(Log(1?pi?))(1)=∑j=1nyjLogpi1?pi+Log(1?pi)=∑j=1nyjxiβ?Log(1+exiβ)(2)=\sum_{j=1}^ny_jLog\frac{p_i}{1-p_i}+Log(1-p_i)=\sum_{j=1}^ny_jx_iβ-Log(1+e^{x_iβ})\tag2 =j=1∑n?yj?Log1?pi?pi??+Log(1?pi?)=j=1∑n?yj?xi?β?Log(1+exi?β)(2)
 最大化這個似然函數,并取此時滿足情況的βββ作為參數的估計值β^\widehat{β}β?,就能得到預測模型E(Yi)=P(Yi=1)=11+e?xiβ^E(Y_i) = P(Y_i= 1) =\frac{1}{1+e^{-x_i\widehatβ}}E(Yi?)=P(Yi?=1)=1+e?xi?β?1?了,而為什么要最大化這個似然函數呢,也就是極大似然估計的意義在哪?
- 因為我們的假設是YiY_iYi?獨立同分布,這里的似然函數實質就是Yi(i=1,2,...,n)Y_i(i=1,2,...,n)Yi?(i=1,2,...,n)的聯合密度函數,當聯合密度函數最大的時候,也就是概率最大的時候,事件最可能發生的時候,所以我們會想去最大化似然函數。
我想大部分讀者都是對機器學習感興趣來的,那這我們用一個機器學習里的名詞,代價函數(Cost function),來進行接下來的步驟,把(1)式做個小小修改就變成了,大家熟悉的代價函數
Cost(β)=?1n∑j=1nyj(Logpi)+(1?yj)(Log(1?pi))(3)Cost(β)=-\frac{1}{n}\sum_{j=1}^n y_j(Logp_i)+(1-y_j)(Log(1-p_i))\tag3 Cost(β)=?n1?j=1∑n?yj?(Logpi?)+(1?yj?)(Log(1?pi?))(3)
其實質就是將似然函數的對數函數做了一個平均,最大化似然函數的對數函數,也就是最小化這個代價函數
如果想要更嚴格地估計,我們還可以在這個基礎上,再添加懲罰項(Penalty),這個步驟也叫正則化(Regularization),常見的懲罰項是一范數和二范數,也分別叫做Lasso和Ridge,叫啥都無所謂,實質都是數學。
CostL1(β)=Cost(β)+λn∑j=1m∣βj∣CostL2(β)=Cost(β)+λ2n∑j=1mβj2Cost_{L_1}(β)=Cost(β)+\frac{λ}{n}\sum_{j=1}^m|β_j|\\ Cost_{L_2}(β)=Cost(β)+\frac{λ}{2n}\sum_{j=1}^mβ_j^2 CostL1??(β)=Cost(β)+nλ?j=1∑m?∣βj?∣CostL2??(β)=Cost(β)+2nλ?j=1∑m?βj2?
明白了這層關系后,進一步的問題就在于如何最小化代價函數,并且得到其對應的參數βββ
求參數βββ的方法常用的有兩個,一個是梯度下降(Gradient descent),另一個是牛頓迭代(Newton’s Iteration)。
梯度下降
對(3)式里的代價函數求導,而(3)式就是把(2)式做了一個變換?(2)n-\frac{(2)}{n}?n(2)?,因此
?Cost(β)?β=?1n?(2)?β=?1n∑j=1nxi(yj?pi)\frac{\partial Cost(β)}{\partial β}=-\frac{1}{n}\frac{\partial (2)}{\partial β}=-\frac{1}{n}\sum_{j=1}^nx_i(y_j-p_i) ?β?Cost(β)?=?n1??β?(2)?=?n1?j=1∑n?xi?(yj??pi?)
和之前一樣,這里pi=P(Yi=1)=11+e?xiβp_i=P(Y_i = 1)=\frac{1}{1+e^{-x_iβ}}pi?=P(Yi?=1)=1+e?xi?β1?
xix_ixi?和yjy_jyj?都是已知,給定初值β(0)=[β0(0),β1(0),β2(0),...,βm(0)]′β^{(0)}=[β_0^{(0)},β_1^{(0)},β_2^{(0)},...,β_m^{(0)}]'β(0)=[β0(0)?,β1(0)?,β2(0)?,...,βm(0)?]′后,得到pi(0)p_i^{(0)}pi(0)?,因此參數βm(0)β_m^{(0)}βm(0)?的更新可以寫成
 βm(t)=βm(t?1)?l??Cost(β(t?1))?β(t?1)=βm(t?1)?l?1n∑j=1nxi(yj?pi(t?1))(4)β_m^{(t)}=β_m^{(t-1)} - l·\frac{\partial Cost(β^{(t-1)})}{\partial β^{(t-1)}}\\ =β_m^{(t-1)} - l·\frac{1}{n}\sum_{j=1}^nx_i(y_j-p_i^{(t-1)})\tag4 βm(t)?=βm(t?1)??l??β(t?1)?Cost(β(t?1))?=βm(t?1)??l?n1?j=1∑n?xi?(yj??pi(t?1)?)(4)
 寫成矩陣的形式
 β(t)=β(t?1)?l?1n?XT?(y?p)β^{(t)}=β^{(t-1)}-l·\frac{1}{n}·X^T·(y-p) β(t)=β(t?1)?l?n1??XT?(y?p)
 其中lll是學習速度(learning rate),XXX是nx(m+1)的矩陣,yyy是nx1的向量,ppp是nx1的向量(p=[p1,p2,...,pn]′p=[p_1,p_2,...,p_n]'p=[p1?,p2?,...,pn?]′),在實際的操作中,我們會多次取不同的初值,由此希望達到全局最小值。
以下是梯度下降的簡單實現,其中省略了計算ppp的函數
def update_bata(X, y, beta, l):'''X: 自變量是一個(n,m+1)的矩陣y: 因變量是一個(n,1)的向量beta: 參數β是一個(m+1,1)的向量l: 學習速率'''n = len(y)#1 由(4)的算式得到p,設函數名為cal_pp= cal_p(X, beta)#2 (4)的一部分gradient = np.dot(X.T, y-p)#3 Take the average cost derivative for each featuregradient /= N#4 - Multiply the gradient by our learning rategradient *= l#5 - Subtract from our weights to minimize costbeta -= gradientreturn beta牛頓迭代
可以說這個方法是從泰勒展開得到的靈感,f(x)f(x)f(x)在xkx_kxk?處的展開式f(x)=f(xk)+f′(xk)(x?xk)+12!f′′(xk)(x?xk)2+...f(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2!}f''(x_k)(x-x_k)^2+...f(x)=f(xk?)+f′(xk?)(x?xk?)+2!1?f′′(xk?)(x?xk?)2+...,我們想尋找滿足f(x)=0f(x)=0f(x)=0的xxx,即牛頓迭代的終點是f(x)f(x)f(x)收斂到0
在這我們只取前兩項,h(x)=f(xk)+f′(xk)(x?xk)h(x)=f(x_k)+f'(x_k)(x-x_k)h(x)=f(xk?)+f′(xk?)(x?xk?),我們認為h(x)h(x)h(x)是f(x)f(x)f(x)的一個近似,那么有f(x)=h(x)=0f(x)=h(x)=0f(x)=h(x)=0,得到
 x=xk?f(xk)f′(xk)x=x_k-\frac{f(x_k)}{f'(x_k)} x=xk??f′(xk?)f(xk?)?
 進而有迭代
 xk+1=xk?f(xk)f′(xk)x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1?=xk??f′(xk?)f(xk?)?
 在我們的二元邏輯回歸中,代價函數就是這里的f(x)f(x)f(x),參數βββ更新方法是
 β(k)=β(k?1)?cost(β(k?1))cost′(β(k?1))β^{(k)}=β^{(k-1)}-\frac{cost(β^{(k-1)})}{cost'(β^{(k-1)})} β(k)=β(k?1)?cost′(β(k?1))cost(β(k?1))?
 直至代價函數趨近于0。這里做一個區分,梯度下降方法中的代價函數不一定趨近于0。
以上就是全部內容了,筆者從統計的角度大致解釋了下機器學習中邏輯回歸損失函數的來源,希望能幫助到各位讀者
總結
以上是生活随笔為你收集整理的二元逻辑回归 · 数学推导过程及代码实现完全解析的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 金蝶盘点机PDA,序列号SN管理扫描入库
- 下一篇: 电气专业为什么要学c语言,为什么电气工程
