利用鸢尾花数据集介绍PCA算法

PCA:

主成分分析(PCA, Principal Component Analysis)是一种常用的数据降维技术,它可以将高维数据转换为较低维数据,同时尽可能保留数据的主要信息。PCA通过寻找数据的主要方向,即方差最大的方向,来完成降维。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

降维:

  • 降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定的信息损失范围内,可以为我们节省大量的时间和成本。降维也成为应用非常广泛的数据预处理方法。

  • 数据降维,直观地好处是维度降低了,便于计算和可视化,其更深层次的意义在于有效信息的提取综合及无用信息的摈弃。

擒贼先擒王: 

  1. PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法。它不仅仅是对高维数据进行降维,更重要的是经过降维去除了噪声,发现了数据中的模式。PCA把原先的n个特征用数目更少的m个特征取代,新特征是旧特征的线性组合,这些线性组合最大化样本方差,尽量使新的m个特征互不相关。

  2. PCA方法通过消除数据的相关性,找到一个空间,使得各个类别的数据在该空间上能够很好地分离。在下图中,有一些离散的二维分布点,其中棕色表示一类集合,黄色表示另一类集合,假设这两个类别可以用特征X和特征Y进行描述,由图可知,在X轴和Y轴上这两个类别的投影是重叠的,表明这些点的两个特征X和Y没有表现出突出的识别性。但是两个类的投影在Z轴上区分度较大,显示出很好的识别性。PCA就是这样的一个工具,它可以产生非常好的降维效果。

示例:

二维数据降到一维:

PCA算法在二维数据集上的可视化图示,展示了如何将数据从二维降维到一维。图中显示了原始数据点、主成分向量以及数据点投影到第一个主成分上的过程。 

使用numpy实现PCA:

import numpy as np# 定义PCA函数
def pca(X, num_components):# 1. 数据标准化(均值归一化)X_meaned = X - np.mean(X, axis=0)# 2. 计算协方差矩阵cov_matrix = np.cov(X_meaned, rowvar=False)# 3. 计算协方差矩阵的特征值和特征向量eigen_values, eigen_vectors = np.linalg.eigh(cov_matrix)# 4. 对特征值排序sorted_index = np.argsort(eigen_values)[::-1]sorted_eigenvalue = eigen_values[sorted_index]sorted_eigenvectors = eigen_vectors[:, sorted_index]# 5. 选择前num_components个特征向量(主成分)eigenvector_subset = sorted_eigenvectors[:, 0:num_components]# 6. 将数据投影到新空间X_reduced = np.dot(X_meaned, eigenvector_subset)return X_reduced, sorted_eigenvalue, sorted_eigenvectors# 示例数据
X = np.array([[2.5, 2.4],[0.5, 0.7],[2.2, 2.9],[1.9, 2.2],[3.1, 3.0],[2.3, 2.7],[2, 1.6],[1, 1.1],[1.5, 1.6],[1.1, 0.9]])# 执行PCA
X_reduced, eigen_values, eigen_vectors = pca(X, 1)print("降维后的数据:\n", X_reduced)
print("特征值:\n", eigen_values)
print("特征向量:\n", eigen_vectors)

运行结果分析:  

降维后的数据:[[ 0.82797019][-1.77758033][ 0.99219749][ 0.27421042][ 1.67580142][ 0.9129491 ][-0.09910944][-1.14457216][-0.43804614][-1.22382056]]特征值:[0.0490834  1.28402771]特征向量:[[-0.73517866 -0.6778734 ][-0.6778734   0.73517866]]

 解释

  1. 降维后的数据:原本二维数据集现在被降到了1维。每个样本在新的主成分方向上都有一个值,数据被映射到了这个新的空间。
  2. 特征值:两个特征值中,1.28402771对应的主成分解释了数据中的大部分方差(信息量)。特征值越大,表明该方向上的方差越大,信息量越多。
  3. 特征向量:每个特征向量表示PCA找到的主成分方向。第一个向量是方向,它解释了最多的方差。

 使用sklearn实现PCA:

from sklearn.decomposition import PCApca = PCA(n_components=1)
X_reduced_sklearn = pca.fit_transform(X)
print("降维后的数据:\n", X_reduced_sklearn)
print("解释方差比:\n", pca.explained_variance_ratio_)

运行结果分析: 

降维后的数据:[[-0.82797019][ 1.77758033][-0.99219749][-0.27421042][-1.67580142][-0.9129491 ][ 0.09910944][ 1.14457216][ 0.43804614][ 1.22382056]]
解释方差比:[0.96318131]

 

解释

  1. 降维后的数据sklearn的结果和numpy的实现相同。
  2. 解释方差比:第一个主成分解释了大约96.32%的数据方差。这意味着几乎所有的主要信息都保留在这个一维空间中。

 

