机器学习--主成分分析(PCA)

一、主成分分析概述

     PCA(Principal Component Analysis,主成分分析)是一种常用的降维算法,它通过投影的方式将高维数据映射到低维的空间中,并且保证在所投影的维度上,原数据的信息量最大,从而使用较少的数据维度,保留住较多的原始数据特性。 

640188033bbf41a99ec35880229f0ebb.png

图1 数据点投影到低维超平面

二、PCA可以基于两种思路进行优化

         最近重构性:样本点在这个低位超平面的距离最近

         最大可分性 :样本点在低维超平面上的投影尽可能分开

基于最近重构性和最大可分性,能够分别得到主成分分析的两种等价推导: 

     先从最近重构性来推导,假定数据样本已经进行了中心化处理。进一步地,我们通过投影变换得到了一个新的坐标系,该坐标系由一组标准正交基向量 {𝑤1,𝑤2,…,𝑤𝑑}组成。在这个新坐标系中,每个向量 𝑤𝑖都是单位向量,即,并且对于 𝑖≠𝑗,向量wi​ 和 wj​ 之间是正交的,即 eq?w_i%5Ccdot%20%7Bw_j%7D%5E%7BT%7D=0。

     如果我们选择丢弃新坐标系中的部分坐标,即将数据的维度从 𝑑 降低到 𝑑′<𝑑,那么每个样本点在低维坐标系中的投影可以表示为 eq?%5Cmathbf%7Bz%7D_i%20%3D%20%28z_%7Bi1%7D%2C%20z_%7Bi2%7D%2C%20%5Cldots%2C%20z_%7Bid%27%7D%29,其中 eq?z_%7Bij%7D%20%3D%20%5Cmathbf%7Bw%7D_j%5E%5Ctop%20%5Ccdot%20%5Cmathbf%7Bx%7D_i 是样本点 𝑥𝑖​ 在低维坐标系下第 𝑗 维的坐标。

若基于降维后的坐标 𝑧𝑖来重构原始样本点 eq?x_i,我们会得到一个重构的样本点 eq?x_i,其计算公式为:

eq?%5Cmathbf%7Bx%7D_i%20%3D%20%5Csum_%7Bj%3D1%7D%5E%7Bd%27%7D%20z_%7Bij%7D%20%5Cmathbf%7Bw%7D_j

原样本点eq?x_i 与基于投影重构的样本点eq?%5Chat%7Bx_i%7D之间的距离为

eq?%5Cleft%5C%7C%20%5Cmathbf%7B%20%5Chat%7Bx%7D%7D_i%20-%20%5Cmathbf%7Bx%7D_i%20%5Cright%5C%7C%5E2%20%3D%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cmathbf%7Bz%7D_i%5ET%5Cmathbf%7Bz%7D_i%20-%202%5Csum_%7Bi%3D1%7D%5E%7Bm%7D%5Cmathbf%7Bz%7D_i%5ET%5Cmathbf%7BW%7D%5ET%5Cmathbf%7Bx%7D_i%20&plus;%20%5Ctext%7Bconst%7D

eq?%5Calpha%20-tr%5Cleft%20%28%20W%5E%7BT%7D%5Cleft%20%28%20%5Csum_%7Bi%3D1%7D%5E%7Bm%7Dx_ix_%7Bi%7D%5E%7BT%7D%20%5Cright%20%29W%20%5Cright%20%29 

其中eq?W%3D%5Cleft%20%28%20w_1%2Cw_2%2C....%2Cw_d%20%5Cright%20%29 ,根据最近重构性,以上的式子应被最小化,考虑到eq?w_j是标准正交基,eq?%5Csum_%7Bi%7Dx_ix_%7Bi%7D%5E%7BT%7D是协方差矩阵,有

         eq?min_w%5C%2C%20%5C%2C%20-%20tr%5Cleft%20%28%20W%5E%7BT%7DXX%5E%7BT%7DW%20%5Cright%20%29            (1.1)

  eq?s.t.%20%5C%2C%20%5C%2C%20W%5ETW%3D1 

这就是主成分分析的优化目标 。

       从最大可分性出发,能得到主成分分析的另一种解释。样本点eq?x_i在新空间中超平面上的投影是 eq?W%5ETx_i,若所有样本点的投影能尽可能分开,则应该使投影后样本点的方差最大化,如图 2 所示
      投影后样本点的协方差矩阵是eq?%5Csum%20_iW%5ETx_ix_%7Bi%7D%5E%7BT%7DW 于是优化目标可写为

eq?max_m%20%5C%2C%20%5C%2C%20%5C%2C%20tr%5Cleft%20%28%20W%5ETXX%5ETW%20%5Cright%20%29           (1.2)

