[ML]机器学习_PCA主成分分析

主成分分析详解一

主成分分析详解二

主成分分析详解三

目录

一、降低特征数量

二、主成分分析算法(PCA)

1、概念

2、举例说明

三、代码实现


一、降低特征数量

        主成分分析(PCA)是一种算法,可以获取大量特征的数据,并将特征数量减少到两三个特征(即二维或三维),以便对特征进行可视化绘图。

举例描述PCA算法:

        如果有关于轿车集合的数据,轿车有许多的特征,如汽车长度,宽度,高度等。借助PCA减少特征数量以便将其特征可视化。

        1、假设特征x_{1}是汽车的长度,x_{2}是汽车的宽度,由于事实情况限制,汽车的宽度往往变化不会太大,如果有一个汽车集合中是汽车长度和宽度的数据集,则数据特征分布会如下图所示。

        其中特征车长x_{1}变化很大,而特征车宽x_{2}则变化相对较小。如果需要减少特征,则可以做的是取特征车长x_{1},因为特征车宽x_{2}在车和车之间变化较小。

        2、假设特征x_{1}是汽车长度,x_{2}是轮毂直径,事实情况是车辆间轮毂直径差异也很小。

        同样的,将此数据集简化为一个特征,那么可以取特征x_{1}车长。

        在以上两个例子中,两个特征中似乎只有一个特征具有明显变化差异的意义,假设一个更复杂的例子。

        3、假设特征x_{1}为汽车长度,特征x_{2}为汽车高度,事实情况下,汽车之间的长度和高度差异都较为明显,依据这个数据集绘制出两个特征的数据分布,得到如下图所示。

        如果想减少特征,两者相较起来都难以取舍。在图中, x_{1}x_{2}都为两个数轴,如果有第三个数轴z,该数轴并不是第三维的数轴,与 x_{1}x_{2}数轴在同一平面内,z轴对应了汽车的大小。

        给定了一辆汽车,x_{1}轴上的值表示汽车的长度,类似地,x_{2}轴上的坐标表示汽车的高度,使用轴作为一个特征来捕捉车辆的信息,z轴上的数据大致表示汽车的侧面面积,则PCA的思想是找到一个或多个新轴,例如z轴,这样在新轴上测量数据时能够协同一定维度的特征数据。现在并不需要两个特征x_{1}汽车长度和x_{2}汽车高度来描述,在本例中只需要使用新特征z来大致描述汽车的大小。就好像手机屏幕尺寸可以用长宽表示,也可以用对角线尺寸表示。

        在实践中,PCA通常用于减少非常大量的特征,例如10、20、50,甚至数千个特征,将其减少到可能只有两三个特征,以便可以在二维或者三维视图中可视化数据。 

二、主成分分析算法(PCA)

1、概念

        主成分分析(PCA)是一种常见的统计分析方法,用于将高维数据降维至低维空间,使得降维后的数据能够尽可能多地保留原始数据中的信息。主成分分析算法可以用于数据可视化、特征提取、数据压缩和噪声过滤等领域。

        定义:主成分分析是一种数据降维技术,它通过线性变换将高维数据转换为低维数据,使得降维后的数据保留了尽可能多的原始数据的信息。

        原理:主成分分析的核心思想是寻找一个新的坐标系,使得在这个新的坐标系下,数据的方差最大化。具体来说,主成分分析将原始数据投影到各个主成分上,每个主成分都是原始数据的一个线性组合。第一个主成分方差最大,第二个主成分方差次之,依此类推。主成分之间彼此正交,即互不相关。

