機器學習降維之線性判別分析

Fate0729發表於2019-07-19

1. LDA描述

線性判別分析(Linear Discriminant Analysis,LDA)是一種有監督學習演算法,同時經常被用來對資料進行降維,它是Ronald Disher在1936年發明的,有些資料上也稱位Fisher LDA.LDA是目前機器學習、資料探勘領域中經典且熱門的一種演算法

相比於PCA,LDA可以作為一種有監督的降維演算法,在PCA中,演算法沒有考慮資料的類別,自己把原資料對映到方差較大的方向上而已

如下圖,紅色的點代表class1類別的資料,藍色代表class2的資料,根據PCA演算法,資料應該對映到方差最大的方向,即Y軸,但是class1和class2兩個不同類別的資料就會完全的混合在一起,很難區分開。所以使用PCA演算法進行降維後再進行分類的效果會非常差,這時候就需要我們使用LDA演算法,將資料對映到X軸上。下面我們從二分類分析LDA原理

import numpy as np
import matplotlib.pyplot as plt

c1_x = np.random.uniform(-0.5,-2,100)
c1_y = np.random.uniform(-10,10,100)

c2_x = np.random.uniform(0.5,2,100)
c2_y = np.random.uniform(-10,10,100)

l1_x = [0 for _ in range(24)]
l1_y = [i for i in range(-12,12,1)]
l2_x = [i for i in range(-4,5,1)]
l2_y = [0 for _ in range(9)]

plt.scatter(c1_x,c1_y,c = 'r',marker = 'o',label='class1')
plt.scatter(c2_x,c2_y,c = 'b',marker = '*',label='class2')
plt.plot(l1_x,l1_y,'black',label='X')
plt.plot(l2_x,l2_y,'g',label='Y')
plt.legend()
plt.xlim(-5, 5)
plt.ylim(-12, 12)
plt.show()

機器學習降維之線性判別分析

2. 從二分類分析LDA原理

先丟擲LDA原理中心思想:最大化類間距離和最小化類內距離,再進行說明

從一個簡單的二分類問題出發,有C1、C2兩個類別的樣本,兩類的均值分別\(\mu_1,\mu_2\),我們希望投影之後兩類之間的距離儘可能大\[D(C1,C2) ={ ||W^T\mu_1 - W^T\mu_2||}_2^2\]
注:\(W^T\mu_1為\mu_1再W方向上的投影向量\),從而轉化為以下優化問題
\[\begin{cases} max{ ||W^T\mu_1 - W^T\mu_2||}_2^2\\ s.t. W^TW = 1 \end{cases}\]

容易發現,當W與\((\mu_1 - \mu_2)\)方向一致的時候,該距離最大

機器學習降維之線性判別分析

上面左邊的圖是按照最大化兩類投影中心距離的準則繪製的,會發現原本可以被線性劃分的兩類樣本,經過投影后又了一定程度的重疊

上面右邊的圖就是按照最大類間距,最小類內距思想繪製的,雖然兩類的中心在投影之後的距離又所減小,但確使投影之後樣本的可區分性提高了

如何表示類內距離?可以使用類內方差,類內方差定義為各個類分別的方差和,有類內距離表示再結合上圖說明,繼續對上面的優化函式進行優化得到:
\[\begin{cases} maxJ(W) = \frac{{ ||W^T\mu_1 - W^T\mu_2||}_2^2}{D1 + D2}\\ s.t. W^TW = 1 \end{cases}\]
注:D1為C1的類內方差和,D2為C2的類內方差和

3. LDA求解方法

\[\begin{cases} maxJ(W) = \frac{{ ||W^T\mu_1 - W^T\mu_2||}_2^2}{D1 + D2}\\ s.t. W^TW = 1 \end{cases}\]

\[D1 = \sum_{x\epsilon C_1}{(W^T(x_i - \mu_1))}^2 = \sum_{x\epsilon C_1}W^T(x_i - \mu_1){(x_i - \mu_1)}^TW \]
\[D2 = \sum_{x\epsilon C_2}{(W^T(x_i - \mu_2))}^2 = \sum_{x\epsilon C_2}W^T(x_i - \mu_2){(x_i - \mu_2)}^TW \]

因此J(W)可以寫成:

\[J(W) = \frac{W^T(\mu_1 - \mu_2){(\mu_1 - \mu_2)}^TW}{\sum_{x\epsilon C_i}W^T(x - \mu_i){(x - \mu_i)}^TW}\]
定義類間距離\(S_B = (\mu_1 - \mu_2){(\mu_1 - \mu_2)}^T\),類內距離\(S_W = \sum_{x\epsilon C_i}(x - \mu_i){(x - \mu_i)}^T\)

則:\[J(W) = \frac{W^TS_BW}{W^TS_WW}\]

對W求導,並令導數為0
\[(W^TS_W W)S_B W = (W^T S_B W)S_W W\]

\(\lambda = J(W) = \frac{W^TS_BW}{W^TS_WW}\)則有:
\[S_B W = \lambda S_w W\]
整理得到:
\[{S_w}^{-1}S_BW = \lambda W\]

看到這裡就以及很清楚了,我們最大化目標對應一個矩陣的特徵值,於是LDA降維變成了一個求矩陣特徵向量的問題。\(J(W)\)就對應矩陣\({S_w}^{-1}S_B\)的最大的特徵值,而投影方向就是這個特徵值對應的特徵向量

將二分類推廣到多分類也得到同樣的結論,總結具有多個列別標籤高維的LDA求解方法:

  • (1)計算資料集中每個類別樣本的均值向量\(\mu_j\),以及總體均值向量\(\mu\)
  • (2)計算類內散度矩陣\(S_W\),全域性散度矩陣\(S_T\),並得到類間散度矩陣\(S_B = S_T - S_W\)
  • (3)對矩陣\({S_W}^{-1}S_B進行特徵值分解,將特徵值從大到小排列\)
  • (4)特徵值前d大的對應的特徵向量\(W_1,W_2,...,W_d\),通過以下對映將n維對映到d維:\[\acute{X_i} ={(W_1^Tx_i,W_2^Tx_i,...,W_d^Tx_i)}^T\]

參考:《百面機器學習》

相關文章