eq?s.t.%5C%2C%20%5C%2C%20W%5ETW%3DI

135e3bc84d244216b7ae2e8f98dd991d.png

图2 使所有样本的投影尽可能分开(如图中红线所示)需最大化投影点的方差

因为式子(1.1)与式子(1.2)等价,对其中一个式子使用拉格朗日乘子法可得

      eq?XX%5ETw_i%3D%5Clambda%20_iw_i 

 因此,只需对协方差矩阵eq?XX%5ET进行特征值分解,将求得的特征值排序:eq?%5Clambda%20_1%5Cgeq%20%5Clambda%20_2%5Cgeq%20%5Ccdots%20%5Cgeq%5Clambda%20_p%5Cgeq0,再取前d'个特征值对应的特征向量构成eq?W*%3D%5Cleft%20%28%20w_1%2Cw_2%2C...%2Cw_d%27%20%5Cright%20%29,这就是主成分分析的解。

三、PCA算法的步骤 

假设有n个样本,m个指标,则可以构成大小为n*m的样本矩阵X:

                                                                                     eq?X%20%3D%20%5Cbegin%7Bbmatrix%7D%20x_%7B11%7D%20%26%20x_%7B12%7D%20%26%20%5Ccdots%20%26%20x_%7B1m%7D%20%5C%5C%20x_%7B21%7D%20%26%20x_%7B22%7D%20%26%20%5Ccdots%20%26%20x_%7B2m%7D%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cddots%20%26%20%5Cvdots%20%5C%5C%20x_%7Bn1%7D%20%26%20x_%7Bn2%7D%20%26%20%5Ccdots%20%26%20x_%7Bnm%7D%20%5Cend%7Bbmatrix%7D%3D%5Cleft%20%28%20x_1%2Cx_2%2C...x_m%20%5Cright%20%29

 

1. 数据中心化处理:对原始数据进行标准化处理,使得每个特征的均值为0,方差为1。

                               eq?X_j%20%3D%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%20x_%7Bij%7D

                     eq?S_j%3D%7B%5Csqrt%7B%5Cfrac%7B1%7D%7Bn-1%7D%20%5Csum_%7Bk%3D1%7D%5E%7Bn%7D%20%28x_%7Bkj%7D%20-%20%5Cmu_j%29%5E2%7D%7D   

                                  eq?X_%7Bij%7D%20%3D%20%5Cfrac%7Bx_%7Bij%7D%20-%20%5Cbar%7Bx%7D_j%7D%7BS_j%7D 

其中eq?X_j为原始X矩阵平均值,eq?S_j为原始X矩阵标准差,eq?X_%7Bij%7D为标准化处理后元素

以下为数据中心化后的坐标系: 

2a3a7767d8744b75a03d7acdeedcdb35.png 5c1083f946544c44904781c5832d3c14.png

2. 计算协方差矩阵:根据标准化后的数据计算协方差矩阵,用来衡量不同特征之间的关联性。

                      eq?r_%7Bij%7D%20%3D%20%5Cfrac%7B1%7D%7Bn-1%7D%20%5Csum_%7Bk%3D1%7D%5E%7Bn%7D%20%5Cleft%28x_%7Bki%7D%20-%20%5Cbar%7Bx%7D_i%5Cright%29%5Cleft%28x_%7Bkj%7D%20-%20%5Cbar%7Bx%7D_j%5Cright%29 

                 eq?R%20%3D%20%5Cbegin%7Bbmatrix%7D%20r_%7B11%7D%20%26%20r_%7B12%7D%20%26%20%5Ccdots%20%26%20r_%7B1m%7D%20%5C%5C%20r_%7B21%7D%20%26%20r_%7B22%7D%20%26%20%5Ccdots%20%26%20r_%7B2m%7D%20%5C%5C%20%5Cvdots%20%26%20%5Cvdots%20%26%20%5Cddots%20%26%20%5Cvdots%20%5C%5C%20r_%7Bn1%7D%20%26%20r_%7Bn2%7D%20%26%20%5Ccdots%20%26%20r_%7Bnm%7D%20%5Cend%7Bbmatrix%7D

3. 特征值分解:对协方差矩阵进行特征值分解

将求解的特征值排序:eq?%5Clambda%20_1%5Cgeq%20%5Clambda%20_2%5Cgeq%20%5Ccdots%20%5Cgeq%5Clambda%20_p%5Cgeq0