三维数据降到二维:

使用numpy实现PCA:

import numpy as np# 定义PCA函数
def pca(X, num_components):# 1. 数据标准化(均值归一化)X_meaned = X - np.mean(X, axis=0)# 2. 计算协方差矩阵cov_matrix = np.cov(X_meaned, rowvar=False)# 3. 计算协方差矩阵的特征值和特征向量eigen_values, eigen_vectors = np.linalg.eigh(cov_matrix)# 4. 对特征值排序sorted_index = np.argsort(eigen_values)[::-1]sorted_eigenvalue = eigen_values[sorted_index]sorted_eigenvectors = eigen_vectors[:, sorted_index]# 5. 选择前num_components个特征向量(主成分)eigenvector_subset = sorted_eigenvectors[:, 0:num_components]# 6. 将数据投影到新空间X_reduced = np.dot(X_meaned, eigenvector_subset)return X_reduced, sorted_eigenvalue, sorted_eigenvectors# 示例数据
X_3D = np.array([[2.5, 2.4, 1.5],[0.5, 0.7, 0.9],[2.2, 2.9, 2.1],[1.9, 2.2, 1.8],[3.1, 3.0, 2.9],[2.3, 2.7, 1.9],[2.0, 1.6, 1.5],[1.0, 1.1, 0.6],[1.5, 1.6, 1.1],[1.1, 0.9, 0.7]])
X_reduced_3D, eigen_values_3D, eigen_vectors_3D = pca(X_3D, 2)
print("降维后的数据:\n", X_reduced_3D)
print("特征值:\n", eigen_values_3D)
print("特征向量:\n", eigen_vectors_3D)

 运行结果分析:

降维后的数据:[[-0.70889453 -0.46108745][ 1.83196957  0.42891188][-1.16005691  0.12212606][-0.38989499  0.15041607][-2.15763363  0.25019311][-0.98864791 -0.06737495][ 0.08538904 -0.06151523][ 1.4447941  -0.15563484][ 0.58162174 -0.10471513][ 1.46135351 -0.10131952]]
特征值:[1.7286401  0.06116445 0.04775101]
特征向量:[[-0.57953314 -0.5637771  -0.58846981][-0.63064625 -0.14710458  0.76200102][-0.51616533  0.81272112 -0.27029193]]

解释:

  • 降维后的数据:原本三维的数据集现在降到了二维,表示数据在新的两个主成分方向上的投影。
  • 特征值:第一个特征值1.7286401远大于另外两个,意味着第一个主成分解释了绝大部分的数据方差。第二个主成分解释了少量的方差,而第三个几乎没有方差,因此可以忽略。
  • 特征向量:这些向量表示主成分的方向,第一个向量是解释方差最多的方向

 使用sklearn实现PCA:

from sklearn.decomposition import PCApca_3D = PCA(n_components=2)
X_reduced_3D_sklearn = pca_3D.fit_transform(X_3D)
print("降维后的数据:\n", X_reduced_3D_sklearn)
print("解释方差比:\n", pca_3D.explained_variance_ratio_)

运行结果分析: 

降维后的数据:[[ 0.70889453  0.46108745][-1.83196957 -0.42891188][ 1.16005691 -0.12212606][ 0.38989499 -0.15041607][ 2.15763363 -0.25019311][ 0.98864791  0.06737495][-0.08538904  0.06151523][-1.4447941   0.15563484][-0.58162174  0.10471513][-1.46135351  0.10131952]]
解释方差比:[0.94072807 0.03328577]

 解释: 

  • 降维后的数据:与numpy的实现结果一致。
  • 解释方差比:两个主成分一共解释了约97.40%的方差,其中第一个主成分解释了绝大部分数据方差(约94.07%),第二个主成分解释了少量方差(约3.30%)。

鸢尾花数据集:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler# 1. 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names# 2. 标准化数据
X_standardized = StandardScaler().fit_transform(X)# 3. 执行PCA
pca = PCA(n_components=2)  # 选择前两个主成分
X_pca = pca.fit_transform(X_standardized)# 4. 绘制PCA散点图
plt.figure(figsize=(8, 6))
colors = ['navy', 'turquoise', 'darkorange']
lw = 2for color, i, target_name in zip(colors, [0, 1, 2], target_names):plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], color=color, alpha=.8, lw=lw,label=target_name)plt.title('PCA of IRIS Dataset')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.grid()
plt.show()# 5. 绘制投影图
plt.figure(figsize=(10, 6))
plt.scatter(X_standardized[:, 0], X_standardized[:, 1], alpha=0.5)
plt.quiver(0, 0, pca.components_[0, 0], pca.components_[0, 1], angles='xy', scale_units='xy', scale=1, color='r')
plt.quiver(0, 0, pca.components_[1, 0], pca.components_[1, 1], angles='xy', scale_units='xy', scale=1, color='g')
plt.xlim(-3, 3)
plt.ylim(-3, 3)
plt.title('PCA Projection of IRIS Dataset')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.grid()
plt.show()# 6. 解释方差图
plt.figure(figsize=(8, 4))
plt.bar(range(1, len(pca.explained_variance_ratio_) + 1), pca.explained_variance_ratio_, alpha=0.7)
plt.ylabel('Explained Variance Ratio')
plt.xlabel('Principal Components')
plt.title('Explained Variance by Principal Components')
plt.xticks(range(1, len(pca.explained_variance_ratio_) + 1))
plt.show()# 7. 降维效果图
plt.figure(figsize=(8, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], alpha=0.7, c=y, edgecolor='k', cmap=plt.cm.Paired)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA Result on IRIS Dataset')
plt.colorbar()
plt.grid()
plt.show()

