【机器学习四】主成分分析降维算法-PCA

本文深入讲解主成分分析(PCA)算法,探讨其在数据降维、噪音消除和压缩中的应用。解析PCA原理,包括最小投影距离和最大投影方差推导,提供算法流程和Python实现代码,分析优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主成分分析PCA算法

​ 主成分分析(Principal components analysis),简称PCA,是最重要的数据降维算法之一。广泛的用于数据噪音消除和数据压缩消除冗余等领域。

一、降维

​ 常见的数据降维方法有:奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA)。

降维的必要性

  1. 多重共线性和预测变量之间相互关联。多重共线性会导致解空间的不稳定,从而可能导致结果的不连贯。
  2. 高维空间本身具有稀疏性。一维正态分布有68%的值落于正负标准差之间,而在十维空间上只有2%。
  3. 过多的变量,对查找规律造成冗余麻烦。
  4. 仅在变量层面上分析可能会忽略变量之间的潜在联系。例如几个预测变量可能落入仅反映数据某一方面特征的一个组内。

降维的目的

  1. 减少预测变量的个数。
  2. 确保这些变量是相互独立的。
  3. 提供一个框架来解释结果。相关特征,特别是重要特征更能在数据中明确的显示出来;如果只有两维或者三维的话,更便于可视化展示。
  4. 数据在低维下更容易处理、更容易使用。
  5. 去除数据噪声。
  6. 降低算法运算开销。

二、PCA的原理及推导

2.1 PCA思想

​ PCA可解决训练数据中存在数据特征过多或特征累赘的问题。核心思想是将m维特征映射到n维(n < m),这n维形成主元,是重构出来最能代表原始数据的正交特征。

​ 假设数据集是m个n维,(x(1),x(2),⋯ ,x(m))(\boldsymbol x^{(1)}, \boldsymbol x^{(2)}, \cdots, \boldsymbol x^{(m)})(x(1),x(2),,x(m))。如果n=2n=2n=2,需要降维到n′=1n'=1n=1,现在想找到某一维度方向代表这两个维度的数据。下图有u1,u2u_1, u_2u1,u2两个向量方向,但是哪个向量才是我们所想要的,可以更好代表原始数据集的呢?
在这里插入图片描述
从图可看出,u1u_1u1u2u_2u2好,为什么呢?有以下两个主要评价指标:

  1. 样本点到这个直线的距离足够近。
  2. 样本点在这个直线上的投影能尽可能的分开。

如果我们需要降维的目标维数是其他任意维,则:

  1. 样本点到这个超平面的距离足够近。
  2. 样本点在这个超平面上的投影能尽可能的分开。

那么基于这两个标准,我们可以得到PCA推导的两种方法:基于最小投影距离和基于最大投影方差

2.2 基于最小投影距离的PCA推导

​ 基于最小投影距离方法的评价标准是样本点到超平面的距离最小

​ 假设数据集是m个n维,(x(1),x(2),...,x(m))(x^{(1)}, x^{(2)},...,x^{(m)})(x(1),x(2),...,x(m)),且数据进行了中心化(零均值化,即∑i=1mxi=0\sum\limits^{m}_{i=1}x^{i}=0i=1mxi=0)。经过投影变换得到新坐标为 w1,w2,...,wn{w_1,w_2,...,w_n}w1,w2,...,wn,其中 www 是标准正交基,即 ∥w∥2=1\| w \|_2 = 1w2=1wiTwj=0w^T_iw_j = 0wiTwj=0

​ 经过降维后,新坐标为 {w1,w2,...,wn}\{ w_1,w_2,...,w_n \}{w1,w2,...,wn},其中 n′n'n 是降维后的目标维数。样本点 x(i)x^{(i)}x(i) 在新坐标系下的投影为 z(i)=(z1(i),z2(i),...,zn′(i))z^{(i)} = \left(z^{(i)}_1, z^{(i)}_2, ..., z^{(i)}_{n'} \right)z(i)=(z1(i),z2(i),...,zn(i)),其中 zj(i)=wjTx(i)z^{(i)}_j = w^T_j x^{(i)}zj(i)=wjTx(i)x(i)x^{(i)}x(i) 在低维坐标系里第 j 维的坐标。

