LDA(Linear Discriminant Analysis)線性判別分析是一種有監(jiān)督數(shù)據(jù)降維算法,它與我們之前提到的PCA都是數(shù)據(jù)清洗過程中最常用的兩種數(shù)據(jù)降維技術(shù)。但它們又有所不同,PCA的核心是將現(xiàn)有數(shù)據(jù)轉(zhuǎn)換到低維度得空間中,數(shù)據(jù)的方差都變得最大。LDA的核心含義是對(duì)將現(xiàn)有數(shù)據(jù)進(jìn)行轉(zhuǎn)換,數(shù)據(jù)類別變得容易區(qū)分,其方差不一定是最大的。
LDA的作用:
1.將數(shù)據(jù)的維度降低,除去那些對(duì)結(jié)果影響不大的特征。如今我們的數(shù)據(jù)集中,數(shù)據(jù)的特征往往會(huì)達(dá)到成百上千維,可是這些維度都會(huì)對(duì)最終結(jié)果產(chǎn)生影響嗎?其實(shí)不然,所以需要對(duì)數(shù)據(jù)進(jìn)行降維處理。
2.將高維度的數(shù)據(jù)轉(zhuǎn)換為低維度的數(shù)據(jù),減小了計(jì)算時(shí)的數(shù)據(jù)量,相應(yīng)的提升了計(jì)算效率。
圖解LDA原理
如圖所示,我們現(xiàn)在有兩類數(shù)據(jù),‘-’,‘x’,外邊的橢圓形是數(shù)據(jù)的外圍輪廓。現(xiàn)在我們沿著圖中的這條新的軸線,對(duì)這兩類數(shù)據(jù)進(jìn)行投影。投影后,數(shù)據(jù)從二維變成了一維,我們希望兩類數(shù)據(jù)在低維空間中能更好的的區(qū)分,也就是離得越遠(yuǎn)越好。如圖所示,用紅色小圓點(diǎn)和紅色小三角形分別表示兩類數(shù)據(jù)的中心點(diǎn),這兩個(gè)點(diǎn)的距離越大越好,兩類數(shù)據(jù)分的越開。

如下圖所示,u1,u2分別為紅色,藍(lán)色數(shù)據(jù)的中心點(diǎn),現(xiàn)我們分別將其沿著X1,X2軸進(jìn)行投影。
從圖中可以看出投影到X1軸,兩點(diǎn)之間的間距要大于投影到X2軸,但是投影到X1軸后,兩類數(shù)據(jù)將出現(xiàn)部分重疊,這顯然無法達(dá)到我們對(duì)數(shù)據(jù)進(jìn)行分類的目的。投影到X2軸,雖然u1與u2之間的距離較小,但是可以將兩類數(shù)據(jù)清楚地區(qū)分開。
綜上所述:對(duì)于投影后的數(shù)據(jù),須同時(shí)滿足兩個(gè)要求。1:兩類數(shù)據(jù)之間的距離越大越好,2:每類數(shù)據(jù)越聚集越好。
最終問題的落腳點(diǎn):怎樣找到這條最合適的投影軸?

LDA的數(shù)學(xué)原理推導(dǎo)

SKlearn-LDA介紹
1.API文檔
sklearn.discriminant_analysis.LinearDiscriminantAnalysis(solver=’svd’, shrinkage=None,
priors=None, n_components=None, store_covariance=False, tol=0.0001)
2.參數(shù)說明
- solver:樣本數(shù)據(jù)的處理方法,字符型,默認(rèn)svd。當(dāng)solver = 'svd'時(shí),svd全稱singular value decomposition,此時(shí)lda不用計(jì)算協(xié)方差矩陣,當(dāng)數(shù)據(jù)特征比較多時(shí),推薦使用'svd'。當(dāng)solver = 'lsqr'時(shí),可與第二個(gè)參數(shù)shrinkage組合使用。當(dāng)solver = 'eigen',可與第二個(gè)參數(shù)Shrinkage組合使用。
- shrinkage:是否使用參數(shù)收縮,默認(rèn)為None。當(dāng)shrinkage = 'auto'時(shí),使用Ledoit-Wolf lemma。當(dāng)shrinkage是一個(gè)0~1之間的浮點(diǎn)數(shù)的時(shí)候,按照比例進(jìn)行收縮。
- n_components:int型,要保留的特征個(gè)數(shù),<= n_features - 1。
3.LDA屬性說明
- covariance_ :協(xié)方差矩陣,[n_features,n_features]
- explained_variance_ratio_ :方差的比例,[n_components]
- means_:類均值,[n_classes,n_features]
- priors_:歸一化的先驗(yàn)概率,[n_classes,]
4.樣例演示
數(shù)據(jù)集下載:鏈接:https://pan.baidu.com/s/1JgTFW0pGvbA6MxFvQ63Nlg
提取碼:j99o
import pandas as pd
from sklearn.preprocessing import LabelEncoder #對(duì)類別值進(jìn)行編碼,
#因?yàn)橛?jì)算機(jī)無法識(shí)別字符型數(shù)值,所以需將其轉(zhuǎn)化為數(shù)值型
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
#由于數(shù)據(jù)集中列沒有名稱,我們自己指定列名
columns = ['sepal length','sepal width','petal length','petal width','category']
data = pd.read_csv('D:\\Py_dataset\\iris.data',names = columns)
#將數(shù)據(jù)劃分為特征X與標(biāo)簽y
X = data[['sepal length','sepal width','petal length','petal width']]
y = data['category']
#對(duì)標(biāo)簽進(jìn)行編碼
lbn = LabelEncoder()
y = lbn.fit_transform(y)
#使用lda對(duì)數(shù)據(jù)進(jìn)行降維
lda = LinearDiscriminantAnalysis(n_components = 2)
X_lda = lda.fit_transform(X,y)
X_lda[:10]
array([[-8.0849532 , 0.32845422],
[-7.1471629 , -0.75547326],
[-7.51137789, -0.23807832],
[-6.83767561, -0.64288476],
[-8.15781367, 0.54063935],
[-7.72363087, 1.48232345],
[-7.23514662, 0.3771537 ],
[-7.62974497, 0.01667246],
[-6.58274132, -0.98737424],
[-7.36884116, -0.91362729]])
LDA除過能對(duì)數(shù)據(jù)進(jìn)行降維還能對(duì)數(shù)據(jù)進(jìn)行分類,下面是LDA的分類過程。
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.3)
lda = LinearDiscriminantAnalysis()
lda.fit(X_train,y_train)
lda.score(X_test,y_test)
1.0
5.LDA小結(jié)
LDA是有監(jiān)督的數(shù)據(jù)降維方式,其目的是尋找最合適的投影方向,以便將數(shù)據(jù)清楚地分出。
LDA既可用于降維,也可用于分類。
LDA不適用于對(duì)非高斯分布樣本進(jìn)行降維。
LDA最多可將樣本降至k-1維(k為類別的數(shù)量),最少為1維。