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


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$$

參考:《百面機器學習》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM