机器学习系列(8)| 主成分分析

职场   2024-09-04 15:47   四川  
主成分分析(Principal Component Analysis,PCA)是一种统计方法,它的应用非常广泛,包括但不限于:降维、特征提取、噪声过滤等。它的数学原理是基于线性代数,尤其是特征值分解,通过线性变换将多维数据集转换为一组线性不相关的变量,这些变量就称之为主成分。PCA的目的是在尽可能保留原始数据集变异性的前提下,降低数据的维度,使其转换为少数几个主成分,这些主成分能够解释原始数据中的大部分变异性。
数据转换过程可以理解为:将原始数据集投影到选定的主成分上,从而得到降维后的数据。这个过程可以表示为: Y=XW 。其中,X 是原始数据矩阵,W 是由选定的主成分构成的矩阵,Y 是降维后的数据矩阵。数学原理这里就不多讲了,怎么计算数据的协方差矩阵?我们可以不关心,直接调用现成的函数即可。下面我们通过一个例子来学习如何进行主成分分析:

digits dataset 是一个包含手写数字图像的数据集,是机器学习入门常用的数据集之一。这个数据集由1797个8x8像素的手写数字图像组成,每个图像可以看作是一个8x8的矩阵。每个图像都是灰度的,矩阵的每个元素代表一个像素的灰度值。这些图像代表了0到9的数字,每个数字大约有200个样本。前200个数字长这样子:

这个数据集的特点是:

1.小规模:数据集的规模相对较小,非常适合用于算法测试。

2.多类分类:包含10个类别(0-9的数字)。

3.高维特征:每个图像可以看作是64维的特征向量(8x8像素,如下图所示)。

4.标准化:图像已经被标准化处理,即每个像素的灰度值都介于0(黑色)到16(白色)之间
手写数字1的图像
数据集的结构如下:

1. images:一个形状为 (1797, 8, 8) 的数组,存储了每个图像的8x8像素矩阵。

2. data:一个形状为 (1797, 64) 的数组,是将每个8x8的图像矩阵展平成一个64维的特征向量。所有像素值都被转换成了一个长向量,这样这些向量就可以直接用于机器学习模型的输入。这种展平操作也是图像处理中常见的数据预处理步骤。

3. target:一个形状为 (1797,) 的数组,存储了每个图像所代表的数字类别,即0到9之间的整数。

4. target_names:一个列表,包含了目标类别的名称,即从0到9的数字。


下面这一段代码演示了主成分分析(PCA)如何将高维手写数据集降维到二维,并进行可视化:

import numpy as np

import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 加载数据集
digits = load_digits()
X = digits.data # 数据集中的特征(64维向量)
y = digits.target # y变量存储了每个样本对应的标签(0-9的数字)

# 标准化数据
scaler = StandardScaler()
X_standardized = scaler.fit_transform(X)

# 执行 PCA,降维到2
pca = PCA(n_components=2) # 我们将数据降到2
X_pca = pca.fit_transform(X_standardized)

# 输出主成分解释的方差比例
print("主成分解释的方差比例:", pca.explained_variance_ratio_)
print("前两个主成分的累积解释方差:", np.sum(pca.explained_variance_ratio_))

# # 绘制累积方差图表(如果要展示所有主成分的累积方差比率,前面的语句应改为:pca=PCA()不指定降维的维度)

# plt.figure(figsize=(8, 4))
# plt.plot(np.arange(1, len(pca.explained_variance_ratio_) + 1), np.cumsum(pca.explained_variance_ratio_), marker='o')
# plt.xlabel('主成分数量')
# plt.ylabel('累积解释方差比率')
# plt.title('PCA 累积解释方差比率')
# plt.grid(True)

# plt.show()


# 可视化降维后的数据
plt.figure(figsize=(8, 6))
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolor='k', s=40)
plt.xlabel('主成分 1')
plt.ylabel('主成分 2')
plt.colorbar(scatter, label='数字标签')
plt.title('数字数据集PCA(二维投影)')
plt.grid(True)

plt.show()


加载数据集后,我首先使用 StandardScaler 对数据进行标准化处理。其实数据集的图像已经经过标准化处理,这一步可以省略。为了让大家回顾上上篇讲的归一化处理,我又重复了一遍。
然后创建PCA对象,设置 n_components=2 来指定我们想要降维到2维空间。再使用 fit_transform 方法对标准化后的数据进行PCA转换,得到降维后的数据 X_pca。同时,打印出主成分解释的方差比例来表示每个主成分在数据集中的重要性。

主成分解释的方差比例是指该主成分在捕捉数据集总方差中所占的比例,比例越高说明它在描述数据集的变异性方面更为重要。在这个例子中,第一个主成分只解释了数据集12%的方差,两个主成分累积解释方差也才21.6%。通常这种情况,我们会绘制一个累积解释方差的图表,直观地看到随着主成分数量的增加,解释的方差是如何累积的,从而帮助我们决定在降维时应该保留多少个主成分。

从上图我们可以直观地看出,需要选择20个主成分才能捕捉到数据中80%的变异性。
上述代码运行后,我们还可以看到一个降维到二维的散点图,两个主成分分别作为x轴和y轴。每个点代表一个手写数字图像在二维PCA空间中的投影,它的颜色对应不同的数字标签,这样我们可以直观地看到不同类别的数字分布情况。

降维后得到的主成分通常不对应于原始数据集中的任何具体特征,而是捕捉数据中的主要变化趋势。换句话说,主成分是数据驱动的,它们并不直接对应于任何具体的、可解释的物理或语义属性。
是不是有点不太好理解?你就把主成分视为原始特征在原始高维空间中的复杂加权线性组合(权重由PCA算法确定)就行了。它提供了一种压缩数据和提取数据主要变化趋势的方法。通过这些主成分,我们可以在降低数据复杂性的同时保留最重要的信息。

对于上面的手写数据集,第一主成分通常是解释数据中方差最大的方向,即在这个方向上,数据的“扩散”或“扩展”最大;而第二主成分是在正交于第一主成分的条件下(即互相独立,相关系数为零),解释方差第二多的方向。

举个简单的例子就好理解了,假设你有一堆被扔在地板上的橡皮球,这些球代表了你的数据点。现在,你想找到一种方式来描述这些球散布在地板上的方式。你注意到,大多数球都集中在一个区域,但有些球滚得比较远。如果想知道这些球主要沿着哪个方向分布,通常需要以下5个步骤:

1、首先找到球的“中心点”:也就是它们平均位置的地方,这就像是数据的“平均值”。

2、观察球的分散情况:观察球在地板上沿着不同方向的分散情况,你会发现球沿着某些方向比沿着其他方向分散得更广。

3、找到分散最广的方向:假如沿着某个特定的方向(比如从左到右)测量,球的距离差异最大,也就是说,沿着这个方向,球的位置差异最大。这个方向就是方差最大的方向。

4、计算主成分:在PCA中,我们寻找的就是这样的方向,但不是在二维的地板上,而是在数据可能存在的多维空间中。PCA会计算出那个方向(主成分),它能够最好地代表数据点之间的差异。

5、降维:一旦找到了方差最大的方向,PCA还会寻找第二个方向,它与第一个方向正交(即两者之间形成90度角),并且能够捕捉到剩余的最大方差。这个过程可以继续,直到所有的主成分都被找到。

在PCA中,第一个主成分(PC1)就是那个捕捉数据中方差最大的方向,第二个主成分(PC2)是与第一个正交且捕捉次大方差的方向,以此类推。通过这种方式,PCA能够将数据降维到最重要的几个方向上,同时尽可能保留原始数据的信息。



综上,主成分分析是一种常用的数据预处理和特征降维技术。通过降维、压缩数据的方式提高机器学习模型的性能,从而减少过拟合风险。当然,它也有一些局限性,只适用于线性关系的数据,对于非线性关系的数据,PCA可能不是最佳选择。此外,由于它是通过降维来简化数据,PCA过程可能会损失一些重要信息。


感谢大家对机务论坛的支持,关注机务论坛,倾听机务心声!航企优秀的方面必定宣传,不足的地方也必须指出,让领导们重视问题,解决问题,营造更好的机务维修环境。

征稿:
所见所闻,个人感悟,个人成长历程及感人故事。
特别征稿:我师傅的故事!
同时,征集劳动仲裁案例,分享案例,让更多的小伙伴能了解劳动纠纷的解决方式,通过劳动仲裁维护自己的合法权益。



评论区留言,同意的点赞
扫码添加小编微信
匿名爆料


民航机务论坛微信公众平台
改名为:机务论坛
发布最新行业动向 深入解读政策法规
开辟维修工程专栏 交流飞机排故经验
分享前沿技术应用 预测职业发展前景
行业大咖讲经布道 业界专家授业解惑
致力打造一流的民航机务朋友圈----机务论坛
关注机务论坛,倾听机务心声!
投稿邮箱:duanwei0615@163.com





机务论坛
民航机务论坛改名为:机务论坛 发布最新行业动向 深入解读政策法规 开辟维修工程专栏 交流飞机排故经验 分享前沿技术应用 预测职业发展前景 行业大咖讲经布道 业界专家授业解惑 致力打造一流的民航机务朋友圈----机务论坛
 最新文章