返回目錄
A
資料科學深度探究:從原理到實務 - 第 2 章
第2章 數學基礎:統計與線性代數
發布於 2026-02-26 09:33
# 第2章 數學基礎:統計與線性代數
資料科學的核心在於數學與統計的深度融合。本章將從基礎統計推論說起,逐步闡述機率分佈、線性代數與矩陣運算,最後示範如何將這些概念轉化為 Python 程式碼,支撐機器學習與深度學習模型的構建。以下章節將以實例、公式與實際程式碼為主,並配合可重複實驗設計,幫助讀者把理論落地。
---
## 2.1 統計推論基礎
| 主要概念 | 定義 | 公式 / 例子 |
|----------|------|-------------|
| **母體 (Population)** | 整體族群 |
| **樣本 (Sample)** | 從母體抽取的一部分 |
| **統計量 (Statistic)** | 用來估計母體參數的數值 |
| **參數 (Parameter)** | 母體特性 |
| **假設檢定 (Hypothesis Testing)** | 判斷樣本是否支持某個假設 |
### 2.1.1 樣本均值與方差
- **樣本均值**:
\[
\bar{x} = \frac{1}{n}\sum_{i=1}^{n}x_i
\]
- **樣本方差**(無偏估計):
\[
s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2
\]
### 2.1.2 置信區間
以 **t-分佈** 為例,\(\mu\) 的 95% 置信區間為:
\[
\bar{x}\pm t_{\alpha/2,\,n-1}\frac{s}{\sqrt{n}}
\]
### 2.1.3 Python 範例:樣本統計與置信區間
```python
import numpy as np
import scipy.stats as st
# 隨機產生 100 個數字,模擬房價(單位:千元)
np.random.seed(42)
prices = np.random.normal(loc=200, scale=30, size=100)
# 計算樣本統計
mean_price = prices.mean()
std_price = prices.std(ddof=1) # ddof=1 為無偏估計
n = len(prices)
# 95% t 置信區間
conf_int = st.t.interval(0.95, df=n-1, loc=mean_price, scale=std_price/np.sqrt(n))
print(f"樣本均值: {mean_price:.2f}")
print(f"95% 置信區間: [{conf_int[0]:.2f}, {conf_int[1]:.2f}]")
```
---
## 2.2 機率分佈
| 分佈 | 參數 | 典型應用 |
|------|------|-----------|
| 正態分佈 (Normal) | \(\mu,\sigma^2\) | 大多數連續資料 |
| 伯努利分佈 (Bernoulli) | \(p\) | 單一成功/失敗 |
| 二項分佈 (Binomial) | \(n,p\) | 次數型資料 |
| 泊松分佈 (Poisson) | \(\lambda\) | 離散事件頻率 |
### 2.2.1 正態分佈
概率密度函數:
\[
p(x|\mu,\sigma^2)=\frac{1}{\sqrt{2\pi\sigma^2}}\exp\Big(-\frac{(x-\mu)^2}{2\sigma^2}\Big)
\]
**大數定律**:隨著樣本數增大,樣本均值趨於母體均值。
### 2.2.2 Python 範例:正態分佈與 Q-Q 圖
```python
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
# 產生 1000 個正態分佈樣本
sample = np.random.normal(0, 1, 1000)
# Q-Q 圖檢查正態性
fig, ax = plt.subplots()
st.probplot(sample, dist="norm", plot=ax)
ax.set_title("Q-Q Plot for Normal Distribution")
plt.show()
```
---
## 2.3 線性代數核心概念
| 內容 | 重要公式 |
|------|-----------|
| **向量 (Vector)** | \(\mathbf{x} = (x_1, x_2, \dots, x_n)^T\) |
| **矩陣 (Matrix)** | \(A = [\mathbf{a}_1, \dots, \mathbf{a}_m]\) |
| **點積 (Dot Product)** | \(\mathbf{x}^T\mathbf{y} = \sum_{i}x_i y_i\) |
| **矩陣乘法** | \((AB)_{ij} = \sum_k A_{ik}B_{kj}\) |
| **逆矩陣** | 若 \(A\) 可逆,\(AA^{-1}=I\) |
| **特徵值 (Eigenvalue)** | \(A\mathbf{v}=\lambda\mathbf{v}\) |
### 2.3.1 低維實例:線性回歸
線性回歸模型:
\[
y = \mathbf{x}^T\boldsymbol{\beta} + \epsilon
\]
最小平方法解:
\[
\hat{\boldsymbol{\beta}} = (X^TX)^{-1}X^Ty
\]
### 2.3.2 Python 範例:NumPy 進行矩陣運算
```python
import numpy as np
# 建立 X (樣本數 x 特徵數)
X = np.array([[1, 2],
[1, 3],
[1, 4]]) # 加入截距列
# 目標值 y
Y = np.array([3, 5, 7])
# 最小平方法計算係數
beta_hat = np.linalg.inv(X.T @ X) @ X.T @ Y
print("估計係數:", beta_hat)
```
---
## 2.4 矩陣運算實務
| 運算 | 說明 | Python 範例 |
|------|------|--------------|
| **矩陣加法** | \(A+B\) | `A + B` |
| **矩陣乘法** | \(A @ B\) | `A @ B` |
| **轉置** | \(A^T\) | `A.T` |
| **行列式** | \(|A|\) | `np.linalg.det(A)` |
| **QR 分解** | \(A=QR\) | `np.linalg.qr(A)` |
| **SVD 分解** | \(A=U\Sigma V^T\) | `np.linalg.svd(A)` |
### 2.4.1 舉例:主成分分析 (PCA)
PCA 透過 **協方差矩陣** 的特徵分解,找到資料的主要方向。
- 步驟 1:標準化資料
- 步驟 2:計算協方差矩陣
- 步驟 3:求特徵值/特徵向量
- 步驟 4:選取前 k 個特徵向量,投影降維
### 2.4.2 Python 範例:PCA 與 scikit-learn
```python
import numpy as np
from sklearn.decomposition import PCA
# 產生隨機 5x5 矩陣
np.random.seed(0)
data = np.random.randn(5, 5)
# 標準化(零均值、單位方差)
data_centered = data - data.mean(axis=0)
# 使用 scikit-learn 的 PCA
pca = PCA(n_components=2)
reduced = pca.fit_transform(data_centered)
print("主成分:", pca.components_)
print("降維後資料:\n", reduced)
```
---
## 2.5 從數學到程式碼:可重複實驗設計
1. **資料生成**:使用 `numpy.random` 或 `scipy.stats` 隨機生成符合指定分佈的樣本。
2. **統計計算**:利用 `numpy` 的向量化運算計算均值、方差、點積、矩陣乘法。
3. **參數估計**:用 `numpy.linalg` 或 `scipy.linalg` 進行線性代數解法。
4. **模型評估**:計算 R²、MSE、RMSE 等指標,並將結果寫入檔案,便於後續版本控制。
### 2.5.1 可重複實驗範例:線性回歸模型訓練與評估
```python
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score
# 產生樣本
np.random.seed(0)
X = np.random.uniform(0, 10, size=(100, 1))
Y = 3 + 2*X.squeeze() + np.random.normal(0, 1, size=100)
# 加截距
X_aug = np.hstack((np.ones((X.shape[0], 1)), X))
# 係數估計
beta_hat = np.linalg.inv(X_aug.T @ X_aug) @ X_aug.T @ Y
print("估計係數:", beta_hat)
# 預測
Y_pred = X_aug @ beta_hat
# 評估
mse = mean_squared_error(Y, Y_pred)
r2 = r2_score(Y, Y_pred)
print(f"MSE: {mse:.3f}")
print(f"R^2: {r2:.3f}")
```
---
## 2.6 小結
- 統計推論提供了**資料描述**與**假設驗證**的工具,直接影響模型的可靠性與泛化能力。
- 機率分佈讓我們能夠建模隨機現象,並在機器學習中扮演損失函數與正則化的角色。
- 線性代數是所有機器學習演算法的數學基礎,特別是線性模型、PCA、SVD 等,掌握矩陣運算可提升程式碼效能與可讀性。
- 透過 Python 與科學套件(NumPy、SciPy、scikit-learn)實現上述理論,可在實際資料集上快速驗證概念,並為後續章節(如深度學習、模型優化)奠定堅實基礎。
---
## 2.7 參考文獻
1. Freedman, D., Pisani, R., & Purves, R. *Statistics* (4th ed.). W.W. Norton & Company, 2007.
2. Bishop, C. M. *Pattern Recognition and Machine Learning*. Springer, 2006.
3. Strang, G. *Introduction to Linear Algebra*. Wellesley-Cambridge Press, 2016.
4. Oliphant, T. E. *Python for Scientific Computing*, 2007.