机器学习——PCA降维

目录

一、算法概述

1.1什么是降维

1.2为什么要降维

1.3降维实现原理

1.4降维的方法

1.4.1主成分分析(PrincipalComponentAnalysis,PCA)   

1.4.2因子分析(Factor Analysis)

1.4.3独立成分分析(Independent Component Analysis, ICA)

二、主成分分析法(PCA)

2.1主成分分析(PCA)基本思路

2.2PCA算法的实现步骤

2.3协方差矩阵

四、算法应用

4.1人脸识别降维

五、总结

5.1PCA算法的优点

5.2PCA算法的缺点

5.3PCA的应用:

5.4PCA的局限性:


一、算法概述

1.1什么是降维

降维的概念:

①降维(Dimensionality Reduction,DR)是指采用线性或者非线性的映射方法将高维空间的样本映射到低维空间中。

②降维获得低维空间的数据等价表示,实现高维数据的可视化呈现。

1.2为什么要降维

降维的作用:

①在原始的高维空间中,包含有冗余信息以及噪声信息。图像识别中如果噪声太多会造成误差降低识别准确率;通过降维,可以减少冗余信息所造成的误差,提高识别的精度、降低算法开
销。

②通过降维可以寻找数据内部的本质结构特征。

③降维可以得到原始数据的简化表示以加速后续处理或者改进输出结果,即降维可以得到原始数据的简化表示以加速后续处理或者改进输出结果,因此它已经成为很多算法数据进行预处理的重要手段。

1.3降维实现原理

        在降维过程中,会减少特征的数量,这意味着删除数据,数据量变少则表示模型可以获取的信息会变少,模型的表现可能会因此受影响。同时,在高维数据中,必然有一些特征是不带有效的信息的(比如噪音),或者有一些特征带有的信息和其他一些特征是重复的(比如一些特征可能会线性相关)。

我们希望能够找出一种办法来帮助我们衡量特征上所带的信息量,让我们在降维的过程中,能够既减少特征的数量,又保留大部分有效信息——将那些带有重复信息的特征合并,并删除那些带无效信息的特征等等——逐渐创造出能够代表原特征矩阵大部分信息的,特征更少的,新特征矩阵。

1.4降维的方法

1.4.1主成分分析(PrincipalComponentAnalysis,PCA)   
1.4.2因子分析(Factor Analysis)

因子分析是一种统计方法,用于揭示观察变量之间的潜在结构或模式。其基本思想是,观察变量可以通过较少数量的未观察的变量,称为因子,来解释或表示。这些因子是隐含在观察变量背后的共性因素,能够帮助理解数据中的相关性和变量之间的复杂关系。

1.4.3独立成分分析(Independent Component Analysis, ICA)

独立成分分析是一种信号处理和统计方法,旨在从多个随机变量的混合中分离出独立的非高斯信号成分。其核心思想是,将混合信号分解为几个相互独立的信号源,这些信号源具有最大的互信息(相互信息量)。

二、主成分分析法(PCA)

2.1主成分分析(PCA)基本思路

-通过协方差分析,建立高维空间到低维空间的线性映射/矩阵

-保留尽可能多的样本信息

-压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升

2.2PCA算法的实现步骤

①将原始数据按行组成m行n列的矩阵X,将X的每一列(代表一个属性字段)进行零均值化,即减去      这一列的均值;
③求出协方差矩阵;
④求出协方差矩阵的特征值及对应的特征向量r;
⑤将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P⑥计算降维到k维的数据。

2.3协方差矩阵

方差描述一个数据的离散程度

{var}(X) = \frac{1}{m} \sum_{i=1}^{m} (X_i - \overline{X})^2

协方差描述两个数据的相关性接近1就是正相关,接近-1就是负相关,接近0就是不相关

{cov}(X, Y) = \frac{1}{m} \sum_{i=1}^{m} (X_i - \overline{X})(Y_i - \overline{Y})

协方差只能处理二维问题,那维数多了就需要计算多个协方差,我们可以使用矩阵来组织这些数据。
协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差

二维的例子:

C = \begin{bmatrix} \text{cov}(x,x) & \text{cov}(y,x) \\ \text{cov}(x,y) & \text{cov}(y,y) \end{bmatrix}

三维的例子:

C= \begin{bmatrix} \text{cov}(x,x) & \text{cov}(y,x) & \text{cov}(z,x) \\ \text{cov}(x,y) & \text{cov}(y,y) & \text{cov}(z,y) \\ \text{cov}(x,z) & \text{cov}(y,z) & \text{cov}(z,z) \end{bmatrix}

协方差矩阵
n个特征,m个样本。n行m列:

X= \left[ \begin{matrix} X_{1} & \cdots & x_{1} \\ \vdots & \ddots & \vdots \\ X_{n} & \cdots & x_{n} \end{matrix} \right]=\left[ \begin{matrix} x_{1}^{1} & \cdots & x_{1}^{m} \\ \vdots & \ddots & \vdots \\ x_{n}^{1} & \cdots & x_{n}^{m} \end{matrix} \right]

n行m列乘m行n列->n行n列:

XX_{_T}=\sum =\left[ \begin{matrix} \sum_{11} & \cdots & \sum_{1n} \\ \vdots & \ddots & \vdots \\ \sum_{n1} & \cdots & \sum_{nn} \end{matrix} \right]

