用scikit-learn进行LDA降维(转载+注释)
對scikit-learn中LDA類概述
在scikit-learn中, LDA類是sklearn.discriminant_analysis.LinearDiscriminantAnalysis。那既可以用于分類又可以用于降維。當然,應用場景最多的還是降維。和PCA類似,LDA降維基本也不用調參,只需要指定降維到的維數即可。
LinearDiscriminantAnalysis類概述
我們這里對LinearDiscriminantAnalysis類的參數做一個基本的總結。
1)solver : 即求LDA超平面特征矩陣使用的方法。可以選擇的方法有奇異值分解"svd",最小二乘"lsqr"和特征分解"eigen"。一般來說特征數非常多的時候推薦使用svd,而特征數不多的時候推薦使用eigen。主要注意的是,如果使用svd,則不能指定正則化參數shrinkage進行正則化。默認值是svd
2)shrinkage:正則化參數,可以增強LDA分類的泛化能力。如果僅僅只是為了降維,則一般可以忽略這個參數。默認是None,即不進行正則化。可以選擇"auto",讓算法自己決定是否正則化。當然我們也可以選擇不同的[0,1]之間的值進行交叉驗證調參。注意shrinkage只在solver為最小二乘"lsqr"和特征分解"eigen"時有效。
3)priors :類別權重,可以在做分類模型時指定不同類別的權重,進而影響分類模型建立。降維時一般不需要關注這個參數。
4)n_components:即我們進行LDA降維時降到的維數。在降維時需要輸入這個參數。注意只能為[1,類別數-1)范圍之間的整數。如果我們不是用于降維,則這個值可以用默認的None。
從上面的描述可以看出,如果我們只是為了降維,則只需要輸入n_components,注意這個值必須小于“類別數-1”。PCA沒有這個限制。
在LDA的原理篇我們講到,PCA和LDA都可以用于降維。兩者沒有絕對的優劣之分,使用兩者的原則實際取決于數據的分布。由于LDA可以利用類別信息,因此某些時候比完全無監督的PCA會更好。下面我們舉一個LDA降維可能更優的例子。
我們首先生成三類三維特征的數據,代碼如下:
#-*- encoding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import numpy as np np.set_printoptions(threshold=np.inf) 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)#在繪制二維圖形的時候這句話必須刪除 # plt.scatter(X[:, 0], X[:, 1], X[:, 2],marker='o',c=y) # plt.show()#彈出一個繪制好的空間圖形 #---------------------------------------以上是博客第1部分--------------------------------------------------我們看看最初的三維數據的分布情況:
首先我們看看使用PCA降維到二維的情況,注意PCA無法使用類別信息來降維,代碼如下:
print"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆" from sklearn.decomposition import PCA pca=PCA(n_components=3)#降低為三維 pca.fit(X) print pca.explained_variance_ratio_ print pca.explained_variance_print"☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆" pca = PCA(n_components=2) pca.fit(X) print pca.explained_variance_ratio_ # [ 0.44021956 0.30507608 0.25470435] # [ 1.44448086 1.00103811 0.83575468] #1.44448086÷(1.44448086 +1.00103811 +0.83575468)=0.44021956 print pca.explained_variance_ X_new = pca.transform(X) print"-"*30 # plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y) # plt.show() #---------------------------------------以上是博客第2部分---------------------------------在輸出中,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) print"X_new=",X_newplt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)#X_new[:, 0]代表第0列,X_new[:, 1]代表第1列 plt.show()#---------------------------------------以上是博客第3部分---------------------------------輸出的效果圖如下:
可以看出降維后樣本特征和類別信息之間的關系得以保留。
一般來說,如果我們的數據是有類別標簽的,那么優先選擇LDA去嘗試降維;當然也可以使用PCA做很小幅度的降維去消去噪聲,然后再使用LDA降維。如果沒有類別標簽,那么肯定PCA是最先考慮的一個選擇了。
總結
以上是生活随笔為你收集整理的用scikit-learn进行LDA降维(转载+注释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sklearn的KNN文档中实例代码的注
- 下一篇: 特征向量按照特征值大小进行排序