聊天視窗

資料科學深度探究:從原理到實務 - 第 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.