降維——PCA、LDA
一、 PCA
PCA 屬於一種線性、非監督、全域性的降維演算法,旨在找到資料的主成分,並利用這些主成分表徵原始資料,從而達到降維的目的。
二、LDA
線性判別分析是一種有監督學習演算法,在 PCA 中,演算法沒有考慮資料的標籤(類別),只是把原資料對映到一些方差比較大的方向上而已;LDA 演算法首先是為了分類服務的,因此只要找到一個投影方向使得投影后的樣本儘可能按照原始類別分開,其思想是最大化類間距離和最小化類內距離。
三、PCA 和 LDA 區別
- PCA 是非監督降維演算法,LDA 是有監督降維演算法
- PCA 選擇的是投影后資料方差最大的方向。它是無監督的,因此 PCA 假設方差越大,資訊量越多,用主成分來表示原始資料可以去除冗餘的維度,達到降維。
-
LDA 選擇的是投影后類內方差小、類間方差大的方向。其用到了類別標籤資訊,為了找到資料中具有判別性維度,使得原始資料在這些方向上投影后,不同類別儘可能區分開。
Example:
語音識別中,我們想從一段音訊中提取出人的語音訊號,這時可以使用 PCA 先進行降維,過濾掉一些固定頻率的背景噪聲。但如果我們的需求是從這段音訊中區分出聲音屬於哪個人,那麼我們應該用 LDA 對資料進行降維,使每個人的訊號具有區分性。
四、coding
import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D 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) plt.show() # 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() # 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()