通过数据集的协方差矩阵及其特征值分析,我们可以得到协方差矩阵的特征向量和特征值,我们需要保留k个维度的特征就选取最大的k个特征值

四、算法应用

4.1人脸识别降维

1.查看原图

from sklearn.datasets import fetch_lfw_people  # 导入fetch_lfw_people数据集模块
from sklearn.decomposition import PCA  # 导入PCA(主成分分析)模块
import matplotlib.pyplot as plt  # 导入绘图模块
import numpy as np  # 导入numpy库
 
# 使用fetch_lfw_people函数加载数据集,要求每个人至少有60张图片
# faces = fetch_lfw_people(min_faces_per_person=60)
# print(faces.data.shape)
faces = fetch_lfw_people(data_home="D:\\Download\\", download_if_missing=False, min_faces_per_person=60)  # 从本地目录加载数据集
X = faces.data  # 获取图像数据
# print(faces.data.shape)     # 输出(1348,2914),表示共有1348张图像,每张图像有2914个特征
# print(faces.images.shape)   # 输出(1348, 62, 47),表示共有1348张图像,每张图像的尺寸为62x47
 
# 创建子图,3行8列,设置图像大小和不显示坐标轴
fig, axes = plt.subplots(3, 8, figsize=(8, 4), subplot_kw={"xticks": [], "yticks": []})
 
# 对axes对象进行处理
for i, ax in enumerate(axes.flat):  # 遍历展平后的axes对象
    ax.imshow(faces.images[i, :, :], cmap="gray")  # 在当前子图上显示灰度图像
plt.show()  # 显示图形

2.进行降维后的图像

pca = PCA(150).fit(X)  # 使用PCA对数据集X进行拟合,保留150个主成分
V = pca.components_  # 获取PCA模型的主成分(特征向量)
V.shape  # 输出主成分矩阵的形状,应为(150, 2914),表示150个主成分每个有2914个特征

# 创建子图,3行8列,设置图像大小和不显示坐标轴
fig, axes = plt.subplots(3, 8, figsize=(8, 4), subplot_kw={"xticks": [], "yticks": []})

# 在子图上显示每个主成分(特征向量)
for i, ax in enumerate(axes.flat):
    ax.imshow(V[i, :].reshape(62, 47), cmap="gray")  # 将展平的主成分重塑为62x47的图像并显示灰度图
plt.show()  # 显示图形

使用PCA对人脸数据集进行降维处理,并展示了前150个主成分(特征向量)的灰度图像。

3.逆变换还原图像

from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

faces = fetch_lfw_people(data_home="D:\\Download\\", download_if_missing=False, min_faces_per_person=60)
X = faces.data

pca = PCA(n_components=150)  # 使用PCA进行降维,保留150个主成分
X_dr = pca.fit_transform(X)  # 对数据进行拟合和降维

X_inverse = pca.inverse_transform(X_dr)  # 对降维后的数据进行逆变换,恢复原始维度

# 创建子图,2行10列,设置图像大小和不显示坐标轴
fig, ax = plt.subplots(2, 10, figsize=(10, 2.5), subplot_kw={"xticks": [], "yticks": []})

# 在子图中显示原始图像和逆变换后的图像
for i in range(10):
    ax[0, i].imshow(faces.images[i, :, :], cmap="binary_r")  # 显示原始图像
    ax[1, i].imshow(X_inverse[i].reshape(62, 47), cmap="binary_r")  # 显示逆变换后的图像

plt.tight_layout()  # 调整子图布局,使其更紧凑
plt.show()  # 显示图形

结论:

       可以明显看出,这两组数据可视化后,由降维后再通过inverse_transform转换回原维度的数据画出的图像和原数据画的图像大致相似,但原数据的图像明显更加清晰。这说明inverse_transform并没有实现数据的完全逆转。这是因为,在降维的时候,部分信息已经被舍弃了,X_dr中往往不会包含原数据100%的信息,所以在逆转的时候,即便维度升高,原数据中已经被舍弃的信息也不可能再回来了。所以,降维不是完全可逆的。Inverse_transform的功能,是基于X_dr中的数据进行升维,将数据重新映射到原数据所在的特征空间中,而并非恢复所有原有的数据。但同时,我们也可以看出,降维到300以后的数据,的确保留了原数据的大部分信息,所以图像看起来,才会和原数据高度相似,只是稍稍模糊罢了。

五、总结

5.1PCA算法的优点

-仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
-各主成分之间正交,可消除原始数据成分间的相互影响的因素。
-计算方法简单,主要运算是特征值分解,易于实现。

5.2PCA算法的缺点

-主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强.
-方差小的非主成分也可能含有对样本差异的重要信息,降维丢弃的数据可能对后续数据处理有影响。

5.3PCA的应用:

-降维: 通过去除冗余信息,减少数据的维度,提高计算效率和模型训练速度。
-特征提取: 选择主成分相当于选择了原始特征中最具代表性的信息,有助于提取关键特征。
-噪音过滤: PCA可以帮助去除数据中的噪音,提高模型的鲁棒性。

5.4PCA的局限性:

-线性假设: PCA基于线性变换,可能无法很好地处理非线性关系

-敏感性: 对异常值敏感,可能受到极端值的影响。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值