多元線性回歸的梯度下降法詳解
多元線性回歸(Multiple Linear Regression)是多個自變量(特征)與一個因變量(目標)之間的線性關系建模,梯度下降法用于優化模型參數(權重和偏置),最小化預測誤差(如均方誤差)。
1. 模型定義
(1) 假設函數(Hypothesis)
對于 ( n ) 個特征 ( x_1, x_2, \dots, x_n ) 和參數 ( w_1, w_2, \dots, w_n, b ),預測值 ( \hat{y} ) 為:
(2) 代價函數(Cost Function)
使用**均方誤差(MSE)**衡量預測值與真實值的差距:
2. 梯度下降法
(1) 參數更新公式
對每個參數 ( w_j ) 和偏置 ( b ),沿梯度反方向更新:
3. 算法步驟
-
初始化參數:
- 權重 ( \mathbf{w} ) 和偏置 ( b ) 初始化為0或隨機小值。
-
迭代更新:
- 計算當前參數下的預測值 ( \hat{y} )。
- 計算梯度 ( \nabla_{\mathbf{w}} J ) 和 ( \frac{\partial J}{\partial b} )。
- 更新參數:
-
終止條件:
- 達到最大迭代次數,或梯度變化小于閾值。
4. 代碼實現(Python)
import numpy as npdef gradient_descent(X, y, learning_rate=0.01, epochs=1000):m, n = X.shape # m:樣本數, n:特征數w = np.zeros(n) # 初始化權重b = 0 # 初始化偏置history = [] # 記錄損失變化for epoch in range(epochs):# 計算預測值y_pred = np.dot(X, w) + b# 計算梯度dw = (1/m) * np.dot(X.T, (y_pred - y)) # X.T是X的轉置db = (1/m) * np.sum(y_pred - y)# 更新參數w -= learning_rate * dwb -= learning_rate * db# 記錄損失(可選)loss = np.mean((y_pred - y)**2)history.append(loss)return w, b, history# 示例數據(添加偏置列)
X = np.array([[1, 2], [2, 3], [3, 4]]) # 2個特征
y = np.array([5, 8, 11]) # y = 1*x1 + 2*x2 + 0# 運行梯度下降
w, b, history = gradient_descent(X, y, learning_rate=0.01, epochs=1000)
print("權重 w:", w) # 應接近 [1., 2.]
print("偏置 b:", b) # 應接近 0.
5. 關鍵細節
(1) 特征縮放(Feature Scaling)
- 如果特征量綱差異大(如 ( x_1 \in [0,1] ), ( x_2 \in [100,1000] )),需先歸一化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
- 原因:梯度下降在不同方向上的步長一致,量綱不均會導致收斂緩慢。
(2) 學習率選擇
- 太大(如 ( \alpha=1 )):可能發散(損失震蕩上升)。
- 太小(如 ( \alpha=10^{-6} )):收斂過慢。
- 建議:嘗試 ( \alpha=0.01, 0.001 ),觀察損失曲線調整。
(3) 收斂判斷
- 監控損失函數 ( J(\mathbf{w}, b) ) 的變化,若連續幾輪下降幅度小于閾值(如 ( 10^{-6} )),可提前終止。
6. 與解析解對比
- 梯度下降:迭代逼近最優解,適合大規模數據(( m > 10^4 ))。
- 解析解(正規方程):直接求閉式解 ( \mathbf{w} = (\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{y} ),但計算復雜度高(( O(n^3) )),僅適用于小規模數據。
7. 總結
|
核心公式:
梯度下降是機器學習優化的基石,理解它才能掌握更復雜的模型(如邏輯回歸、神經網絡)!