机器学习作业7——PCA

目录

一、原理

1.数据中心化

2.白数据与目标

3.协方差与协方差矩阵

4.特征值与特征向量

5.最终结果构造

二、代码

代码解释:

三、结果

结果解释:

pca优缺点分析:

参考视频:


一、原理

目的:

pca是为了将原始的数据集的特征维度减少。

如上图,横纵坐标代表两个特征,可以看到这两个特征正相关程度很大,都快可以用一条直线连起来了。

假如能把它变成像下图这样的,能很大程度的保留样本点的信息,又能够减少特征维度,那就实现了pca的降维(将两个特征用一个主成分表示)。

一些概念:

1.数据中心化

假设原来的数据是二维的,并且将样本点放在坐标系中是这样

中心化后,结果如下图。

实现:

对每个特征,先求出他的均值:

\bar{x} = \frac{1}{N} \sum_{i=1}^N x_i

再将每个样本的该特征,都减去这个均值

\tilde{x}_i = x_i - \bar{x}

对每个特征都执行了这样的操作就结束了。

2.白数据与目标

先假设假设数据中心化后如左图,为了引出目标,假设右图就是他的白数据。

变成

设白数据样本集为

样本的特征x和特征y是独立的,并且服从标准正态分布。

其中D是样本集,列数是样本数量,行数为特征数量。

拉伸:

现将一个矩阵乘上数据集,得到:

结果如下图

就可以实现将这个样本集在X轴上“拉长”

旋转:

假设SD左乘一个矩阵,就变为下图:

现在我们手上的数据便是这个“RSD”,其中这个R是最重要的,PCA需要求出这个矩阵R,也就是旋转坐标轴的角度。

一些补充:

3.协方差与协方差矩阵

协方差定义:

\text{Cov}(X, Y) = \frac{1}{n-1} \sum_{i=1}^{n} (X_i - \bar{X})(Y_i - \bar{Y})

其中:n 是样本数量,Xi 和 Yi 分别表示第 i 个样本的 X 和 Y 值,\bar{X},\bar{Y}分别是 X 和 Y 的均值。

在PCA中,X和Y即为特征。

协方差的意义是:表示X与Y的相关程度,若正相关,协方差大于0,负相关则小于0,若几乎为0,则不相关。

显然的,当Y=X时,协方差分子即为方差。

由于已经去中心化了,所以均值都为0。

协方差矩阵:

将协方差带入:

其中D是上面的白数据。

将D替换为RSD,则已经中心化后的数据的协方差矩阵为:

第4行中,因为,其中白数据的X与Y是不相关的,所以协方差为0,而对角线上为方差,并且X与Y是标准正态分布,所以为1。

第5行中,RT = R-1在上面有补充,第6行中,L定义为S*ST。

算完这个玩意之后,自然有用处,和接下来的式子形式上相同。

4.特征值与特征向量

假如以下式子成立

\mathbf{A} \mathbf{v} = \lambda \mathbf{v},其中A为矩阵,v为列数为1,行数与A相等的矩阵,\lambda为标量。

那么v就为矩阵A的特征向量,\lambda就为特征值。

现在先给出以下两个式子(因为现在假设原数据集特征维度为2)

由线性代数基础知识,可由上两式得到:

可以看作:

两边同右乘R-1,又因为R-1=RT,所以得到:

便可以将R中第一列看作特征向量1,第二列看作特征向量2。

这样,求解这个R,就是求出了特征向量了。

而L则是特征值。

5.最终结果构造

求出了这个R后,根据特征值大小对特征向量进行排序,选择前几个特征向量对应的主成分,这些主成分能够解释数据中最多的方差。

然后构造特征向量矩阵:将选择的主要特征向量排列成一个矩阵。假设选择了 k 个主成分,那么这个矩阵的大小将是 d*k,d是原始数据的维度

将中心化后的数据矩阵 X 乘以特征向量矩阵 W,得到的数据矩阵 Z = XW 的大小为 n * k,即为最终结果。

二、代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaleriris = datasets.load_iris()
X = iris.data
y = iris.targetscaler = StandardScaler()
X_scaled = scaler.fit_transform(X)pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)#创建一个图形并设置子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))#降维前的数据前两个特征
ax1.set_title("origin")
for i, target_name in zip([0, 1, 2], iris.target_names):ax1.scatter(X[y == i, 0], X[y == i, 1], label=target_name)
ax1.set_xlabel('X1')
ax1.set_ylabel('X2')
ax1.legend()#降维后的数据
ax2.set_title("after")
for i, target_name in zip([0, 1, 2], iris.target_names):ax2.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
ax2.set_xlabel('X1')
ax2.set_ylabel('X2')
ax2.legend()plt.show()

代码解释:

由于这次老师说可以用库函数,所以比较简单。

pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