PCA(主成分分析)图示通常包括以下几种代表性的图:

  1. 原始数据点与主成分向量:显示数据点和主成分方向的二维散点图。主成分向量通常以箭头表示,显示数据方差最大的方向。

  2. 数据投影到主成分上的图:显示原始数据点投影到主成分上后的图形,展示如何从高维数据降维到低维空间。

  3. 特征值与主成分的解释方差:条形图或饼图显示各主成分解释的方差比例,帮助理解每个主成分在数据中所占的比重。

  4. 降维后的数据分布:数据在降维后的低维空间中的分布图,通常用于可视化降维效果。

下面是这些图的描述:

  1. 原始数据点与主成分向量

    • 散点图显示原始数据点,主成分方向作为箭头,通常两个主成分向量互相垂直。
  2. 数据投影图

    • 显示数据点如何沿主成分方向投影到低维空间,突出显示主成分方向和投影后的数据点。
  3. 特征值图

    • 条形图或饼图展示每个主成分的解释方差比例,说明主成分对数据总方差的贡献。
  4. 降维后数据分布图

    • 降维后(例如从三维到二维)的数据点分布,通常用散点图展示,显示数据的结构和分布。

PCA散点图:

投影图: 

方差图: 

降维效果图: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小小GCD、LCM拿下拿下

目录 最大公约数(GCD) 最大公约数(GCD)求解: 一、辗转相除法 二、三目运算符 三、位运算 最大公约数(GCD)模板: 最大公约数(GCD)例题: 最…

stm32之硬件SPI读写W25Q64存储器应用案例

系列文章目录 1. stm32之SPI通信协议 2. stm32之软件SPI读写W25Q64存储器应用案例 3. stm32之SPI通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例代码分析3.1 基本思路3.2 相关库函数介绍3.3 MySPI模块3.3.1 模块初始化3.3.2 SPI基本时序单元模…

丰巢“闯关”港交所上市

社区中随处可见的智能快递柜,即将捧出一个IPO。 近日,丰巢控股有限公司(下称“丰巢控股”或“丰巢”)正式向港交所递交了招股书,华泰国际担任其独家保荐人。这将是继顺丰控股、顺丰房托、嘉里物流、顺丰同城之后&…

微服务CI/CD实践(六)Jenkins Docker 自动化构建部署Java微服务

