基于Python的人工智能应用案例系列(6):主成分分析

        在本篇文章中,我们将探讨主成分分析(Principal Component Analysis, PCA)。PCA是一种无监督学习算法,广泛应用于降维、数据可视化、噪声过滤、特征提取等多个领域。PCA的核心思想是通过减少数据的维度,保留数据中最具代表性的特征,从而简化复杂数据,并揭示其中的结构。

1. 主成分分析介绍

        PCA是一种快速灵活的降维方法,能够通过线性变换将高维数据投影到低维空间中,并且尽可能保留数据中的方差。PCA的目标是找到一组主轴(principal axes),这些主轴可以最大限度地解释数据中的方差。

        我们先从一个简单的二维数据集开始,以可视化PCA的工作原理。

import numpy as np
import matplotlib.pyplot as plt# 生成随机二维数据
rng = np.random.RandomState(1)
X = np.dot(rng.rand(2, 2), rng.randn(2, 200)).T
plt.scatter(X[:, 0], X[:, 1])
plt.axis('equal')
plt.show()

        通过观察数据的散点图,我们可以直观感受到数据中的主要趋势。接下来,我们使用Scikit-Learn中的PCA算法来计算这些数据的主成分。

from sklearn.decomposition import PCA# 使用PCA计算主成分
pca = PCA(n_components=2)
pca.fit(X)# 打印主成分和解释的方差
print("主成分:\n", pca.components_)
print("解释的方差:\n", pca.explained_variance_)

        这一步计算得出了数据的主成分(表示数据的主要方向)和解释的方差(表示这些方向上数据的分布)。接下来,我们将这些主成分绘制在数据上。

# 绘制主成分向量
def draw_vector(v0, v1, ax=None):ax = ax or plt.gca()arrowprops = dict(arrowstyle='->', linewidth=2, shrinkA=0, shrinkB=0)ax.annotate('', v1, v0, arrowprops=arrowprops)# 绘制数据和主成分
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
for length, vector in zip(pca.explained_variance_, pca.components_):v = vector * 3 * np.sqrt(length)draw_vector(pca.mean_, pca.mean_ + v)
plt.axis('equal')
plt.show()

        从图中可以看出,主成分轴显示了数据中的主要方向,较长的向量表示该方向上方差较大,意味着这个方向上的信息量更多。

2. PCA降维示例

        PCA的一个重要应用是降维。降维的目标是通过舍弃较小的主成分来减少数据的维度,同时尽可能保留数据中的信息。

        我们将使用PCA将数据从二维降到一维,并观察降维后的效果。

# 使用PCA将数据降到1维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)
print("原始数据形状:", X.shape)
print("降维后数据形状:", X_pca.shape)# 将降维后数据映射回二维空间并可视化
X_new = pca.inverse_transform(X_pca)
plt.scatter(X[:, 0], X[:, 1], alpha=0.2)
plt.scatter(X_new[:, 0], X_new[:, 1], alpha=0.8)
plt.axis('equal')
plt.show()

        通过这一步,我们可以看到降维后的数据投影回二维空间时,大部分信息仍然得到了保留。这表明,尽管我们舍弃了一个维度,数据的主要结构并没有被破坏。


3. PCA在高维数据中的应用:手写数字数据集

        在高维数据中,PCA的降维效果更加显著。为了演示PCA在高维数据中的应用,我们使用Scikit-Learn的手写数字数据集。该数据集包含1,797个样本,每个样本是一个8×8像素的手写数字图像。

from sklearn.datasets import load_digits# 加载手写数字数据集
digits = load_digits()
print(digits.data.shape)  # 输出 (1797, 64)

        为了简化数据的可视化,我们将64维的数据降到二维。

