当前位置: 首页 > news >正文

【Python机器学习】3.7. 主成分分析(PCA)实战

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)

本文紧承 3.4. 主成分分析(PCA)理论, 没看过的建议先看。
在这里插入图片描述

3.7.1. 一些准备工作

接下来,请你确保你的Python环境中有pandasmatplotlibscikit-learnnumpy这几个包,如果没有,请在终端输入指令以下载和安装:

pip install pandas matplotlib scikit-learn numpy

Iris数据集在scikit-learn中内置有,不需要额外安装。

3.7.2. 读取数据集

Iris数据集内置在sklearn里了,我们可以通过sklearn来引入:

# 加载Iris数据集  
from sklearn import datasets  
iris = datasets.load_iris()  
X = iris.data  # 4维特征  
y = iris.target  # 目标分类

Iris数据集在 3.5. 决策树实战 中就讲过,这里我再简单介绍一下:

这个数据集总共会有三种共150条记录,每类各50个数据。每条各50个数据,每条记录都有4项特征:

  • 花萼长度(Sepal Length)
  • 花萼宽度(Sepal Width)
  • 花瓣长度(Petal Length)
  • 花瓣宽度(Petal Width)

我们会通过花萼和花瓣的这4个特征来对花进行分类:

  • iris-setosa(在数据集中的标签是0)
  • iris-versicolour(在数据集中的标签是1)
  • iris-virginica(在数据集中的标签是2)

以下是Iris数据集里的部分数据:

花萼长度花萼宽度花瓣长度花瓣宽度属种
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa
5.03.61.40.2setosa
5.43.91.70.4setosa
4.63.41.40.3setosa
5.03.41.50.2setosa

3.7.3. 数据标准化

我先把主成分分析的所有步骤都粘在这里:

  • 原始数据预处理:也就是标准化,因为不同维度的量纲不一定一样。我们先把数据进行一次变换,保证均值 μ = 0 \mu = 0 μ=0, 协方差 σ = 1 \sigma = 1 σ=1
  • 计算协方差矩阵特征向量、及数据在各特征向量投影后的方差
  • 根据方差决定哪些维度和哪些维度合并——方差小,相关性大,就能合并。最后降到 k k k
  • 选取 k k k维特征向量,计算数据在其形成空间的投影

首先就进行标准化,库提供了fit_transform函数来处理:

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

3.7.4. 数据降维

然后我们通过:

# 进行PCA降维到2维  
pca = PCA(n_components=2)  
X_pca = pca.fit_transform(X_scaled)
  • n_components的值可以控制降维后的维度数量
  • .fit_transform方法可以进行降维

3.7.5. 降维之后的数据可视化

使用matplotlib进行数据可视化:

# 可视化降维后的数据  
plt.figure(figsize=(8, 6))  
colors = ['red', 'green', 'blue']  
labels = iris.target_names  
for i in range(len(colors)):  
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=colors[i], label=labels[i], alpha=0.7, edgecolors='k')  
  
plt.xlabel('Principal Component 1')  
plt.ylabel('Principal Component 2')  
plt.title('PCA of Iris Dataset')  
plt.legend()  
plt.grid()  
plt.show()

图片输出:
请添加图片描述

从这幅图中可以看出,降维之后的数据不相关性还是很高的,不同标签的散点还是能够大概分开的。

3.7.6. 组合变量的查看

刚刚表格的两个轴就被替换为了两个组合变量,那我们如何确定是哪两个因子合成了一个轴呢?我们可以查看主成分载荷(Principal Component Loadings),即PCA的特征向量(Components)。这些载荷表示每个原始特征在主成分上的贡献。

sklearn中,可以使用pca.components_属性获取:

import pandas as pd

# 获取主成分载荷矩阵
loadings = pca.components_

# 创建一个DataFrame,查看每个原始特征在新主成分上的权重
feature_names = iris.feature_names
pc_loadings = pd.DataFrame(loadings, columns=feature_names, index=['PC1', 'PC2'])

print("Principal Component Loadings:")
print(pc_loadings)

输出:

Principal Component Loadings:     
     sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
PC1           0.521066         -0.269347           0.580413          0.564857
PC2           0.377418          0.923296           0.024492          0.066942
  • 每一行(PC1, PC2)对应一个主成分
  • 每一列(原始特征)表示该特征在主成分上的贡献系数
  • 数值的绝对值越大,表示该特征对该主成分的贡献越大
  • 正负号表示该特征在该主成分上的方向(正相关或负相关)

据此可以解读出:

  • 第一主成分 (PC1)主要由petal length (0.580) 和petal width (0.564) 决定,因为两者对于PC1的贡献最大
  • 第二主成分 (PC2)sepal width (0.923) 对 PC2 贡献最大,远高于其他特征。sepal length (0.377) 也有一定贡献,但远不及sepal width。

3.7.7. 降维损失分析

解释方差(Explained Variance)

PCA的每个主成分都保留了数据的一部分方差信息。可以查看解释方差比例(explained variance ratio) 来评估降维损失:

import numpy as np  
  
explained_variance_ratio = pca.explained_variance_ratio_  
print("Explained variance ratio:", explained_variance_ratio)  
print("Total variance retained:", np.sum(explained_variance_ratio))
  • explained_variance_ratio_表示每个主成分解释的方差比例
  • np.sum(explained_variance_ratio_)表示保留的总方差比例,越接近 1,说明损失越小

输出:

Explained variance ratio: [0.72962445 0.22850762]
Total variance retained: 0.9581320720000165

重构误差(Reconstruction Error)

PCA进行降维后,可以将数据从低维空间逆变换(inverse_transform) 回原始空间,然后计算均方误差(MSE) 以评估损失:

X_reconstructed = pca.inverse_transform(X_pca)  # 逆变换回原始空间
reconstruction_error = np.mean((X_scaled - X_reconstructed) ** 2)
print("Reconstruction Error (MSE):", reconstruction_error)
  • 误差越小,说明降维保留的信息越多

输出:

Reconstruction Error (MSE): 0.0418679279999836

相关文章:

  • HT9126DA芯片为生活增添光彩的LED灯IC
  • Qt程序增加Dump文件保存
  • Keras和 Estimator的创建历史是什么
  • 第五章 | Solidity 数据类型深度解析
  • Mysql的锁
  • lodash 学习笔记/使用心得
  • 2.企业级AD活动目录架构与设计原则实战指南
  • C# 调用 VITS,推理模型 将文字转wav音频net8.0 跨平台
  • Python FastApi(3):路径参数
  • 使用AI一步一步实现若依前端(16)
  • Elasticsearch 中的数据分片问题
  • Deepseek浪潮下,汽车芯片开启“大变局”,谁将领跑?
  • 进程地址空间(上)【Linux】
  • libc.so.6: version `GLIBC_2.29‘ not found, 如何解决这个错误
  • Python `is` 关键字深度解析
  • CCF-CSP认证 202209-2何以包邮?
  • 文件上传的小点总结
  • JVM如何处理Java中的精度转换: 从源码到字节码
  • 查看自己的公有ip
  • 深度解析 | Android 13 Launcher3分页指示器改造:横线变圆点实战指南
  • 巴基斯坦信德省首府卡拉奇发生爆炸
  • 叙利亚政权领导人首访西方国家,与法国总统讨论叙局势
  • 打造多元文旅消费场景,第四届长三角城市戏剧节启幕
  • 上海乐高乐园明天正式开售年卡,下月开启试运营
  • 上海黄浦区拟73.2654亿元协议出让余庆里7宗组合地块
  • 默茨在第二轮投票中当选德国总理