这里是主要部分,第一行就是创建个pca对象,指定主成分数量为2(也就是接下来往这个对象中传入数据,返回出来的是二维特征的数据),然后第二行就是将数据集扔进去,也就是X_scaled,

返回的X_pca即是处理完的数据集。

三、结果

结果解释:

使用鸢尾花数据集来作为本次实验的数据集。

左图是原数据使用前两个特征展现出的图,右图是pca的结果。

可以看到左图的黄绿点比较混杂,而右图的黄绿点左右分的比较开,两张图的蓝点都比黄绿点分的开。而把黄绿点分的比左图开的右图,就是pca的功劳与结果。

pca优缺点分析:

优点:

  1. 降低数据维度:PCA通过投影数据到较低维度的主成分空间,实现了数据的降维。这有助于减少数据存储和计算成本,并简化后续分析过程。

  2. 消除特征间相关性:PCA通过转换数据,使得新的特征向量(主成分)之间彼此正交,从而消除原始特征之间的相关性。这有助于减少多重共线性问题,并提高后续模型的准确性和稳定性。

  3. 保留最大方差信息:PCA将数据投影到方差最大的主成分上,这意味着它保留了数据中最重要的信息。这使得我们能够更好地理解数据集的结构和变异性,以及更好地解释数据。

  4. 可视化数据:降维后的数据可以更容易地可视化,因为它们通常只涉及两个或三个主成分。这有助于发现数据中的模式、聚类和异常值。

缺点:

  1. 信息损失:降维过程中,为了将数据映射到较低维度,必然会丢失一部分信息。降维后的数据无法完全还原原始数据,因此可能会损失一些细节和特征。

  2. 主成分的可解释性:虽然PCA可以帮助我们找到方差最大的主成分,但这些主成分通常很难直接解释。它们是原始特征的线性组合,因此不容易与现实世界中的具体含义对应。

  3. 对离群值敏感:PCA对离群值比较敏感,因为它是基于数据的协方差矩阵或相关矩阵计算的。离群值可能会对协方差或相关性的计算产生较大的影响,从而导致降维结果不准确。

  4. 计算复杂性:PCA的计算复杂度较高,特别是在处理大规模数据集时。计算协方差矩阵或相关矩阵需要较大的计算和存储开销。

参考视频:

参考视频1

参考视频2

参考视频3

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

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

相关文章

辽宁普通测径仪升级智能测径仪后都有哪些改进?

关键字: 普通测径仪, 智能测径仪, 测径仪升级, 测径仪特点, 智能测径仪优势, 目前多数厂家测径仪的数据处理方式是单片机计算出最终结果,然后传输到工控机后期处理。这样的电路系统对轧钢现场的高温、高粉尘和强电磁干扰的环境适应性很差,使得同一厂家、…

基于对抗神经网络的图像生成

基于对抗神经网络的图像生成 生成对抗网络(Generative Adversarial Network, GAN)是一种深度学习模型,用于生成高质量、逼真的图像。由Ian Goodfellow等人在2014年提出,GAN已经成为图像生成领域的一个重要工具。GAN的核心思想是通…

JUC并发编程-第一天