# 使用PCA将数据从64维降到2维
pca = PCA(n_components=2)
projected = pca.fit_transform(digits.data)
print("降维后数据形状:", projected.shape)# 可视化降维后的数据
plt.scatter(projected[:, 0], projected[:, 1], c=digits.target, edgecolor='none', alpha=0.5, cmap=plt.cm.get_cmap('Accent', 10))
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.colorbar()
plt.show()

        通过降维后的可视化,我们可以看到不同数字在二维空间中的分布。尽管数据的原始维度很高,PCA仍然能够通过两个主成分展示数据中的主要结构。

4. 如何选择主成分的数量

        在实践中,选择合适的主成分数量非常重要。我们可以通过累计解释方差来确定需要保留的主成分数量。累计解释方差表示所选择的主成分可以解释数据中总方差的比例。

# 计算累计解释方差
pca = PCA().fit(digits.data)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('主成分数量')
plt.ylabel('累计解释方差')
plt.show()

        从图中可以看到,前10个主成分可以解释数据中约75%的方差,而前50个主成分几乎可以解释全部方差。这表明,我们可以通过减少维度来显著减少数据的复杂性,同时保留大部分信息。

5. PCA用于噪声过滤

        PCA不仅可以用于降维,还可以用于噪声过滤。通过只保留主要的主成分,我们可以去除数据中的噪声。

# 在手写数字数据上添加噪声
np.random.seed(42)
noisy = np.random.normal(digits.data, 4)
plot_digits(noisy)# 使用PCA过滤噪声
pca = PCA(0.50).fit(noisy)  # 保留50%的方差
components = pca.transform(noisy)
filtered = pca.inverse_transform(components)
plot_digits(filtered)

        通过PCA降噪后,手写数字的图像变得更加清晰,噪声得到了显著过滤。

结语

        在本篇文章中,我们展示了主成分分析(PCA)在降维、数据可视化和噪声过滤中的应用。PCA是一种强大的工具,能够帮助我们简化高维数据,同时保留数据的主要结构。无论是在特征提取还是在数据预处理方面,PCA都提供了一个高效的解决方案。

        希望这篇文章能帮助您更好地理解PCA的工作原理和应用场景。敬请期待本系列的更多案例!        

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147725.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试(C卷D卷E卷)最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木,所以只能在…

电脑提示找不到msvcp110.dll怎么办?全方面详细解答

msvcp110.dll 是 Microsoft Visual C 2012 Redistributable Package 中的一个动态链接库文件。它是运行使用 Visual C 2012 开发的应用程序所必需的,包含了许多 C 标准库函数的实现。这些函数主要用于支持字符串处理、内存管理、输入输出流、异常处理等功能。 1.ms…

Clion使用vcpkg管理C/C++包

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Clion安装vcpkg二、使用步骤1.切换到清单模式2.开始安装包 三、测试代码总结 前言 Linux上的库基本都可以通过apt或yum等包管理工具来在线安装包&#xff…

