本章內容
4.1 決策樹
4.2 主成分分析
4.3 核主成分分析
4.4 K-means 與 K-medians
4.5 參考資料
前兩章的模型都假設某種線性結構。這一章介紹三類形式完全不同的方法:決策樹以一連串「是或否」的問題切分特徵空間,能自然地捕捉非線性與交互作用;主成分分析與它的核函數版本在沒有標籤的情況下,找出資料變化最大的方向,用來降維與視覺化;K-means 則把資料分成幾個彼此相似的群組。
後兩者屬於非監督式學習(unsupervised learning):沒有 y y y 可以對照,也就沒有「測試誤差」這樣明確的評估標準。因此理解每個方法的目標函數到底在最佳化什麼,比在監督式學習中更加重要。
4.1 決策樹Decision Trees
決策樹把特徵空間切成許多互不重疊的矩形區域 R 1 , … , R J R_1, \ldots, R_J R 1 , … , R J ,在每個區域內給出一個固定的預測值:迴歸樹用區域內 y y y 的平均,分類樹用區域內的多數類別。
找出全域最佳的切分方式在計算上不可行,所以實務上採用由上而下的貪婪遞迴二元分割 (greedy recursive binary splitting):在目前的節點,嘗試每一個特徵 j j j 與每一個切分點 s s s ,選出讓兩個子節點總成本最小的那一組,然後在兩個子節點上重複同樣的步驟。每一步只看眼前最好的切法,不考慮之後的影響,這就是「貪婪」的意思。
迴歸樹
迴歸樹以 RSS 作為成本。以特徵 j j j 、切分點 s s s 把節點分為 R 1 ( j , s ) = { x ∣ x j < s } R_1(j, s) = \{\mathbf{x} \mid x_j < s\} R 1 ( j , s ) = { x ∣ x j < s } 與 R 2 ( j , s ) = { x ∣ x j ≥ s } R_2(j, s) = \{\mathbf{x} \mid x_j \ge s\} R 2 ( j , s ) = { x ∣ x j ≥ s } ,選擇
min j , s [ ∑ i : x i ∈ R 1 ( j , s ) ( y i − y ˉ R 1 ) 2 + ∑ i : x i ∈ R 2 ( j , s ) ( y i − y ˉ R 2 ) 2 ]
\min_{j,\, s} \left[ \sum_{i:\, \mathbf{x}_i \in R_1(j,s)} (y_i - \bar y_{R_1})^2 + \sum_{i:\, \mathbf{x}_i \in R_2(j,s)} (y_i - \bar y_{R_2})^2 \right]
j , s min i : x i ∈ R 1 ( j , s ) ∑ ( y i − y ˉ R 1 ) 2 + i : x i ∈ R 2 ( j , s ) ∑ ( y i − y ˉ R 2 ) 2 其中 y ˉ R m \bar y_{R_m} y ˉ R m 是區域 R m R_m R m 內反應變數的平均。
分類樹與不純度
分類樹以不純度 (impurity)衡量一個節點的類別有多混雜。令 p ^ m k \hat p_{mk} p ^ mk 為節點 m m m 中屬於第 k k k 類的比例:
指標
定義
二元、各半時的值
吉尼不純度(Gini impurity)
∑ k p ^ m k ( 1 − p ^ m k ) \sum_k \hat p_{mk}(1 - \hat p_{mk}) ∑ k p ^ mk ( 1 − p ^ mk )
0.5
熵(entropy)
− ∑ k p ^ m k log 2 p ^ m k -\sum_k \hat p_{mk} \log_2 \hat p_{mk} − ∑ k p ^ mk log 2 p ^ mk
1 位元
錯誤分類率
1 − max k p ^ m k 1 - \max_k \hat p_{mk} 1 − max k p ^ mk
0.5
三者都在節點只含單一類別時等於 0,在各類別平均混雜時最大。分割時選擇讓子節點加權平均不純度 最小的切法,權重是各子節點的樣本比例。
舉例來說,一個節點有 10 筆資料,兩類各 5 筆,吉尼不純度為 0.5。若某個切分得到左邊 4 比 1、右邊 1 比 4,兩個子節點的吉尼不純度都是 2 × 0.8 × 0.2 = 0.32 2 \times 0.8 \times 0.2 = 0.32 2 × 0.8 × 0.2 = 0.32 ,加權平均為 0.32,不純度下降 0.18。
吉尼不純度與熵是可微分的平滑函數,對節點純度的變化比錯誤分類率敏感,因此適合用來長樹 ;錯誤分類率則常用在剪枝 時評估整棵樹的表現。
停止條件與剪枝
如果一直分割下去,每個葉節點最後只剩一筆資料,訓練誤差為 0,但完全過擬合。常見的停止條件有:
節點的樣本數少於門檻 a a a 時不再分割,或要求分割後每個子節點至少有 a a a 筆資料。
樹的深度達到上限 c c c 。
分割帶來的不純度下降小於門檻。
但提早停止有一個盲點:一個本身看似無用的分割,可能讓下一層出現非常好的分割(典型例子是 XOR 型態的資料)。因此更好的策略是先長出一棵很大的樹,再進行成本複雜度剪枝 (cost-complexity pruning):對每個 α ≥ 0 \alpha \ge 0 α ≥ 0 ,找出最小化
∑ m = 1 ∣ T ∣ ∑ i : x i ∈ R m ( y i − y ^ R m ) 2 + α ∣ T ∣
\sum_{m=1}^{|T|} \sum_{i:\, \mathbf{x}_i \in R_m} (y_i - \hat y_{R_m})^2 + \alpha |T|
m = 1 ∑ ∣ T ∣ i : x i ∈ R m ∑ ( y i − y ^ R m ) 2 + α ∣ T ∣ 的子樹 T T T ,其中 ∣ T ∣ |T| ∣ T ∣ 是葉節點個數。α \alpha α 的角色與正則化參數相同,用交叉驗證選擇(見第 5 章 )。
高變異與集成方法
決策樹容易解讀、不需要標準化特徵、能處理混合型態的變數,但最大的缺點是變異很高 :訓練資料稍有變動,長出來的樹可能截然不同。改善的方法不是把單一棵樹變簡單,而是結合許多棵樹:
袋裝法 (bagging)與隨機森林 (random forest):以自助抽樣(bootstrap)訓練多棵深樹再取平均,主要降低變異 。隨機森林在每次分割時只從隨機抽出的部分特徵(例如 p \sqrt{p} p 個)中挑選,讓各棵樹之間的相關性降低,平均的效果更好。
提升法 (boosting):依序訓練許多棵淺樹,每一棵修正前面模型的殘差或錯誤,主要降低偏誤 。
兩者的細節見第 5 章 。
常見誤區Common pitfall
類別不平衡 會讓決策樹偏向多數類別。不純度與準確率都由多數類別主導,樹可能在幾乎所有區域都預測多數類別,帳面準確率很高,卻完全抓不到少數類別。常見的處理方式包括設定類別權重、對少數類別過抽樣或對多數類別欠抽樣、調整分類門檻,並改用精確率、召回率或 PR 曲線評估(見第 5 章 )。
4.2 主成分分析Principal Component Analysis
主成分分析 (Principal Component Analysis, PCA)尋找一組新的正交座標軸,使資料投影到前幾個軸上時保留最多的變異。它可以從兩個等價的角度理解:最大化投影變異,或最小化重建誤差;實際計算則通常透過奇異值分解。
以下設資料矩陣 X \mathbf{X} X 為 N × p N \times p N × p ,每一欄都已減去平均(中心化),樣本共變異數矩陣為 S = X ⊤ X / ( N − 1 ) \mathbf{S} = \mathbf{X}^\top \mathbf{X} / (N - 1) S = X ⊤ X / ( N − 1 ) 。
最大變異數的觀點
第一主成分方向 v 1 \mathbf{v}_1 v 1 是讓投影變異最大的單位向量:
v 1 = arg max ∥ v ∥ = 1 v ⊤ S v
\mathbf{v}_1 = \arg\max_{\lVert \mathbf{v} \rVert = 1} \mathbf{v}^\top \mathbf{S} \mathbf{v}
v 1 = arg ∥ v ∥ = 1 max v ⊤ Sv 以拉格朗日乘數法可得 S v 1 = λ 1 v 1 \mathbf{S}\mathbf{v}_1 = \lambda_1 \mathbf{v}_1 S v 1 = λ 1 v 1 :v 1 \mathbf{v}_1 v 1 是 S \mathbf{S} S 最大特徵值對應的特徵向量,投影後的變異數恰好就是 λ 1 \lambda_1 λ 1 。第二主成分在與 v 1 \mathbf{v}_1 v 1 正交的條件下最大化變異,依此類推。整體而言就是共變異數矩陣的特徵分解 (eigendecomposition)S = V Λ V ⊤ \mathbf{S} = \mathbf{V} \boldsymbol\Lambda \mathbf{V}^\top S = V Λ V ⊤ :
特徵值 λ j \lambda_j λ j 是第 j j j 個主成分的變異數。
特徵向量 v j \mathbf{v}_j v j 稱為負荷量 (loadings),代表每個原始變數在這個主成分中的權重。
第 i i i 筆資料在第 j j j 個主成分上的分數 (score)為 z i j = x i ⊤ v j z_{ij} = \mathbf{x}_i^\top \mathbf{v}_j z ij = x i ⊤ v j 。
重建誤差的觀點
另一個角度是:用 q q q 維(q < p q < p q < p )的仿射子空間近似資料,讓重建誤差最小:
min μ , { λ i } , V q ∑ i = 1 N ∥ x i − μ − V q λ i ∥ 2
\min_{\boldsymbol\mu,\, \{\boldsymbol\lambda_i\},\, \mathbf{V}_q} \sum_{i=1}^{N} \left\lVert \mathbf{x}_i - \boldsymbol\mu - \mathbf{V}_q \boldsymbol\lambda_i \right\rVert^2
μ , { λ i } , V q min i = 1 ∑ N ∥ x i − μ − V q λ i ∥ 2 其中 V q \mathbf{V}_q V q 是 p × q p \times q p × q 矩陣,各欄為彼此正交的單位向量(V q ⊤ V q = I q \mathbf{V}_q^\top \mathbf{V}_q = \mathbf{I}_q V q ⊤ V q = I q );μ ∈ R p \boldsymbol\mu \in \mathbb{R}^p μ ∈ R p 是位置向量;λ i ∈ R q \boldsymbol\lambda_i \in \mathbb{R}^q λ i ∈ R q 是第 i i i 筆資料在子空間中的座標。注意這裡粗體的 λ i \boldsymbol\lambda_i λ i 是座標向量,與前面的特徵值 λ j \lambda_j λ j 不同。
固定 V q \mathbf{V}_q V q 時,最佳解為
μ ^ = x ˉ , λ ^ i = V q ⊤ ( x i − x ˉ )
\hat{\boldsymbol\mu} = \bar{\mathbf{x}}, \qquad \hat{\boldsymbol\lambda}_i = \mathbf{V}_q^\top (\mathbf{x}_i - \bar{\mathbf{x}})
μ ^ = x ˉ , λ ^ i = V q ⊤ ( x i − x ˉ ) 也就是先中心化、再投影到子空間。最佳的 V q \mathbf{V}_q V q 則由前 q q q 個特徵向量組成。兩種觀點等價的原因是畢氏定理:每筆資料到平均的距離平方,等於「投影在子空間內的部分」加上「垂直於子空間的部分」。總和固定,保留的變異越大,重建誤差就越小。最小的重建誤差為 ( N − 1 ) ∑ j > q λ j (N-1)\sum_{j > q} \lambda_j ( N − 1 ) ∑ j > q λ j ,也就是被捨棄的那些主成分的變異總和。
以 SVD 計算
實務上不直接計算 X ⊤ X \mathbf{X}^\top \mathbf{X} X ⊤ X ,而是對中心化後的 X \mathbf{X} X 做奇異值分解 (Singular Value Decomposition, SVD),數值上更穩定。設 N ≥ p N \ge p N ≥ p ,精簡形式的 SVD 為
X = U D V ⊤
\mathbf{X} = \mathbf{U} \mathbf{D} \mathbf{V}^\top
X = UD V ⊤
矩陣
大小
性質
U \mathbf{U} U (左奇異向量)
N × p N \times p N × p
各欄單位正交:U ⊤ U = I p \mathbf{U}^\top \mathbf{U} = \mathbf{I}_p U ⊤ U = I p
D \mathbf{D} D
p × p p \times p p × p
對角矩陣,d 1 ≥ ⋯ ≥ d p ≥ 0 d_1 \ge \cdots \ge d_p \ge 0 d 1 ≥ ⋯ ≥ d p ≥ 0 為奇異值
V \mathbf{V} V (右奇異向量)
p × p p \times p p × p
正交矩陣:V ⊤ V = V V ⊤ = I p \mathbf{V}^\top \mathbf{V} = \mathbf{V}\mathbf{V}^\top = \mathbf{I}_p V ⊤ V = V V ⊤ = I p
代入可得 X ⊤ X = V D 2 V ⊤ \mathbf{X}^\top \mathbf{X} = \mathbf{V} \mathbf{D}^2 \mathbf{V}^\top X ⊤ X = V D 2 V ⊤ ,因此:
V \mathbf{V} V 的各欄就是 X ⊤ X \mathbf{X}^\top \mathbf{X} X ⊤ X (也是 S \mathbf{S} S )的特徵向量,即主成分的負荷量。
奇異值 d j d_j d j 是 X ⊤ X \mathbf{X}^\top \mathbf{X} X ⊤ X 特徵值的平方根;共變異數矩陣的特徵值為 λ j = d j 2 / ( N − 1 ) \lambda_j = d_j^2 / (N - 1) λ j = d j 2 / ( N − 1 ) 。
主成分分數為 Z = X V = U D \mathbf{Z} = \mathbf{X}\mathbf{V} = \mathbf{U}\mathbf{D} Z = XV = UD ,大小 N × p N \times p N × p 。
從幾何上看,x i \mathbf{x}_i x i 在第 k k k 個主成分方向上的投影是 u i k d k v k u_{ik} d_k \mathbf{v}_k u ik d k v k :v k \mathbf{v}_k v k 決定方向,u i k d k u_{ik} d_k u ik d k 則是沿著這個方向的座標,也就是帶正負號的距離。
要保留幾個主成分
第 j j j 個主成分的解釋變異比例 (proportion of variance explained, PVE)為 λ j / ∑ l λ l \lambda_j / \sum_{l} \lambda_l λ j / ∑ l λ l 。常見的選擇方式有:
畫出各主成分 PVE 的陡坡圖(scree plot),在曲線明顯轉平的「手肘」處截斷。
保留累積 PVE 達到某個門檻(例如 80% 或 90%)所需的主成分數,這只是經驗法則。
若 PCA 是後續監督式模型的前處理,則把 q q q 當成超參數,以交叉驗證選擇。
import numpy as np
Xc = X - X.mean(axis=0) # 先中心化
U, d, Vt = np.linalg.svd(Xc, full_matrices=False)
eigvals = d**2 / (len(Xc) - 1) # 各主成分的變異數
pve = eigvals / eigvals.sum() # 解釋變異比例
Z = U[:, :q] * d[:q] # 前 q 個主成分分數,等於 Xc @ Vt[:q].T
重點Key point
PCA 最大化的是變異數 ,所以對變數的單位非常敏感:以元計價的變數會壓過以萬元計價的變數。變數單位不同時,應先標準化(等同於對相關係數矩陣做 PCA)。另外,負荷量的正負號是任意的,同一個主成分整體乘上 − 1 -1 − 1 仍然是同一個解。
4.3 核主成分分析Kernel PCA
PCA 只能找出線性的結構。核主成分分析 (kernel PCA)先用一個非線性映射把資料送到高維的特徵空間,再在那裡做 PCA:
( x 1 , … , x n ) ⟶ ( ϕ ( x 1 ) , … , ϕ ( x n ) ) ⟶ PCA
(\mathbf{x}_1, \ldots, \mathbf{x}_n) \;\longrightarrow\; \big( \phi(\mathbf{x}_1), \ldots, \phi(\mathbf{x}_n) \big) \;\longrightarrow\; \text{PCA}
( x 1 , … , x n ) ⟶ ( ϕ ( x 1 ) , … , ϕ ( x n ) ) ⟶ PCA 特徵空間可能非常高維甚至無限維,無法直接計算 ϕ ( x ) \phi(\mathbf{x}) ϕ ( x ) 。關鍵在於 PCA 需要的只是資料之間的內積,而內積可以用核函數 (kernel function)直接算出:k ( x , y ) = ⟨ ϕ ( x ) , ϕ ( y ) ⟩ k(\mathbf{x}, \mathbf{y}) = \langle \phi(\mathbf{x}), \phi(\mathbf{y}) \rangle k ( x , y ) = ⟨ ϕ ( x ) , ϕ ( y )⟩ 。這就是核技巧 (kernel trick),它也是支援向量機的核心(見第 6 章 )。常用的核函數包括高斯(RBF)核 k ( x , y ) = exp ( − ∥ x − y ∥ 2 / 2 σ 2 ) k(\mathbf{x}, \mathbf{y}) = \exp(-\lVert \mathbf{x} - \mathbf{y} \rVert^2 / 2\sigma^2) k ( x , y ) = exp ( − ∥ x − y ∥ 2 /2 σ 2 ) 與多項式核 ( x ⊤ y + c ) d (\mathbf{x}^\top \mathbf{y} + c)^d ( x ⊤ y + c ) d ;取線性核 x ⊤ y \mathbf{x}^\top \mathbf{y} x ⊤ y 時,就回到一般的 PCA。
演算法
計算 n × n n \times n n × n 的核矩陣 K \mathbf{K} K ,K i j = k ( x i , x j ) K_{ij} = k(\mathbf{x}_i, \mathbf{x}_j) K ij = k ( x i , x j ) 。
中心化 。PCA 要求資料平均為 0,但我們無法直接在特徵空間中減去平均,改為對核矩陣做等價的轉換(見下式)。
K ~ = K − 1 n K − K 1 n + 1 n K 1 n , 1 n = 1 n 11 ⊤
\tilde{\mathbf{K}} = \mathbf{K} - \mathbf{1}_n \mathbf{K} - \mathbf{K} \mathbf{1}_n + \mathbf{1}_n \mathbf{K} \mathbf{1}_n, \qquad \mathbf{1}_n = \tfrac{1}{n} \mathbf{1}\mathbf{1}^\top
K ~ = K − 1 n K − K 1 n + 1 n K 1 n , 1 n = n 1 1 1 ⊤ 其中 1 \mathbf{1} 1 是長度 n n n 的全 1 向量,11 ⊤ \mathbf{1}\mathbf{1}^\top 1 1 ⊤ 是 n × n n \times n n × n 的全 1 矩陣,而 1 ⊤ 1 = n \mathbf{1}^\top \mathbf{1} = n 1 ⊤ 1 = n 。
對 K ~ \tilde{\mathbf{K}} K ~ 做特徵分解,得到特徵對 ( λ i , α i ) (\lambda_i, \boldsymbol\alpha_i) ( λ i , α i ) ,即第 i i i 大的特徵值 λ i \lambda_i λ i 與對應的特徵向量 α i \boldsymbol\alpha_i α i 。
正規化 。特徵空間中的主成分方向是 ∑ j α i j ϕ ~ ( x j ) \sum_j \alpha_{ij} \tilde\phi(\mathbf{x}_j) ∑ j α ij ϕ ~ ( x j ) ,要讓它長度為 1,需縮放 α i \boldsymbol\alpha_i α i 使 λ i α i ⊤ α i = 1 \lambda_i \, \boldsymbol\alpha_i^\top \boldsymbol\alpha_i = 1 λ i α i ⊤ α i = 1 。
投影 。第 j j j 筆訓練資料在第 i i i 個主成分上的分數為 ( K ~ α i ) j = λ i α i j (\tilde{\mathbf{K}} \boldsymbol\alpha_i)_j = \lambda_i \alpha_{ij} ( K ~ α i ) j = λ i α ij ;新資料 x \mathbf{x} x 的分數則為 ∑ j α i j k ~ ( x , x j ) \sum_j \alpha_{ij} \tilde k(\mathbf{x}, \mathbf{x}_j) ∑ j α ij k ~ ( x , x j ) ,其中 k ~ \tilde k k ~ 以訓練資料的平均做同樣的中心化。
在這樣的正規化下,第 i i i 個主成分分數的平方和恰為 λ i \lambda_i λ i ,所以 λ i / n \lambda_i / n λ i / n 就是該主成分在特徵空間中的變異數,選擇保留幾個主成分的方式與一般 PCA 相同。
代價是核矩陣的大小為 n × n n \times n n × n :記憶體需求 O ( n 2 ) O(n^2) O ( n 2 ) ,完整特徵分解 O ( n 3 ) O(n^3) O ( n 3 ) ,樣本數大時需要近似方法。此外,核函數與其參數(如 RBF 的 σ \sigma σ )的選擇對結果影響很大,而且特徵空間中的點通常無法直接映射回原始空間。
正規化核函數
若對所有 x \mathbf{x} x 都有 k ( x , x ) = 1 k(\mathbf{x}, \mathbf{x}) = 1 k ( x , x ) = 1 ,稱為正規化核函數 (normalized kernel)。這表示每個 ϕ ( x ) \phi(\mathbf{x}) ϕ ( x ) 在特徵空間中的長度都是 1,全部落在單位球面上。RBF 核就具有這個性質。
由於核函數是內積,它滿足柯西-施瓦茲不等式 (Cauchy–Schwarz inequality):
k ( x , y ) 2 ≤ k ( x , x ) k ( y , y )
k(\mathbf{x}, \mathbf{y})^2 \le k(\mathbf{x}, \mathbf{x}) \, k(\mathbf{y}, \mathbf{y})
k ( x , y ) 2 ≤ k ( x , x ) k ( y , y ) 因此任何核函數都可以正規化為
k ^ ( x , y ) = k ( x , y ) k ( x , x ) k ( y , y )
\hat k(\mathbf{x}, \mathbf{y}) = \frac{k(\mathbf{x}, \mathbf{y})}{\sqrt{k(\mathbf{x}, \mathbf{x}) \, k(\mathbf{y}, \mathbf{y})}}
k ^ ( x , y ) = k ( x , x ) k ( y , y ) k ( x , y ) 由不等式可知 ∣ k ^ ( x , y ) ∣ ≤ 1 |\hat k(\mathbf{x}, \mathbf{y})| \le 1 ∣ k ^ ( x , y ) ∣ ≤ 1 ,它正是 ϕ ( x ) \phi(\mathbf{x}) ϕ ( x ) 與 ϕ ( y ) \phi(\mathbf{y}) ϕ ( y ) 夾角的餘弦值,可以直接解讀為相似度。
4.4 K-means 與 K-mediansK-means and K-medians
目標函數
給定群數 K K K ,K-means 要把資料分成 K K K 群,並找出各群中心 m 1 , … , m K \mathbf{m}_1, \ldots, \mathbf{m}_K m 1 , … , m K ,使每個點到其所屬群中心的距離平方總和(群內平方和)最小:
W = ∑ k = 1 K ∑ i : C ( i ) = k ∥ x i − m k ∥ 2
W = \sum_{k=1}^{K} \sum_{i:\, C(i) = k} \lVert \mathbf{x}_i - \mathbf{m}_k \rVert^2
W = k = 1 ∑ K i : C ( i ) = k ∑ ∥ x i − m k ∥ 2 其中 C ( i ) C(i) C ( i ) 表示第 i i i 個點被分配到的群。
Lloyd 演算法
同時最佳化分群與中心是 NP-hard 問題,標準做法是交替固定其中一個、最佳化另一個:
更新中心 :給定分群 C C C ,每一群的中心取該群所有點的平均,m k = mean { x i : C ( i ) = k } \mathbf{m}_k = \operatorname{mean}\{\mathbf{x}_i : C(i) = k\} m k = mean { x i : C ( i ) = k } 。
重新分配 :給定中心,把每個點分到最近的中心,C ( i ) = arg min k ∥ x i − m k ∥ 2 C(i) = \arg\min_{k} \lVert \mathbf{x}_i - \mathbf{m}_k \rVert^2 C ( i ) = arg min k ∥ x i − m k ∥ 2 。
重複步驟 1、2,直到分群不再改變。
每一步都不會讓 W W W 增加,而可能的分群方式是有限的,因此演算法一定會在有限步內收斂,但收斂到的只是局部最佳解 。
常見誤區Common pitfall
K-means 每次迭代的成本是 O ( n K p ) O(nKp) O ( n K p ) ,而不只是 O ( n ) O(n) O ( n ) :重新分配步驟要計算 n n n 個點到 K K K 個中心的距離,每個距離需要 O ( p ) O(p) O ( p ) 次運算;更新中心則是 O ( n p ) O(np) O ( n p ) 。執行 T T T 次迭代的總成本為 O ( n K p T ) O(nKpT) O ( n K pT ) 。在 K K K 、p p p 、T T T 固定時對 n n n 是線性的,這是 K-means 能處理大量資料的原因,但群數或維度很大時成本會明顯上升。
初始化與多次啟動
結果取決於初始中心的位置,不同的起點可能收斂到很不一樣的局部最佳解。常見的對策有兩個:
多次隨機啟動 :用不同的初始中心執行多次,保留 W W W 最小的結果。
k-means++ 初始化 :第一個中心隨機選一個資料點;之後每個新中心,以「與目前最近中心的距離平方」成正比的機率從資料點中抽出。這讓初始中心彼此分散,在期望值上保證得到的 W W W 不超過最佳值的 O ( log K ) O(\log K) O ( log K ) 倍。
選擇 K K K
最佳的 W W W 隨 K K K 增加只會持平或下降(K = n K = n K = n 時 W = 0 W = 0 W = 0 ),所以不能直接選 W W W 最小的 K K K 。常見的方法有:
手肘法 (elbow method):畫出 W W W 對 K K K 的曲線,選在下降幅度明顯趨緩的轉折處。
輪廓係數 (silhouette coefficient):對每個點計算 s ( i ) = b ( i ) − a ( i ) max { a ( i ) , b ( i ) } s(i) = \dfrac{b(i) - a(i)}{\max\{a(i), b(i)\}} s ( i ) = max { a ( i ) , b ( i )} b ( i ) − a ( i ) ,其中 a ( i ) a(i) a ( i ) 是它到同群其他點的平均距離,b ( i ) b(i) b ( i ) 是它到最近的其他群所有點的平均距離。s ( i ) s(i) s ( i ) 介於 − 1 -1 − 1 與 1 之間,越接近 1 表示分得越好;選擇平均輪廓係數最大的 K K K 。
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
for k in range(2, 9):
km = KMeans(n_clusters=k, init="k-means++", n_init=10, random_state=0).fit(X)
print(k, km.inertia_, silhouette_score(X, km.labels_)) # inertia_ 即 W
K-means 以歐氏距離衡量相似度,隱含假設各群大致呈球狀、大小相近,因此也需要先標準化特徵,否則單位大的變數會主導距離。
K-medians 與 K-medoids
K-means 的中心是平均值,容易被離群值拉走。K-medians 把距離改為 L1(曼哈頓)距離 ∑ j ∣ x i j − m k j ∣ \sum_j |x_{ij} - m_{kj}| ∑ j ∣ x ij − m kj ∣ ,在這個距離下最佳的中心是逐座標的中位數 。中位數不受極端值影響,因此 K-medians 對離群值較穩健。K-medoids 更進一步,要求中心必須是實際的資料點,可以搭配任意的相異度量。
方法
距離
群中心
對離群值
K-means
歐氏距離平方
平均值
敏感
K-medians
L1 距離
逐座標中位數
較穩健
K-medoids
任意相異度
實際資料點
較穩健
4.5 參考資料References
James, Witten, Hastie & Tibshirani, An Introduction to Statistical Learning (ISLR),Springer, 2013,第 8、10 章。
Hastie, Tibshirani & Friedman, The Elements of Statistical Learning (ESL),2nd ed., Springer, 2009,第 9.2、14.3、14.5 節。
Breiman, Friedman, Olshen & Stone, Classification and Regression Trees , Wadsworth, 1984。
Breiman, "Random Forests", Machine Learning , 2001。
Jolliffe, Principal Component Analysis , 2nd ed., Springer, 2002。
Schölkopf, Smola & Müller, "Nonlinear Component Analysis as a Kernel Eigenvalue Problem", Neural Computation , 1998。
Lloyd, "Least Squares Quantization in PCM", IEEE Transactions on Information Theory , 1982。
Arthur & Vassilvitskii, "k-means++: The Advantages of Careful Seeding", SODA , 2007。
Rousseeuw, "Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis", Journal of Computational and Applied Mathematics , 1987。