一、降维的作用
降维的算法只负责减少维数,新产生的特征的意义就必须由我们自己去发现了
- 数据压缩
- 数据可视化
二、 PCA
PCA 属于一种线性、非监督、全局的降维算法,旨在找到数据的主成分,并利用这些主成分表征原始数据,从而达到降维的目的。
PCA 的两面性
- 优点是完全无参数限制的。在 PCA 的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。
- 上边同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
主成分分析法的应用建议
- 一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
- 另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
三、LDA
LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的;“投影后类内方差最小,类间方差最大”。将数据在低维度上进行投影,投影后希望每一种类别数据的投影点尽可能的接近,而不同类别的数据的类别中心之间的距离尽可能的大。
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()