1.什么是PCA
PCA是一种常用的降维技术和数据压缩方法。它通过线性变换将原始数据投影到一个新的坐标系统中,使得在新的坐标系下数据的方差最大化。这样做的目的是保留尽可能多的原始数据信息,并找到原始数据中最重要的特征。
主成分分析的主要思想是找到原始数据中的主要成分,即具有最大方差的方向。首先,将原始数据进行标准化处理,使每个特征的均值为0,方差为1。然后,计算数据的协方差矩阵,通过对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示数据在对应特征向量方向上的方差大小。
根据特征值的大小,可以选择保留最大的几个特征向量作为主成分。这些主成分构成了一个新的坐标系,新的坐标系下的数据即为降维后的数据。通常情况下,保留的主成分个数会比原始数据的维度要小,从而实现了对数据的降维。
PCA可以应用于多个领域,包括数据可视化、特征提取、噪声过滤、模式识别等。通过降低数据的维度,PCA可以更好地理解数据的结构,减少数据的冗余信息,并提高后续分析和建模的效果。
2.维度约减
2.1 为什么要维度约减
-
数据可视化:高维数据往往难以可视化,因为我们人类的感知能力和理解能力有限。通过降低数据的维度,我们可以将数据映射到二维或三维空间,从而更容易可视化和理解数据的结构、模式和关系。
-
特征选择:在高维数据中,可能存在许多冗余或不相关的特征。这些特征可能会干扰模型的性能,增加计算和存储的负担。通过维度约减,我们可以选择最具有代表性和信息量的特征,从而提高模型的效果和效率。
-
模型复杂性:高维数据往往需要更复杂的模型来处理,容易导致过拟合或计算困难。通过降低数据的维度,我们可以减少模型的复杂性,提高模型的泛化能力和计算效率。
-
数据存储和计算成本:高维数据需要更多的存储空间和计算资源,导致数据的存储和处理成本增加。通过维度约减,我们可以降低数据的存储需求和计算复杂度,提高数据处理的效率。
2.2 特征维度约减的概念
特征约减的目的是将高维特征向量映射到低维子空间中。比如:给定n个样本(每个样本维度为p维){x1,....xn} 通过特征变换/投影矩阵实现特征空间的压缩:
3.主成分分析PCA
1.主成分分析 (PCA)基本思路
–通过协方差分析,建立高维空间到低维空间的线性映射/矩阵
–保留尽可能多的样本信息
–压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升
2.将原始高维向量通过投影矩阵,投射到低维空间
–这些向量称为主成分 (PCs), 具有无关性、正交的特点。重要
的是这些向量的数量要远小于高维空间的维度。
4.PCA算法步骤
-
数据标准化:对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。这一步骤可以帮助消除不同特征之间的量纲差异。
-
计算协方差矩阵:根据标准化后的数据,计算特征之间的协方差矩阵。协方差矩阵描述了不同特征之间的线性相关性。
-
特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。特征值表示数据在对应特征向量方向上的方差大小,特征向量表示数据在新的坐标系中的方向。
-
选择主成分:根据特征值的大小,选择最大的k个特征值和对应的特征向量作为主成分。k的选择可以根据保留的方差比例或固定的维度等准则来确定。
-
降维投影:将原始数据投影到由所选的主成分构成的新的低维空间中,得到降维后的数据。
5.代码实现
import numpy as np
# 计算协方差矩阵
def calc_cov(X):
m = X.shape[0] # 样本的数量,行数
# 数据标准化
X = (X - np.mean(X, axis=0)) / np.var(X, axis=0) # 标准化之后均值为0,方差为1
return 1 / m * np.matmul(X.T, X) # matmul为两个矩阵的乘积
def pca(X, n_components):
# 计算协方差矩阵
cov_matrix = calc_cov(X)
# 计算协方差矩阵的特征值和对应特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # eigenvalues特征值,eigenvectors特征向量
# 对特征值排序
idx = eigenvalues.argsort()[::-1]
# 取最大的前n_component组
eigenvectors = eigenvectors[:, idx]
eigenvectors = eigenvectors[:, :n_components]
# Y=XP转换
return np.matmul(X, eigenvectors)
from sklearn import datasets
import matplotlib.pyplot as plt
# 导入鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
cov_matrix = calc_cov(X) # 计算特征值
cov_matrix
idx = eigenvalues.argsort()[::-1]
# 取最大的前n_component组
eigenvectors = eigenvectors[:, idx]
eigenvectors = eigenvectors[:, :3]
# Y=PX转换
np.matmul(X, eigenvectors)
运行结果:
6.PCA优缺点
优点:
-
数据降维:PCA可以将高维数据降低到较低维度,减少数据的复杂性和冗余性。通过降维,可以简化数据分析和建模过程,提高计算效率。
-
特征提取:PCA能够从原始数据中提取最具有代表性和区分性的特征。它通过线性变换找到最大方差的特征,从而保留了数据中最重要的信息。
-
数据可视化:通过PCA降维,可以将高维数据映射到二维或三维空间,方便可视化和理解数据的结构、模式和关系。
-
噪声过滤:由于PCA保留了数据中最重要的特征,它可以帮助过滤掉数据中的噪声和冗余信息,从而提高后续分析和建模的效果。
缺点:
-
数据线性关系假设:PCA假设数据是线性相关的,这意味着如果数据之间存在非线性关系,则PCA可能无法很好地捕捉到这些关系。
-
信息丢失:降维过程中,为了减少维度,可能会丢失一部分数据的信息。降维后的数据可能无法完全还原原始数据,因此需要权衡降维带来的信息损失和模型性能的变化。
-
特征解释性:降维后的特征是原始特征的线性组合,它们可能不太容易解释和理解,特别是在高维空间中。
-
计算复杂性:PCA的计算复杂度随着特征数量的增加而增加,特别是在大规模数据集上,计算成本可能很高。