在線性判別分析LDA原理總結中,咱們對LDA降維的原理作了總結,這裏咱們就對scikit-learn中LDA的降維使用作一個總結。html
在scikit-learn中, LDA類是sklearn.discriminant_analysis.LinearDiscriminantAnalysis。那既能夠用於分類又能夠用於降維。固然,應用場景最多的仍是降維。和PCA相似,LDA降維基本也不用調參,只須要指定降維到的維數便可。python
咱們這裏對LinearDiscriminantAnalysis類的參數作一個基本的總結。git
1)solver: 即求LDA超平面特徵矩陣使用的方法。能夠選擇的方法有奇異值分解"svd",最小二乘"lsqr"和特徵分解"eigen"。通常來講特徵數很是多的時候推薦使用svd,而特徵數很少的時候推薦使用eigen。主要注意的是,若是使用svd,則不能指定正則化參數shrinkage進行正則化。默認值是svdgithub
2)shrinkage:正則化參數,能夠加強LDA分類的泛化能力。若是僅僅只是爲了降維,則通常能夠忽略這個參數。默認是None,即不進行正則化。能夠選擇"auto",讓算法本身決定是否正則化。固然咱們也能夠選擇不一樣的[0,1]之間的值進行交叉驗證調參。注意shrinkage只在solver爲最小二乘"lsqr"和特徵分解"eigen"時有效。算法
3)priors :類別權重,能夠在作分類模型時指定不一樣類別的權重,進而影響分類模型創建。降維時通常不須要關注這個參數。微信
4)n_components:即咱們進行LDA降維時降到的維數。在降維時須要輸入這個參數。注意只能爲[1,類別數-1)範圍之間的整數。若是咱們不是用於降維,則這個值能夠用默認的None。dom
從上面的描述能夠看出,若是咱們只是爲了降維,則只須要輸入n_components,注意這個值必須小於「類別數-1」。PCA沒有這個限制。post
在LDA的原理篇咱們講到,PCA和LDA均可以用於降維。二者沒有絕對的優劣之分,使用二者的原則實際取決於數據的分佈。因爲LDA能夠利用類別信息,所以某些時候比徹底無監督的PCA會更好。下面咱們舉一個LDA降維可能更優的例子。3d
完整代碼參加個人github: https://github.com/nickchen121/machinelearning/blob/master/classic-machine-learning/lda.ipynbcode
咱們首先生成三類三維特徵的數據,代碼以下:
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D %matplotlib inline from sklearn.datasets.samples_generator import make_classification X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2, n_clusters_per_class=1,class_sep =0.5, random_state =10) fig = plt.figure() ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=30, azim=20) ax.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y)
咱們看看最初的三維數據的分佈狀況:
首先咱們看看使用PCA降維到二維的狀況,注意PCA沒法使用類別信息來降維,代碼以下:
from sklearn.decomposition import PCA pca = PCA(n_components=2) pca.fit(X) print pca.explained_variance_ratio_ print pca.explained_variance_ X_new = pca.transform(X) plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y) plt.show()
在輸出中,PCA找到的兩個主成分方差比和方差以下:
[ 0.43377069 0.3716351 ]
[ 1.20962365 1.03635081]
輸出的降維效果圖以下:
因爲PCA沒有利用類別信息,咱們能夠看到降維後,樣本特徵和類別的信息關聯幾乎徹底丟失。
如今咱們再看看使用LDA的效果,代碼以下:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda = LinearDiscriminantAnalysis(n_components=2) lda.fit(X,y) X_new = lda.transform(X) plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y) plt.show()
輸出的效果圖以下:
能夠看出降維後樣本特徵和類別信息之間的關係得以保留。
通常來講,若是咱們的數據是有類別標籤的,那麼優先選擇LDA去嘗試降維;固然也可使用PCA作很小幅度的降維去消去噪聲,而後再使用LDA降維。若是沒有類別標籤,那麼確定PCA是最早考慮的一個選擇了。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)