过程:

  1. 标准化数据:将每个特征的数据都减去均值,再除以标准差,使得所有特征的均值为0,标准差为1。这一步是为了确保每个特征对主成分的贡献度相等。

  2. 计算协方差矩阵:将标准化后的数据计算协方差矩阵,协方差矩阵的对角线上的元素表示每个特征的方差,非对角线上的元素表示每对特征之间的协方差。

  3. 计算特征值和特征向量:对协方差矩阵进行特征值分解,得到特征值和特征向量。特征值表示每个特征向量的重要程度,特征向量表示主成分方向。

  4. 选择主成分:按照特征值的大小,选择前k个主成分。这些主成分的特征值相加得到总方差的k%以上,表示这些主成分可以保留原始数据的大部分信息。

  5. 得到新的数据集:将原始数据集投影到前k个主成分上,得到新的数据集,完成降维。

  6. 重构数据:将新的数据集从主成分上投影回原始特征空间,得到重构后的数据。

        总之,主成分分析是一种常用的数据降维算法,它通过线性变换将高维数据映射到低维空间,并保留尽可能多的数据信息。主成分分析的核心在于选择主成分,即确定哪些方向上的信息对于保留数据最为重要。

2、举例说明

        有一个包含五个训练示例的数据集:

        PCA是一个无监督学习,所以只有x_{1}x_{2},没有标签y。关于预处理,在应用PCA之前,应该首先将特征归一化为零均值,如果特征x_{1}x_{2}具有非常不同的尺度,如数值为成百上千和个位数,那首先进行特征缩放,再应用PCA(将每个特征的数据都减去均值,再除以标准差,使得所有特征的均值为0,标准差为1。这一步是为了确保每个特征对主成分的贡献度相等)

        删除x_{1}x_{2}轴,图中黑点代表原点,选择一个轴来重新捕获这五个示例的重要内容。

         选择上图中的z轴,对于这个示例,只捕获z轴上的坐标,另一种说法是将采用这些示例投影到z轴上的一个点。选择这个方向作为z轴是个不错的选择,仍然可以捕获相当多的数据分布信息,但是还有一些更好的选择。

        选择另一种方向的z轴,这实际上不是一个很好的选择,采用相同的五个示例并将其投影到z轴,获取点位。

        与之前的选择相比,五个示例的投影值都挤在一起,彼此之间的差异要小很多,这意味着选择这个方向的z轴时,在原始数据集中捕获的信息要少很多。

        再次选择一种方向的z轴,这实际上是比之前两个例子都要好的选择。

        如果将数据投影在z轴上,示例的点相距距离较远,捕捉到原始数据集中大量的变化信息,在PCA算法中,这个z轴称为主成分。在z轴上,将数据投影到上面时,会得到最大方差,这是PCA特征降维到一维所要做的。

        机器学习库scikit-learn,可以自动找到主成分,深入了解一下工作流程。

        有一个训练示例在x_{1}轴上坐标为2,在x_{2}轴上坐标为3,假设PCA已经找到z轴的方向,紫色小箭头是一个长度为1的向量,指向PCA选择的z轴方向。这个单位向量在x_{1}轴和 x_{2}轴上为向量\begin{bmatrix} 0.71\\0.71 \end{bmatrix},鉴于此示例在x_{1}轴和 x_{2}轴上坐标为(2,3),将此示例投影到z轴上的方法是,在示例向量与z轴单位向量之间进行点积

\begin{bmatrix} 2\\3 \end{bmatrix}\cdot \begin{bmatrix} 0.71\\0.71 \end{bmatrix}=2\times 0.71+3\times 0.71=3.55

        这意味着示例点到原点的距离是3.55,也就是要尝试用z轴一个特征来捕获这个示例,那么这个数值就是3.55。

        更多主成分例子

         找到第一个轴z_{1}时,此时要选择第二个轴,则第二个轴z_{2}始终与第一个轴成90°,如果要选择第三个轴,那么第三个轴将与第一和第二个轴成90°。如果有50个特征并且想找到三个主成分,那么第一第二第三个轴都相互垂直。

        需要注意的是,PCA与线性回归并不相同。

        使用线性回归(一种监督学习算法),数据集中包含特征x和标签y,使用线性回归拟合一条曲线,以便预测值尽可能接近真实标签y,即尝试最小化垂直x轴方向的线段长度。

        相反的在PCA中没有真实标签y,只有未标记的数据 x_{1}和 x_{2},此外更不是去尝试拟合一条线来使用x_{1}预测x_{2}。相反,平均值平等对待 x_{1}和 x_{2},试图找到z轴,使得数据投影到z轴时,最终将垂直于z轴的线段变小了。

        在线性回归中,数字y被给予了特殊的处理,试图测量拟合线与y之间的距离,也就是为什么这些距离仅在y轴方向上(垂直于x轴)测量的原因。

        在PCA中,可以有许多特征, x_{1}和 x_{2},甚至于x_{50},找到一个z轴,这样当将数据投影到z轴上边时,能尽可能地保留原始数据的方差。

