目录
13.1 前言
PCA,即主成分分析法,主要用于对数据的降维,可以通过线性变换将原始数据投影到新的坐标系上实现降维,使其数据更加便于理解,其中这些新的坐标轴称为主成分,按照其对应的方差大小依次排列,第一主成分对应方差最大,第二主成分对应方差次大,以此类推。
什么是降维?
降维是指通过保留一些重要特征并去除冗余特征,减少数据特征的维度的过程
为什么要进行PCA降维处理?
(1)高维数据增加了运算难度,故可以降低许多算法的计算开销
(2)高维数据使得算法的泛化能力变弱,故可以提高泛化能力
(3)可以增加数据的可读性,使得数据集更加便于使用
(4)去除噪声
13.2 PCA的基本介绍
13.2.1 基本原理:
它通过线性变换将原始的高维数据投影到为低维空间中,并且要使得投影后的数据方差最大 (如下图,投影到M比投影到N好 )
13.2.2 PCA的算法流程:
包括以下步骤:
(1)对数据进行去中心化处理,使得坐标轴位于数据中心
(2)计算数据集的均值
(3)计算协方差矩阵,反映了特征之间的关联程度,是PCA的基础
(4)计算协方差的特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量,即特征向量表示了数据变换后的新坐标轴方向,而特征值则表示了在这个方向上的方差大小
(5)将特征值按照从大到小的顺序排序,选取最大的k个
(6)将样本点投影到选取的特征向量上,得到降维后的数据
13.2.3 目标:
确保降维后的数据所损失的信息量应该尽可能的少,并且压缩后的数据要尽可能的对分类,聚类不产生影响
13.2.4 两种思想优化:
最近重构性:
样本投影到低维超平面的距离要尽可能的小
最大可分性:
样本投影到低维空间后要尽可能的分开
13.2.5 优点和缺点:
优点:
(1)降维效果显著:PCA能够有效地降低数据维度,同时保留数据集中的大部分有用信息
(2)数据可视化:将数据降至更低维度,可以帮助更好的理解数据
(3)去除噪声:PCA可以去除数据中的随机噪声
(4)无监督学习:PCA是一种无监督学习算法,不需要类别标签
缺点:
(1)需要线性假设:PCA需要对数据进行假设是线性的,故对于非线性的数据,PCA可能无法有效地提取特征
(2)对样本数量敏感性:如果样本数量远小于特征数量,PCA的性能可能会受到影响
(3)损失重要信息:有的时候并不一定需要进行降维处理,故降维处理可能会损失一些有用的信息
13.2.6 应用场景:
(1)图像处理:用于人脸识别、图像压缩等任务,即通过PCA对图像数据进行降维处理,将关键特征提取出来
(2)文本分析:即通过PCA对文本特征向量进行降维,高维文本数据变得可视化
13.3 python实现PCA降维
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns; sns.set()
rng = np.random.RandomState(1)
X = np.dot(rng.rand(2, 2), rng.randn(2, 200)).T
plt.scatter(X[:, 0], X[:, 1])
plt.axis('equal')
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X)
print(pca.components_)
print(pca.explained_variance_)
def draw_vector(v0, v1, ax=None):
ax = ax or plt.gca()
arrowprops=dict(arrowstyle='->',
linewidth=2,
shrinkA=0, shrinkB=0)
ax.annotate('', v1, v0, arrowprops=arrowprops)
# plot data
plt.scatter(X[:, 0], X[:, 1], alpha=0.3)
for length, vector in zip(pca.explained_variance_, pca.components_):
v = vector * 3 * np.sqrt(length)
draw_vector(pca.mean_, pca.mean_ + v)
plt.axis('equal')
plt.show()
运行结果及其分析:
解释:
(1)矩阵[[ 0.94446029 0.32862557] [-0.32862557 0.94446029]]表示PCA降维后的两个主成分向量,这两个向量分别对应于数据中的最大方差方向,即第一个主成分向量为[0.94446029, 0.32862557],第二个主成分向量为[-0.32862557, 0.94446029]
(2)[0.7625315, 0.0184779]表示第一个主成分解释了约76.25%的方差,第二个主成分解释了约1.84%的方差,即第一个主成分占比更重要
解释:即上图表示使用PCA对二维数据进行降维,绘制了原始数据的散点图,并在图上绘制了主成分向量。其中散点图展示了原始数据在PCA降维后的两个主成分上的分布,箭头表示主成分向量,描述了数据中的最大方差方向
13.4 实例(python代码实现)
问题:
对sklearn库中的鸢尾花数据集(Iris dataset)进行PCA降维处理
实现思想:
使用PCA对鸢尾花数据集进行降维,并将降维前后的数据进行可视化展示,详细如下:
(1)导入所需的库和模块
(2)加载鸢尾花数据集,并且将特征数据存储在变量X中,将标签数据存储在变量y中
(3)使用matplotlib.pyplot绘制原始数据的散点图,根据鸢尾花的种类(0、1、2)分别用不同的颜色表示,并添加图例和标题
(4)创建一个PCA对象,并且设置降维后的维度为2
(5)使用PCA对象的fit_transform方法对原始数据进行降维,将降维后的数据存储在变量X_reduced中,然后使用matplotlib.pyplot绘制降维后数据的散点图,同样根据鸢尾花的种类分别用不同的颜色表示,并添加图例和标题
完整代码:
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 可视化原始数据
plt.figure()
colors = ['pink', 'orange', 'purple']
lw = 3
for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
plt.scatter(X[y == i, 0], X[y == i, 1], color=color, alpha=.8, lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('Original IRIS dataset')
# 使用PCA降维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X)
# 可视化降维后的数据
plt.figure()
colors = ['pink', 'orange', 'purple']
lw = 3
for color, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
plt.scatter(X_reduced[y == i, 0], X_reduced[y == i, 1], color=color, alpha=.8, lw=lw, label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of IRIS dataset')
plt.show()
运行结果及其解释:
解释:上述散点图显示的是原始的鸢尾花数据集,其中x轴和y轴分别代表数据集中的两个特征,点都代表数据样本,不同的颜色代表不同的鸢尾花种类。从图中可以看出,原始数据集中的不同种类的鸢尾花在这两个特征上有一定的区分度,但存在一些重叠
解释:上述散点图显示的是进行主成分分析(PCA)降维处理后的鸢尾花数据集,其中x轴和y轴分别代表经过PCA处理后的两个主成分,与前面一张图相比,降维后的数据在这两个主成分上呈现出更好的区分度,不同种类的鸢尾花被更清晰地分开,体现了PCA降维处理之后的效果
13.4 总结
通过本次博客,我对主成分分析(PCA)有了更深的理解,知道了如何使用PCA对数据样本进行降维处理,降维技术使得数据变得加易于理解和使用,并且它们往往能够去除数据中的噪声,使得其他机器学习任务更加精确,故可以使用其进行数据的预处理。另一方面,PCA在对于非线性数据的处理上存在一定的局限性,降维效果不太好,并且且在处理大规模数据集时可能会遇到内存不足的问题。