目錄
- 1.簡介
- 2. 實作思路
- a. 梯度下降法
- b. 牛頓迭代法
- c. 擬牛頓法(BFGS
- Sigmoid 函式轉化
- 資料嘗試
大創結束后終于好像短暫地會了一點邏輯回歸
短暫地 (劃重點
速速記下來
------------------- 2020.3.3 10:59 尷尬的群內英口課
1.簡介
邏輯回歸即考察在樣本各屬性前加上一個系數后的和(類似于加權平均),通過與閾值的比較實作二分類
簡單來說就是在每一個屬性值前面加一個系數,類似于加權平均的思路,全部求和后得到一個值,再將這個值通過 Sigmoid 函式投影到 0-1 之間,與閾值進行比較而實作二分類
-
對于資料集D,樣本由d個屬性描述,此時我們試圖學得:$$f(x_i) = w^Tx_i + b \tag{1.1}$$
- 也就是:\(a_0+a_1x_1 + a_2x_2 + \cdots + a_nx_n = f(x_i)\)
-
目標:求得最加擬合的一串系數+常數項
- 適用范圍
- 只適用于二分類問題
- 所有的變數必須是數值型變數
- 殘差和因變數都要服從二項分布(是多次重復的伯努利試驗
- 注意二項分布對應的是分類變數,所以不是正態分布
- 進而不是用最小二乘法,而是最大似然法來解決方程估計和檢驗問題
- 自變數與概率之間要是線性關系,此時概率才能表示為自變數的線性組合
- 各個觀測物件之間互相獨立
2. 實作思路
主要分為兩個步驟
-
迭代計算系數
-
通過 Sigmoid 函式將\(f(x_i)\)進行轉換并與閾值比較得出結論
-
令\(\hat{\beta}=(w;b)\) , \(\hat{x}= (x;1)\)(注意此時的x和beta都是列向量
-
即此時的目標計算函式轉化為:\(f(x_i) = \hat{\beta} \hat{x}\)
-
以下對引數 beta 求解
-
-
此時迭代的目標:即損失函式最小化(極大似然法
-
注意此時可以對似然函式兩邊取ln,將連乘轉為連加,從而得到代價函式:
-
令代價函式最小的程序實際上屬于無約束優化問題
- 以下考慮三種方法:
- 梯度下降法
- 牛頓法
- 擬牛頓法
- 以下考慮三種方法:
a. 梯度下降法
- 可以理解為每次按照梯度下降的方向下降一定的步長,以尋找最優解的位置
- 同理此時求的是代價函式的最小值 → 梯度下降;求最大值時用梯度上升法,即系數 1/m 為正
-
對于第 i 個樣本的第 j 個屬性(注意此時的j包括x^ 最后的1:$$\theta_j^{new} = \theta_j - \alpha \frac{1}{m} \sum^m_{i=1}(h_\theta(x_i)-y_i)x_i^j\tag{2.2.1}$$
- 其中 \(\theta_j\) 表示θ內第j個值
- \(h_\theta(x)\) 表示y=1 時的后驗概率:$$h_\theta(x) = P(y = 1 | x;\theta) = \frac{e^{w^Tx+b}}{1+e^{w^Tx+b}} \tag{2.2.2}$$
- \(x_i^j\) 表示第i個樣本第j個屬性的取值
- α 表示學習步長,取小一點比較精確同時也會比較慢
特點
- 梯度下降法比較萬能,基本都能用
- 此處使用梯度下降,也就是說求似然函式的最小值(似然函式是代價函式),將1/m前改為 + 則梯度上升法,可以求最大值
- 梯度下降法一般很慢
b. 牛頓迭代法
思路:
-
對 \(\beta\) 給定一個初始值,進行迭代
-
t+1 輪迭代公式為:$$\beta_{t+1}=\beta_t-\left(\frac{\partial^2l(\beta)}{\partial\beta\partial\beta^T}\right)^{-1}\frac{\partial l(\beta)}{\partial\beta} \tag{2.2.1}$$
-
其中:關于\(\beta\)的一階導數為:$$\frac{\partial l(\beta)}{\partial\beta} = -\sum^m_{i=1}\hat{x_i}(y_i-p_1(\hat{x_i};\beta)) \tag{2.2.2}$$
關于\(\beta\)的二階導數為:
\[\frac{\partial^2 l(\beta)}{\partial\beta\partial\beta^T}=\sum^m_{i=1}\hat{x_i}\hat{x_i}^Tp_1(\hat{x_i};\beta)(1-p_1(\hat{x_i};\beta)) \tag{2.2.3} \]其中的 \(p_1\) 表示:$$p(y=1|x) = \frac{e^{w^Tx+b}}{1+e^{w^Tx+b}} \tag{2.2.4}$$
特點
- 很快,比梯度下降法快得多
- 注意以上 \(\beta\) 的二階導(黑塞矩陣 Hessian )不一定是可逆的, 迭代公式可能根本進行不下去(注意matlab的偽逆也沒用
- 同理由于迭代步長固定為1,容易出現無法收斂的情況
- Hessian 矩陣不可導時,考慮擬牛頓法;無法收斂時考慮阻尼牛頓法
c. 擬牛頓法(BFGS
- 考慮到梯度下降法很慢,而牛頓法存在黑塞矩陣不可逆的問題,考慮擬牛頓法
- 思路(BFGS):通過迭代的方式,求得一個黑塞矩陣逆的近似矩陣,在每次進行目標值的迭代時,沿著迭代方向進行armijo搜索確定的步長的迭代,余下思路與牛頓法相同
** 1、避免求二階導和黑塞矩陣的逆**
考慮使用 G_k 表示第k次迭代更新beta時的黑塞矩陣的逆的近似
- 則多次迭代中 G_k 的更新公式為:
- 其中:G_0初始設為單位矩陣 I
- $\delta _k $ 即表示多次迭代之間的差值:$$\delta k = \beta{k+1} - \beta_k\tag{2.3.2}$$
- y_k 表示多次迭代求一階導的差值$$y_k = g_{k+1}-g_k\tag{2.3.3}$$
** 2、類似阻尼牛頓法使用迭代步長**
注意具體迭代時與牛頓法存在差異:擬牛頓法在迭代時使用阻尼牛頓法的思路:
-
即增加一個步長因子,每次beta的迭代是向著牛頓方向,以步長因子為步長迭代
-
此時可以緩解牛頓法迭代點列發散的情況,即牛頓法是步長因子為1時的特殊的阻尼牛頓法
-
此時迭代:$$\beta_{k+1} = \beta_k - \lambda_kH_k^{-1}g_k\tag{2.3.3}$$
- 其中 H_k 即二階導(黑塞矩陣Hessian:$$H_k^{-1} = G_k$$
- g_k 表示一階導:$$g_k = \frac{\partial l(\beta)}{\partial\beta} = -\sum^m_{i=1}\hat{x_i}(y_i-p_1(\hat{x_i};\beta)) \tag{2.3.4}$$
- 其中:$$p(y=1|x) = \frac{e^{w^Tx+b}}{1+e^{w^Tx+b}} \tag{2.3.5}$$
-
對于步長因子 λ:為一個迭代的程序(Armijo搜索
- 考慮調參的思路 \(\delta \in (0,1), \sigma \in (0,0.5)\)
- \(\lambda = \delta^{m_k}\), m從0開始迭代(m是整數,從0開始往上加),找到第一個符合下列式子的m_k即結束,根據引數 δ 和 σ 得到步長因子的值
- 根據此時已有的m計算出步長因子,用當下步長因子對 beta 進行更新,更新后beta滿足下式:$$l(\beta_{new})<= l(\beta_{old})+\sigma g_k^T \beta_{new}\tag{2.3.6}$$
- l(β) 即似然函式的對數 → 最小化的目標代價函式
- 根據此時已有的m計算出步長因子,用當下步長因子對 beta 進行更新,更新后beta滿足下式:$$l(\beta_{new})<= l(\beta_{old})+\sigma g_k^T \beta_{new}\tag{2.3.6}$$
- BFGS法整體步驟
- 用所有下標帶k的先給出 beta_k+1 (得到的程序中步長因子需要迭代
- 判斷 此時的 l(b) 目標函式下降足夠少, 即退出迭代
- 計算 y_k
- 迭代黑塞矩陣的近似值 G 矩陣
- 重新迭代計算新的beta
在每次迭代beta的時候迭代一次黑塞矩陣
在每次迭代beta的時候都要完整迭代完步長因子
Sigmoid 函式轉化
考慮到此時計算得到的結果本身是不能用作判斷的
考慮一個 Sigmoid 函式將計算出的預測值轉化為 0-1 之間的數字
-
Sigmoid 函式:$$y = \frac{1}{1+e^{-z}}$$
-
此時不僅將計算出的值轉化至0-1之間,同時利用Sigmoid函式的連續可微性
資料嘗試
以下采用西瓜書提供的西瓜資料集 3.0a 進行嘗試,python實作
博客園代碼塊過于不方便就放在GitHub了:https://github.com/Blacksheep103221/MachineLearning_ZhouZhihua
指路:LogisticRegression_summary.py
由于只有兩個屬性且樣本量很少其實分類效果不是很好
資料集情況 ↓

分類結果作圖 ↓

---------------------------------------------------------------------------------------------------------
有疏漏錯誤歡迎指出,謝謝大家
禁商用,轉載請注明作者出處
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185251.html
標籤:Python