三、代码实现

        代码如下所示:

# 导入所需的库
import numpy as np  # 导入 NumPy 库用于数值计算
import pandas as pd  # 导入 Pandas 库用于数据处理
import matplotlib.pyplot as plt  # 导入 Matplotlib 库用于可视化
from mpl_toolkits.mplot3d import Axes3D  # 导入 3D 可视化库
from sklearn.preprocessing import StandardScaler  # 从 scikit-learn 库中导入数据标准化工具
from sklearn.decomposition import PCA  # 从 scikit-learn 库中导入主成分分析工具

# 生成示例数据(也可以使用真实数据集)
np.random.seed(0)  # 设置随机数种子,确保每次运行得到相同的随机数
data = np.random.rand(100, 4)  # 生成100个样本,每个样本有4个特征,存储在一个 100x4 的 NumPy 数组中

# 创建 DataFrame 对象
df = pd.DataFrame(data, columns=['Feature1', 'Feature2', 'Feature3', 'Feature4'])  
# 将示例数据转换为 DataFrame 对象,其中包括列名为 'Feature1', 'Feature2', 'Feature3', 'Feature4' 的数据表格

# 可视化数据分布(主成分分析之前)
fig = plt.figure(figsize=(12, 8))  # 创建一个指定大小的图形窗口
ax = fig.add_subplot(111, projection='3d')  # 添加三维坐标轴
ax.scatter(df['Feature1'], df['Feature2'], df['Feature3'], label='Data Points')  
# 绘制原始数据分布的三维散点图,分别以Feature1,Feature2和Feature3作为三个坐标轴
ax.set_xlabel('Feature 1')  # 设置 x 轴标签
ax.set_ylabel('Feature 2')  # 设置 y 轴标签
ax.set_zlabel('Feature 3')  # 设置 z 轴标签
ax.set_title('Original Data Distribution')  # 设置图形标题
plt.legend()  # 显示图例
plt.show()  # 显示可视化结果

# 数据标准化
scaler = StandardScaler()  # 初始化 StandardScaler 对象
scaled_data = scaler.fit_transform(df)  # 使用 fit_transform 方法对数据进行标准化处理

# 使用 PCA 进行主成分分析
pca = PCA(n_components=2)  # 初始化 PCA 对象并选择要保留的主成分数量为2
principal_components = pca.fit_transform(scaled_data)  # 使用 fit_transform 方法将数据投影到主成分空间

# 创建新的 DataFrame 存储主成分
principal_df = pd.DataFrame(data=principal_components, columns=['Principal Component 1', 'Principal Component 2'])  
# 创建一个新的 DataFrame 对象存储主成分的值

# 打印主成分的方差解释比例
print(pca.explained_variance_ratio_)  # 打印每个主成分所解释的方差比例

# 可视化主成分
plt.figure(figsize=(8, 6))  # 创建一个指定大小的图形窗口
plt.scatter(principal_df['Principal Component 1'], principal_df['Principal Component 2'], label='Data Points')  
# 绘制主成分的散点图,横坐标为主成分1,纵坐标为主成分2
plt.xlabel('Principal Component 1')  # 设置 x 轴标签
plt.ylabel('Principal Component 2')  # 设置 y 轴标签
plt.title('PCA of Sample Data')  # 设置图形标题
plt.legend()  # 显示图例
plt.show()  # 显示可视化结果

运行结果:

        随机生成的四个特征,将其中前三个特征制成三维图显示出来:

        进行主成分分析过后,生成两个主成分:

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IAz-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值