C语言深入理解指针(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…

NLP 文本分类核心问题

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据,核心解决方案: 自己构造训练样本 数据增强,如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

MELON的难题- 华为OD统一考试(E卷)

2024华为OD机试(C卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 MELON 有一堆精美的雨花石(数量为 n,重量各异),准备送给 S和 W,MELON 希望送给俩人的雨花石重量是一致的。请你设计一…

爬虫 ----hook

目录 定义: 了解什么是hook? 举例 hook XHR请求 XMLHttpRequest 案例地址: Interceptors-拦截器 HOOK cookie操作 cookie 示范 常见的hook代码总结 1.Hook Cookie 2.Hook Header 3.Hook URL 4.Hook JSON.stringify 5.Hook JSON.parse 6.Ho…

Mac使用gradle编译springboot-2.7.x源码

1 开发环境: JDK8 ideaIU-2024.2.2 gradle-7.6.3 代理网络 2 下载springboot源码 代码仓库网址 git clone -b 2.7.x https://github.com/spring-projects/spring-boot.git3 安装gradle gradle下载网址 https://services.gradle.org/distributions/ 安装此文件指…

C语言 | Leetcode C语言题解之第415题字符串相加

题目: 题解: char* addStrings(char* num1, char* num2) {int i strlen(num1) - 1, j strlen(num2) - 1, add 0;char* ans (char*)malloc(sizeof(char) * (fmax(i, j) 3));int len 0;while (i > 0 || j > 0 || add ! 0) {int x i > 0 ?…

lsof可以查看当前系统中正在被使用的文件,包括动态库

lsof的英文是 list open files lsof直接回车,会显示很多,可以配合more命令查看 lsof | more -10 sudo lsof | more -20 lsof查看正在使用某个动态库的进程 lsof /lib/x86_64-linux-gnu/libc.so.6 lsof /usr/lib/x86_64-linux-gnu/libc.so.6 l…

如何优化苹果CMS 泛目录的缓存管理?

在使用苹果CMS进行内容管理时,缓存管理是提升网站性能的重要环节。随着技术的不断发展,泛目录插件的缓存机制也逐渐变得不再必要。(maccmscn)本文将探讨如何在不使用缓存的情况下,优化苹果CMS泛目录的性能,…

(学习记录)使用 STM32CubeMX——配置时钟(入门)

使用STM32CubeMX配置STM32F103C8T6时钟部分 选择芯片 ①:选择MCU型号 ①:这里使用英文输入法,输入你想要的芯片型号,我这里采用STM32F103C8T6 ②:这里能看到搜索后出来的芯片具体型号,选择匹配度最高的一个…

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同 前言 假设有如下表结构与数据,class_id表示班级,需求:现在要按照班级分组,每个班级的学生进行年龄从小到大排序 一、ROW_NUMBER()函数 ROW_NUM…

Linux中的调度算法

nice值的范围有限,即为[-20, 19],也就是40个数字,优先级为[60, 99]即一共40个优先级 目前谈论的Linux操作系统叫做分时操作系统,调度的时候主要强调公平,还有一种是实时操作系统,比如智能汽车里面必须装有这…

【面经】查找中常见的树数据结构

查找中常见的树数据结构 一、二叉排序(搜索、查找)树(BST,Binary Search Tree)(1)二叉排序树的查找、插入和删除过程(2)叉树排序树的缺陷(3)二叉排…

Spark原理及调优

spark官档 hints:https://spark.apache.org/docs/3.0.0/sql-ref-syntax-qry-select-hints.html调优参数:https://spark.apache.org/docs/latest/sql-performance-tuning.html#join-strategy-hints-for-sql-queries作者几乎把所有的RDD API查了个遍&…

【服务器入门】Linux系统基础知识

【服务器入门】Linux系统基础知识 远程登录与文件传输基础命令与文本编辑vi/vim使用shell脚本基本命令1、目录操作2、文件创建与删改3、文件连接与查看 参考 目前超算使用的系统以Linux系统为主,肯定需要了解一些相关知识。本博客就以本人运行WRF模型所需&#xff0…

7-50 畅通工程之局部最小花费问题 (kruskal)

输入样例: 4 1 2 1 1 1 3 4 0 1 4 1 1 2 3 3 0 2 4 2 1 3 4 5 0输出样例: 3 代码&#xff1a; #include<iostream> #include<queue> using namespace std; const int N110; struct node{int x,y,w;bool operator <(const node &n1)const{if(wn1.w) retur…

提升编程效率的秘诀:多数人竟然忽略了它!

在编程学习的过程中&#xff0c;许多人会专注于算法、数据结构、编程语言的学习&#xff0c;而往往忽略了一个至关重要的基础技能——键盘盲打。虽然看似与编程能力无关&#xff0c;但盲打不仅可以显著提高编程效率&#xff0c;还能帮助编程者更好地集中注意力。本文将深入探讨…

数字图像面积计算一般方法及MATLAB实现

一、引言 在数字图像处理中&#xff0c;经常需要获取感兴趣区域的面积属性&#xff0c;下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…