​ 如果用 z(i)z^{(i)}z(i) 去恢复 x(i)x^{(i)}x(i) ,则得到的恢复数据为 x^(i)=∑j=1n′xj(i)wj=Wz(i)\widehat{x}^{(i)} = \sum^{n'}_{j=1} x^{(i)}_j w_j = Wz^{(i)}x(i)=j=1nxj(i)wj=Wz(i),其中 WWW为标准正交基组成的矩阵。

​ 考虑到整个样本集,样本点到这个超平面的距离足够近,目标变为最小化 ∑i=1m∥x^(i)−x(i)∥22\sum^m_{i=1} \| \hat{x}^{(i)} - x^{(i)} \|^2_2i=1mx^(i)x(i)22 。对此式进行推理,可得:
∑i=1m∥x^(i)−x(i)∥22=∑i=1m∥Wz(i)−x(i)∥22=∑i=1m(Wz(i))T(Wz(i))−2∑i=1m(Wz(i))Tx(i)+∑i=1m(x(i))Tx(i)=∑i=1m(z(i))T(z(i))−2∑i=1m(z(i))Tx(i)+∑i=1m(x(i))Tx(i)=−∑i=1m(z(i))T(z(i))+∑i=1m(x(i))Tx(i)=−tr(WT(∑i=1mx(i)(x(i))T)W)+∑i=1m(x(i))Tx(i)=−tr(WTXXTW)+∑i=1m(x(i))Tx(i) \sum^m_{i=1} \| \hat{x}^{(i)} - x^{(i)} \|^2_2 = \sum^m_{i=1} \| Wz^{(i)} - x^{(i)} \|^2_2 \\ = \sum^m_{i=1} \left( Wz^{(i)} \right)^T \left( Wz^{(i)} \right) - 2\sum^m_{i=1} \left( Wz^{(i)} \right)^T x^{(i)} + \sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)} \\ = \sum^m_{i=1} \left( z^{(i)} \right)^T \left( z^{(i)} \right) - 2\sum^m_{i=1} \left( z^{(i)} \right)^T x^{(i)} + \sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)} \\ = - \sum^m_{i=1} \left( z^{(i)} \right)^T \left( z^{(i)} \right) + \sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)} \\ = -tr \left( W^T \left( \sum^m_{i=1} x^{(i)} \left( x^{(i)} \right)^T \right)W \right) + \sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)} \\ = -tr \left( W^TXX^TW \right) + \sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)} i=1mx^(i)x(i)22=i=1mWz(i)x(i)22=i=1m(Wz(i))T(Wz(i))2i=1m(Wz(i))Tx(i)+i=1m(x(i))Tx(i)=i=1m(z(i))T(z(i))2i=1m(z(i))Tx(i)+i=1m(x(i))Tx(i)=i=1m(z(i))T(z(i))+i=1m(x(i))Tx(i)=tr(WT(i=1mx(i)(x(i))T)W)+i=1m(x(i))Tx(i)=tr(WTXXTW)+i=1m(x(i))Tx(i)
​ 在推导过程中,分别用到了 x‾(i)=Wz(i)\overline{x}^{(i)} = Wz^{(i)}x(i)=Wz(i) ,矩阵转置公式 (AB)T=BTAT(AB)^T = B^TA^T(AB)T=BTATWTW=IW^TW = IWTW=Iz(i)=WTx(i)z^{(i)} = W^Tx^{(i)}z(i)=WTx(i) 以及矩阵的迹,最后两步是将代数和转为矩阵形式。
​ 由于 WWW 的每一个向量 wjw_jwj 是标准正交基,∑i=1mx(i)(x(i))T\sum^m_{i=1} x^{(i)} \left( x^{(i)} \right)^Ti=1mx(i)(x(i))T 是数据集的协方差矩阵,∑i=1m(x(i))Tx(i)\sum^m_{i=1} \left( x^{(i)} \right)^T x^{(i)}i=1m(x(i))Tx(i) 是一个常量。最小化 ∑i=1m∥x^(i)−x(i)∥22\sum^m_{i=1} \| \hat{x}^{(i)} - x^{(i)} \|^2_2i=1mx^(i)x(i)22 又可等价于
arg⁡min⁡⏟W−tr(WTXXTW)s.t.WTW=I \underbrace{\arg \min}_W - tr \left( W^TXX^TW \right) s.t.W^TW = I Wargmintr(WTXXTW)s.t.WTW=I
利用拉格朗日函数可得到
J(W)=−tr(WTXXTW)+λ(WTW−I) J(W) = -tr(W^TXX^TW) + \lambda(W^TW - I) J(W)=tr(WTXXTW)+λ(WTWI)
​ 对 WWW 求导,可得 −XXTW+λW=0-XX^TW + \lambda W = 0XXTW+λW=0 ,也即 XXTW=λWXX^TW = \lambda WXXTW=λWXXTXX^TXXTn′n'n 个特征向量组成的矩阵,λ\lambdaλXXTXX^TXXT 的特征值。WWW 即为我们想要的矩阵。
​ 对于原始数据,只需要 z(i)=WTX(i)z^{(i)} = W^TX^{(i)}z(i)=WTX(i) ,就可把原始数据集降维到最小投影距离的 n′n'n 维数据集。