JUC并发编程-第一天 JUC开发基础知识进程、线程、协程 JUC开发基础知识 先有进程,然后进程可以创建线程,线程是依附在进程里面的,线程里面包含多个协程 进程之间不共享全局变量,线程之间共享全局变量(线程通信就是用的这个&#x…

Spring boot集成log4j及日志配置详解,实战,ELK使用教程。

目录 引言一、SpringBoot 集成 Log4j1. 添加 Log4j 依赖2. 移除默认的Logback组件3. 创建 Log4j 配置文件4. 配置 Log4j2 日志文件 二、Log4j2 XML 文件配置详解基本结构Appenders 配置详解Loggers 配置详解 三、日志的作用四、日志数据采集与分析1. 日志数据采集2. 日志数据分…

如何选择靠谱的LabVIEW外包公司

概述 选择一家靠谱的LabVIEW外包公司是项目成功的关键。本文从公司成立时间、人员变动、团队稳定性、经验丰富度、主业聚焦度等多个角度进行分析比较,提供合理建议和注意事项,帮助你找到最合适的外包合作伙伴,确保项目顺利进行和高质量交付。…

经典的网站系统架构(入门级)

从开发到部署,从用户访问到底层数据库,介绍搭建网站系统的经典架构的10个核心部分。 (图转自bytebytego,翻译整理by dogstar) 1、使用Git管理和协同源代码,通过CI/CD或Git的Webhook方式自动同步更新部署到服…

6.2 文件的缓存位置

1. 文件的缓冲 1.1 缓冲说明 将文件内容写入到硬件设备时, 则需要进行系统调用, 这类I/O操作的耗时很长, 为了减少I/O操作的次数, 文件通常使用缓冲区. 当需要写入的字节数不足一个块时, 将数据放入缓冲区, 当数据凑够一个块的大小后才进行系统调用(即I/O操作).系统调用: 向…

java原子变量

在Java中,原子变量是一种特殊的变量,它们提供了一种不需要显式加锁的情况下进行线程安全的操作。Java.util.concurrent.atomic包提供了原子变量类,如AtomicInteger,AtomicLong等,它们利用底层硬件的原子操作来保证线程…

MyBatis 动态 SQL 的详细内容讲解

1. MyBatis 动态 SQL 的详细内容讲解 文章目录 1. MyBatis 动态 SQL 的详细内容讲解2. 准备工作3. if 标签4. where 标签5. trim 标签6. set 标签7. choose when otherwise 标签8. foreach 标签8.1 批量删除8.2 批量添加 9. SQL 标签与 include 标签10. 总结:11. 最…

使用pnpm创建vue3项目

https://pnpm.io/zh/ 全局安装: npm install -g pnpm 检查版本: pnpm -v 创建vue3项目: pnpm create vuelatest 项目装包: pnpm install 运行项目: pnpm dev 命令行: https://pnpm.io/zh/pnpm-cli pnpm …

C语言 | Leetcode C语言题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; int evalRPN(char** tokens, int tokensSize) {int n tokensSize;int stk[(n 1) / 2];memset(stk, 0, sizeof(stk));int index -1;for (int i 0; i < n; i) {char* token tokens[i];if (strlen(token) > 1 || isdigit(token[0])…

测评要求+基本措施+对应产品

基本要求项测评项基本措施对应产品 网络架构 网络架构 网络架构应保证网络各个部分的带宽满足业务高峰期需要&#xff1b;带宽管理流量控制系统 网络架构 网络架构 网络架构应避免将重要网络区域部署在边界处&#xff0c;重要网络区域与其他网络区域之间应采取可靠的技术隔离手…

LogicFlow 学习笔记——6. LogicFlow 基础 网格 Grid

网格 Grid 网格是渲染或移动节点时的基本单元。其主要功能是在节点移动过程中&#xff0c;确保每个节点的中心点都精准落在网格点上&#xff0c;这大大有利于节点之间的精确对齐。通常&#xff0c;网格的间距越大&#xff0c;流程图编辑时的对齐越为便捷&#xff1b;反之&…

UNIAPP-ADB无线调试

ADB下载 SDK 平台工具版本说明 | Android Studio | Android Developers (google.cn) 环境变量配置 ADB版本查看 adb version 手机使用数据线连接到电脑 手机需要授权adb调试(开发人员选项里面) CMD输入命令 adb tcpip 5555 到了这一步你手机已经启动了adb服务了&…

vue 生命周期 钩子函数 keep-alive activated deactivated

一、activated deactivated 在被keep-alive包含的组件/路由中&#xff0c;会多出两个生命周期的钩子:activated 与 deactivated。在 2.2.0 及其更高版本中&#xff0c;activated 和 deactivated 将会在树内的所有嵌套组件中触发。activated在组件第一次渲染时会被调用&#x…

kafka 快速上手

下载 Apache Kafka 演示window 安装 编写启动脚本,脚本的路径根据自己实际的来 启动说明 先启动zookeeper后启动kafka,关闭是先关kafka,然后关闭zookeeper 巧记&#xff1a; 铲屎官&#xff08;zookeeper&#xff09;总是第一个到&#xff0c;最后一个走 启动zookeeper call bi…

2024 Idea最新激活码

idea的激活与安装 操作如下&#xff1a; ① 打开网站&#xff1a;https://web.52shizhan.cn 切换到&#xff1a;激活码&#xff0c;点击获取 ② 这个时候就跳转到现成账号页面&#xff0c;点击获取体验号&#xff0c;如图 ③ 来到了获取现成账号的页面了。输入你的邮箱账号即…

Flutter笔记:关于WebView插件的用法(上)

Flutter笔记 关于WebView插件的用法&#xff08;上&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:htt…

PaddleDetection快速体验quick_start

1 快速体验 # 设置显卡 export CUDA_VISIBLE_DEVICES0# 用PP-YOLO算法在COCO数据集上预训练模型预测一张图片 python tools/infer.py -c configs/ppyolo/ppyolo_r50vd_dcn_1x_coco.yml -o use_gputrue weightshttps://paddledet.bj.bcebos.com/models/ppyolo_r50vd_dcn_1x_coc…

针对oracle系列数据库慢数据量大的问题

-- 确保索引存在 create index idx_risk_assessment_hazard on risk_assessment_hazard(data_time, perception_id); create index idx_risk_dispose_base_info on risk_dispose_base_info(perception_id); -- 使用并行查询和with子句进行优化 explain plan for with t2 as (se…