微服务CI/CD实践系列: 微服务CI/CD实践(一)环境准备及虚拟机创建 微服务CI/CD实践(二)服务器先决准备 微服务CI/CD实践(三)gitlab部署及nexus3部署 微服务CI/CD实践(四&#xff09…

未来餐饮革命:加入我们的智能餐厅代理、自主开拓市场计划!

系统开发集成商:如果您正在开发智慧餐厅系统,忙于寻找各种消费终端接入、那么我们将可以为您提供整套智慧餐厅系统解决方案,从前厅消费到后厨的明厨亮灶的解决方案。 集团公司:想集团化控制子公司食堂运营,又想以最低…

【LeetCode每日一题】——LCR 168.丑数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 优先队列 二【题目难度】 中等 三【题目编号】 LCR 168.丑数 四【题目描述…

【大数据】Hadoop里的“MySQL”——Hive,干货满满

【大数据】Hadoop里的“MySQL”——Hive,干货满满 文章脉络 Hive架构 HQL 表类型 创建表语法 分区 数据导入导出 函数 内置函数 UDF Java Python 在阅读本文前,请确保已经对Hadoop的三大组件(HDFS、MapReduce、YARN)有…

分布式协调服务--ZooKeeper

文章目录 ZooKeeperzk的由来zk解决了什么问题 ZK工作原理ZK数据模型zk功能1.命名服务2.状态同步3.配置中心4.集群管理 zk部署单机启动zk验证zk zk集群集群角色选举过程1.节点角色状态2.选举ID3.具体过程4.心跳机制5.ZAB协议 ZooKeeper 选举示例1.第一轮投票:2.节点收…

Unity TextMeshPro 设置竖排

默认竖排是这样的 但是我们要的竖排效果并不是这样我们要是竖排连续的根据文本限制来进行换行 第一步我们先设置文本的旋转Z轴为90如下图 然后我们给文本加一个Tag <rotate270> 如下图 但是这个效果还是不是我们想要的效果我们可以使用TexeMeshPro提供的一个选项EnableR…

Python画笔案例-041 绘制正方形阶梯

1、绘制正方形阶梯 通过 python 的turtle 库绘制正方形阶梯&#xff0c;如下图&#xff1a; 2、实现代码 绘制正方形阶梯&#xff0c;以下为实现代码&#xff1a; """正方形阶梯.py """ import turtledef draw_square(length):for _ in range(6…

以太网--TCP/IP协议(一)

概述 以太网是局域网的一种&#xff0c;其他的比如还有令牌环、FDDI。和局域网对应的就是广域网&#xff0c;如Internet&#xff0c;城域网等。 从网络层次看&#xff0c;局域网协议主要偏重于低层&#xff08;业内一般把物理层、数据链路层归为低层&#xff09;。以太网协议…

Qt工程使用MQTT-C库与mqtt服务器数据通信

实现mqtt订阅与发布话题&#xff0c;与mqtt服务器进行数据通信 编译环境&#xff1a;Qt5.15.2 vs2019 需要mqttc库&#xff1a;mqttc.lib, mqttc.dll&#xff08;根据MQTT-C源码编译出来的库&#xff0c;参考cmake编译MQTT-C源码-CSDN博客&#xff09; 一、Qt pro文件编写 …

数据结构C //线性表ADT结构及相关函数

数据结构&#xff08;C语言版&#xff09;严蔚敏 吴伟民 线性表ADT结构及相关函数 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块&#xff08;头文件&#xff0c;函数文件&#xff0c;主文件&#xff09; list.h头文件 /****…

LeetCode 2181.合并零之间的节点

题目描述 给你一个链表的头节点 head &#xff0c;该链表包含由 0 分隔开的一连串整数。链表的 开端 和 末尾 的节点都满足 Node.val 0 。 对于每两个相邻的 0 &#xff0c;请你将它们之间的所有节点合并成一个节点&#xff0c;其值是所有已合并节点的值之和。然后将所有 0 …

浏览器百科:网页存储篇-如何在Chrome中打开IndexedDB窗格(十一)

1.引言 在现代Web开发中&#xff0c;网页存储技术扮演着至关重要的角色。IndexedDB作为一种低级API&#xff0c;允许客户端存储大量结构化数据&#xff0c;并提供高性能的搜索能力。在上一篇文章中&#xff0c;我们深入探讨了IndexedDB的基础知识及其应用场景。为了更有效地调…

安全产品概述

防火墙 防火墙的核心功能是过滤掉有害的流量&#xff0c;在专用网络和公共网络之间建立保护屏障。防火墙过滤通常基于一系列规则&#xff0c;如 IP 地址、域名、协议、端口号、关键字等&#xff0c;对入站和出站的流量进行过滤。这些规则也称为访问控制列表&#xff08;ACCESS…

网络编程day04(UDP、Linux IO 模型)

目录 【1】UDP 1》通信流程 2》函数接口 1> recvfrom 2> sendto 3》代码展示 1> 服务器代码 2> 客户端代码 【2】Linux IO 模型 场景假设一 1》阻塞式IO&#xff1a;最常见、效率低、不耗费CPU 2》 非阻塞 IO&#xff1a;轮询、耗费CPU&#xff0c;可以处…

Spring Boot属性注入的多种方式!

Spring Boot的一个问题&#xff0c;证明你是不是真正的 "会用" Spring boot ?Spring Boot的一个问题&#xff0c;直接暴露你是不是真正使用Spring Boothttps://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247484040&idx1&sn64ad15d95e44c874cc890973…

2024年CCPC网络赛A题题解 —— 军训Ⅰ(gym105336A)

个人认为很唐的一道题&#xff0c;考虑到不少人可能懒得写&#xff0c;我这里给大家发个代码叭&#xff0c;还有一点点题解&#xff08;因为真的不是很难&#xff09;。这是题面&#xff1a; 然后我来讲讲怎么做&#xff0c;不觉得会有多少人题目意思都理解不了叭&#xff1f;这…

码上进阶_刷题模块测试_用例设计

码上进阶_刷题模块测试_用例设计 系统概述&#xff1a; 码上进阶是为程序员专门打造的交流平台&#xff0c;采用主流的微服务框架和C端技术栈作为技术基础。在这个平台上&#xff0c;程序员 可以通过刷题、练习和模拟面试来提升自己的面试能力。 功能测试&#xff1a; 登录…