降维——PCA、LDA
2019-03-26 本文已影响3人
dreampai
一、 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()