2.3 基于最大投影方差的PCA推导

​ 假设数据集是m个n维,(x(1),x(2),...,x(m))(x^{(1)}, x^{(2)},...,x^{(m)})(x(1),x(2),...,x(m)),且数据进行了中心化(零均值化,即∑i=1mxi=0\sum\limits^{m}_{i=1}x^{i}=0i=1mxi=0)。经过投影变换得到新坐标为 w1,w2,...,wn{w_1,w_2,...,w_n}w1,w2,...,wn,其中 www 是标准正交基,即 ∥w∥2=1\| w \|_2 = 1w2=1wiTwj=0w^T_iw_j = 0wiTwj=0

​ 经过降维后,新坐标为 {w1,w2,...,wn}\{ w_1,w_2,...,w_n \}{w1,w2,...,wn},其中 n′n'n 是降维后的目标维数。样本点 x(i)x^{(i)}x(i) 在新坐标系下的投影为 z(i)=(z1(i),z2(i),...,zn′(i))z^{(i)} = \left(z^{(i)}_1, z^{(i)}_2, ..., z^{(i)}_{n'} \right)z(i)=(z1(i),z2(i),...,zn(i)),其中 zj(i)=wjTx(i)z^{(i)}_j = w^T_j x^{(i)}zj(i)=wjTx(i)x(i)x^{(i)}x(i) 在低维坐标系里第 j 维的坐标。

​ 对于任意一个样本x(i)x(i)x(i),在新的坐标系中的投影为WTx(i)W^Tx^{(i)}WTx(i),在新坐标系中的投影方差为x(i)TWWTx(i)x^{(i)T}WW^Tx^{(i)}x(i)TWWTx(i),要使所有的样本的投影方差和最大,也就是最大化∑i=1mWTx(i)x(i)TW\sum\limits^{m}_{i=1}W^Tx^{(i)}x^{(i)T}Wi=1mWTx(i)x(i)TW的迹,即:
arg⁡max⁡⏟wtr(WTXXTW)s.t.WTW=I \underbrace{\arg\max}_{w} tr \left( W^TXX^TW \right) s.t.W^TW = I wargmaxtr(WTXXTW)s.t.WTW=I
​ 对比最小投影距离的优化方程,可以发现都是一样的,一个是负号的最小化,一个是正的最大化,所以计算过程是一样的,不再计算。

三、PCA算法流程

