2026-05-18
📊 邏輯回歸 (Logistic Regression)
邏輯回歸是一種用於二元分類問題的統計模型,透過對輸入變數進行線性組合後,利用邏輯斯函數(sigmoid函數)將結果映射到介於0與1之間的機率值。
重要概念
- 邏輯斯函數定義為:
其中 為線性組合。
-
目標:預測輸出 為 1 的機率 。
-
損失函數:使用對數損失函數(log loss)或稱為交叉熵損失,定義為
其中 。
- 參數估計:通常採用最大似然估計(Maximum Likelihood Estimation),利用梯度下降演算法更新參數。
程式設計實作要點
| 步驟 | 說明 |
| 數據預處理 | 特徵標準化、缺失值處理 |
| 初始化參數 | 初始權重和偏差設為零或小的隨機值 |
| 計算預測值 | 使用邏輯斯函數將線性組合映射成機率 |
| 計算損失 | 使用交叉熵損失函數 |
| 參數更新 | 使用梯度下降或其他優化法則調整參數 |
| 迭代訓練 | 重複計算預測和更新參數直到收斂 |
| 預測分類 | 根據機率閾值(通常為0.5)判斷分類結果 |
📉 殘差分析 (Residual Analysis)
殘差是指模型預測值與實際觀察值之間的差異,用於評估模型的擬合程度與診斷潛在問題。
重要定義與計算
- 殘差定義為:
其中 是第 筆觀測值, 是模型預測值。
-
殘差分析目的:
-
檢查模型是否存在系統性偏誤
-
驗證殘差是否符合獨立同分布、常態性與同方差性假設
-
-
殘差圖:將殘差對預測值或某變數繪圖,用以檢視異常值、趨勢和異質性。
比喻說明
殘差就像是射箭時箭矢與靶心的偏差,透過分析偏差大小與方向,了解射箭技術的準確度與穩定性。
🌲 隨機森林樹 (Random Forest)
隨機森林是一種集成學習方法,透過建造多棵決策樹(Decision Trees)並進行投票或平均,提升預測的穩定性與準確性。
主要特點
-
透過Bootstrap抽樣(有放回抽樣)產生多個訓練子集,建立多棵決策樹。
-
每棵樹在分裂節點時,隨機選擇部分特徵進行分裂,增加多樣性。
-
最終預測結果為多棵樹預測結果的多數表決(分類)或平均值(迴歸)。
重要參數
| 參數名稱 | 功能說明 |
| 樹的數量 | 決定森林中決策樹的數量,影響模型穩定性與效能 |
| 最大深度 | 控制每棵樹的最大深度,避免過度擬合 |
| 特徵選擇數目 | 每個節點分裂時考慮的特徵數量,增強隨機性 |
| 節點最小樣本數 | 控制葉節點包含的最小樣本數,避免過細分裂 |
程式設計實作要點
-
實作Bootstrap抽樣,建立多個不同訓練子集。
-
實作決策樹生成過程,且在分裂時隨機選取部分特徵。
-
對多棵樹結果進行集成(投票或平均)。
-
評估模型準確率及過擬合狀況。
🔍 奇異值分解 (Singular Value Decomposition, SVD)
奇異值分解是一種矩陣分解技術,將任意矩陣分解為三個矩陣的乘積,用於降維、特徵提取和資料壓縮。
定義與公式
給定一個矩陣 ,其奇異值分解為:
-
:正交矩陣(左奇異向量)
-
:對角矩陣,對角元素為奇異值(非負且按大小排序)
-
:正交矩陣(右奇異向量)
重要應用
-
降維:保留最大的奇異值及對應向量,忽略小奇異值達到降維效果。
-
資料壓縮:用較少的奇異值近似原始矩陣。
-
潛在語義分析(Latent Semantic Analysis, LSA):在自然語言處理中用於抽取文本潛在結構。
程式設計實作要點
-
使用數值計算庫(如 NumPy)調用 SVD 函數。
-
選擇前 個最大奇異值進行矩陣重建,實現降維。
-
應用於資料集特徵矩陣,完成特徵抽取。
🧑💻 術科考試程式設計建議
| 主題 | 重要考點 | 程式設計要點說明 |
| 邏輯回歸 | 損失函數計算、梯度下降更新、機率輸出 | 實作邏輯斯函數,交叉熵損失計算,迭代更新參數 |
| 殘差分析 | 殘差計算與繪製 | 計算預測值與實際值差異,繪製殘差圖檢視模型擬合 |
| 隨機森林 | Bootstrap抽樣、決策樹生成、特徵隨機選擇、投票集成結果 | 程式實現多棵樹訓練,隨機子集特徵分裂,集成最終預測 |
| 奇異值分解 (SVD) | 矩陣分解公式、降維、奇異值排序 | 調用SVD函數,選取主要奇異值及向量,重建近似矩陣 |
例:邏輯回歸核心程式流程
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def compute_loss(X, y, theta):
m = len(y)
h = sigmoid(np.dot(X, theta))
loss = - (1/m) * (np.dot(y, np.log(h)) + np.dot((1-y), np.log(1-h)))
return loss
def gradient_descent(X, y, theta, lr, iterations):
m = len(y)
for _ in range(iterations):
h = sigmoid(np.dot(X, theta))
gradient = np.dot(X.T, (h - y)) / m
theta -= lr * gradient
return theta