特征向量:eq?a_%7B1%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20a_%7B11%7D%20%5C%5C%20a_%7B21%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20a_%7Bp%201%7D%20%5Cend%7Barray%7D%5Cright%5D%2C%20a_%7B2%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20a_%7B12%7D%20%5C%5C%20a_%7B22%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20a_%7Bp%202%7D%20%5Cend%7Barray%7D%5Cright%5D%2C%20%5Ccdots%2C%20a_%7Bp%7D%3D%5Cleft%5B%5Cbegin%7Barray%7D%7Bc%7D%20a_%7B1%20p%7D%20%5C%5C%20a_%7B2%20p%7D%20%5C%5C%20%5Cvdots%20%5C%5C%20a_%7Bp%20p%7D%20%5Cend%7Barray%7D%5Cright%5D

4. 选择主成分:根据特征值的大小选择最大的前k个特征向量作为主成分。

贡献率:eq?%5Cfrac%7B%5Clambda_%7Bi%7D%7D%7B%5Csum_%7Bk%3D1%7D%5E%7Bp%7D%20%5Clambda_%7Bk%7D%7D%28i%3D1%2C2%2C%20%5Ccdots%2C%20p%29

累计贡献率:eq?%5Cfrac%7B%5Csum_%7Bk%3D1%7D%5E%7Bi%7D%20%5Clambda_%7B%5Cmathrm%7Bk%7D%7D%7D%7B%5Csum_%7Bk%3D1%7D%5E%7Bp%7D%20%5Clambda_%7Bk%7D%7D%28i%3D1%2C2%2C%20%5Ccdots%2C%20p%29

                                                                    选择 𝑘 的标准是使得累计贡献率达到一个可接受的阈值

5. 数据投影:将原始数据投影到选取的主成分上,得到降维后的数据。

代码运行结果

7e98a49e6f994a58b3ff7b3c47b30e5c.png 

四、代码实现

import numpy as np
import matplotlib.pyplot as plt

# 生成数据
np.random.seed(0)  # 设置随机种子以获得可复现的结果
X = np.empty((100, 2))
X[:, 0] = np.random.uniform(-10, 10, size=100)
X[:, 1] = 0.6 * X[:, 0] + np.random.normal(0, 3, size=100)

# 数据中心化处理
mean_X = X.mean(axis=0)
X_centered = X - mean_X

# 计算协方差矩阵
cov_matrix = np.cov(X_centered, rowvar=False)

# 特征值分解
eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)

# 选择主成分
# 选择最大的特征值对应的特征向量作为最好的主成分方向
max_eigenvalue_index = np.argmax(eigenvalues)
principal_component = eigenvectors[:, max_eigenvalue_index]

# 数据投影到主成分空间
X_reduced = X_centered.dot(principal_component.reshape(-1, 1))

# 绘制中心点数据
plt.scatter(X_centered[:, 0], X_centered[:, 1], color='black', label='Centered Data')

# 绘制最好的主成分方向
pc_scale = 10  # 控制主成分方向线的长度
plt.arrow(mean_X[0], mean_X[1], pc_scale * principal_component[0], pc_scale * principal_component[1],
           color='red', head_width=0.1, head_length=0.1)
plt.text(0, 0, "PCA", color='red', fontsize=12)


plt.title('PCA - Principal Component Analysis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid(True)
plt.show()

 主成分方向为图中红色直线:

61d48c46cd1c4e8eb4e7c4ad3bc1aca7.png 

五、PCA的优缺点 

优点:

  1. 数据简化:PCA能够显著降低数据的维度,同时尽量保留数据中的变异性。这对于处理高维数据集特别有用,可以减少计算复杂度,加快后续数据分析或机器学习模型的训练速度。

  2. 去除噪声:在进行PCA时,与数据方差较小的方向相关的噪声可能会被过滤掉,因为这些方向上的特征往往被赋予较低的权重。

  3. 特征提取:通过识别数据的主要成分,PCA可以帮助发现数据集中的关键结构和模式,提供对数据更深入的理解。

  4. 可视化:对于高维数据,降维至2D或3D后,可以使用图形方式展示,便于人类直观理解数据分布。

  5. 优化存储和计算资源:降维减少了存储数据所需的内存空间,同时降低了计算资源的需求。

缺点:

  1. 丢失信息:尽管努力保持数据的变异性,PCA仍可能丢弃对某些任务重要的低方差特征。这意味着,尽管降维,可能损失一些分类或预测能力。

  2. 线性假设:PCA基于线性变换,因此可能无法捕获非线性的数据关系。对于非线性数据分布,可能需要使用如Kernel PCA或其他非线性降维方法。

  3. 依赖于尺度:PCA对数据的尺度非常敏感,要求输入数据通常是经过标准化处理的。未标准化的数据可能导致不正确的结果。

  4. 解释性问题:降维后的主成分往往是原始特征的线性组合,这可能使得新特征难以解释,尤其是在需要领域知识解释的场景下。

  5. 最优成分数量选择:确定要保留的主成分数目k可能具有一定的主观性,通常需要通过经验或交叉验证等方法来决定。

 

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值