输入:nnn 维样本集 D=(x(1),x(2),...,x(m))D = \left( x^{(1)},x^{(2)},...,x^{(m)} \right)D=(x(1),x(2),...,x(m)) ,目标降维的维数 n′n'n

输出:降维后的新样本集 D′=(z(1),z(2),...,z(m))D' = \left( z^{(1)},z^{(2)},...,z^{(m)} \right)D=(z(1),z(2),...,z(m))

主要步骤如下:

  1. 对所有的样本进行中心化,x(i)=x(i)−1m∑j=1mx(j)x^{(i)} = x^{(i)} - \frac{1}{m} \sum^m_{j=1} x^{(j)}x(i)=x(i)m1j=1mx(j)
  2. 计算样本的协方差矩阵 XXTXX^TXXT
  3. 对协方差矩阵 XXTXX^TXXT 进行特征值分解。
  4. 取出最大的 $n’ $ 个特征值对应的特征向量 {w1,w2,...,wn′}\{ w_1,w_2,...,w_{n'} \}{w1,w2,...,wn}
  5. 标准化特征向量,得到特征向量矩阵 WWW
  6. 转化样本集中的每个样本 z(i)=WTx(i)z^{(i)} = W^T x^{(i)}z(i)=WTx(i)
  7. 得到输出矩阵 D′=(z(1),z(2),...,z(n))D' = \left( z^{(1)},z^{(2)},...,z^{(n)} \right)D=(z(1),z(2),...,z(n))
    :在降维时,有时不明确目标维数,而是指定降维到的主成分比重阈值 k(kϵ(0,1])k(k \epsilon(0,1])k(kϵ(0,1]) 。假设 nnn 个特征值为 λ1⩾λ2⩾...⩾λn\lambda_1 \geqslant \lambda_2 \geqslant ... \geqslant \lambda_nλ1λ2...λn ,则 n′n'n 可从 ∑i=1n′λi⩾k×∑i=1nλi\sum^{n'}_{i=1} \lambda_i \geqslant k \times \sum^n_{i=1} \lambda_ii=1nλik×i=1nλi 得到。

四、手撕PCA代码

'''
手写PCA降维算法
'''

import numpy as np

def PCA(X,n):
    X_mean = np.mean(X,axis=1)
    X = X - X_mean.reshape(-1,1)
    # 求协方差矩阵
    cov_mat = np.dot(X,X.T)
    # 将协方差进行特征值分解 第一个返回值是特征值矩阵,第二个返回值是特征向量矩阵
    values,vectors = np.linalg.eig(cov_mat)
    # 按特征值将特征向量进行排序
    # 拼接一个特征值和特征向量一起的矩阵
    eig_mat = [(np.abs(values[i]),vectors[:,i]) for i in range(len(X))]
    # 排序
    eig_mat.sort(reverse=True)
    # 拼接WT矩阵 降维后的权重矩阵,只保留要保留的列
    WT = np.array([_[1] for _ in eig_mat[:n]])
    # 对X进行转换,降维
    return np.dot(WT,X)

# 数据生成 直接转置,因为协方差矩阵A = (X - X.mean).T
#(2.5,2.4), (0.5,0.7), (2.2,2.9), (1.9,2.2), (3.1,3.0), (2.3, 2.7), (2, 1.6), (1, 1.1), (1.5, 1.6), (1.1, 0.9)
X = np.transpose(np.array([[2.5,2.4], [0.5,0.7], [2.2,2.9], [1.9,2.2], [3.1,3.0], [2.3, 2.7],[2, 1.6],[1, 1.1],[1.5, 1.6],[1.1, 0.9]]))
# 降至的维度
n = 1

if __name__ == "__main__":
    X = PCA(X,n)
    print(X)

五、PCA算法主要优缺点

优缺点简要说明
优点1. 仅仅需要以方差衡量信息量,不受数据集以外的因素影响。 2.各主成分之间正交,可消除原始数据成分间的相互影响的因素。3. 计算方法简单,主要运算是特征值分解,易于实现。
缺点1.主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。2. 方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值