主成分分析PCA

向量数据库人工智能与算法增长营销

前言

主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于减少数据维度、去除冗余信息、提取主要特征。以下是PCA的基本实现过程:

假设有一个 数据集 ,其中每一行表示一个样本,每一列表示一个特征。数据集的维度是 ,其中 是样本数, 是特征数

  1. 数据居中:

居中数据是通过减去每个特征的均值来实现的,令 表示第 个特征的均值,则中心化的数据集 可以通过以下公式计算:

这里 是中心化后的数据集元素, 是原始数据集的元素 2. 计算协方差矩阵:

协方差矩阵 的元素 可以通过以下公式计算:

这里, 是协方差矩阵的元素, 和 是中心化后的数据集元素 3. 特征值分解:

对协方差矩阵进行特征值分解,得到特征值 , , , 和相应的特征向量 , , , 4. 选择主成分

将特征值按降序排列,选择前 个特征值对应的特征向量,其中 是选择的主成分数量(一般选择累计贡献率达到80%的主成分或者90%) 5. 将数据集投影到主成分上:

将中心化数据集 乘以选定的前 个特征向量组成的矩阵,得到降维后的数据集 :

其中, 是包含前 个特征向量的矩阵

代码实现


          
from sklearn.decomposition import PCA
          
# 加载手写数字数据集
          
from sklearn.datasets import load_digits
          
digits = load_digits()
          
X = digits.data
          
y = digits.target
          
print(X.shape)
          
X
      

picture.image

使用Scikit-learn库加载手写数字数据集,该数据集包含一组8x8像素的手写数字图像。维度为64*1797,接下来将采用主成分分析PCA对该数据集进行降维处理。


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

执行数据的中心化操作。中心化是指减去每个特征的均值,以使每个特征的均值变为零。


          
from sklearn.decomposition import PCA
          
pca = PCA()
          
pca.fit(X_centered)
          
pca.explained_variance_ratio_ # 贡献率
      

picture.image

使用Scikit-learn的 PCA 类来拟合中心化后的数据,并计算每个主成分(特征向量)解释的方差比例,即贡献率。


          
lg = np.cumsum(pca.explained_variance_ratio_) #累计贡献率
          
lg
      

picture.image


          
import matplotlib.pyplot as plt
          
plt.rcParams['font.sans-serif']='SimHei'
          
%config InlineBackend.figure_format = 'svg'
          
plt.figure(figsize=(8, 6), dpi=300)
          
plt.plot(lg)
          
plt.title('主成分累计贡献率')
          
plt.xlabel('主成分')
          
plt.ylabel('累计贡献率')
          
plt.grid(True)
          
# 找到第一次大于0.8的索引
          
x_first_gt_1 = next(i for i, value in enumerate(lg) if value > 0.8)
          
# 找到第一次大于0.9的索引
          
x_first_gt_2 = next(i for i, value in enumerate(lg) if value > 0.9)
          
x_first_gt_1 += 1
          
x_first_gt_2 += 1
          
plt.axvline(x=x_first_gt_1, color='red', linestyle='--', label=f'累计贡献率 > 0.8 (主成分 {x_first_gt_1})')
          
plt.axvline(x=x_first_gt_2, color='blue', linestyle='--', label=f'累计贡献率 > 0.9 (主成分 {x_first_gt_2})')
          
plt.legend()
          
plt.show()
      

picture.image

累计贡献率大于80%:这是一个常见的起始点,特别是在维度减少的情况下,选择累计贡献率大于80%的主成分通常可以保留大部分数据的信息,同时降低维度。

累计贡献率大于90%:如果对数据的信息损失非常敏感,可以选择一个更高的阈值,例如累计贡献率大于90%。这将保留更多的原始数据信息,但可能会导致更高的维度。

实验调优:在某些情况下,可能需要进行实验来确定最适合特定任务的累计贡献率阈值。可以在不同的累计贡献率阈值之间进行实验,然后评估它们在任务性能上的影响。

目标导向:选择累计贡献率的阈值应该取决于任务目标。如果降维的主要目标是加速模型训练或可视化数据,那么可以容忍一些信息损失。如果需要保留尽可能多的信息以最大程度地保持数据的结构和特征,那么可以选择更高的累计贡献率。


          
pca = PCA(13) # 选取累计贡献率大于80%的主成分(13个主成分)
          
pca.fit(X_centered)
          
pca = pca.transform(X_centered)
          
print(pca.shape)
          
pca
      

picture.image

通过设置主成分数量为13(PCA(13))来保留累计贡献率大于80%的主成分。使得原始数据从641797变为131797,通过这样的操作,实现了对手写数字数据集的降维,保留了累计贡献率大于80%的主成分。这样做可以在保留足够信息的同时减少数据的维度,提高模型训练和预测的效率。

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
DevOps 在字节移动研发中的探索和实践
在日益复杂的APP工程架构下,如何保证APP能高效开发,保障团队效能和工程质量?本次将结合字节内部应用的事件案例,介绍DevOps团队对移动研发效能建设的探索和思考。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论