主成分分析(PCA)详解与Python实现

1. 引言

主成分分析(PCA)是一种统计方法,它通过正交变换将一组可能相关的变量转换成一组线性不相关的变量,这些不相关变量称为主成分。PCA常用于降维、数据压缩和模式识别等领域。

喜欢的伙伴们点个关注哦~~❤❤❤

2. 理论基础

2.1 原理

PCA的目标是找到数据集中的最大方差方向,并沿着这些方向进行投影,以减少数据的维度,同时保留尽可能多的原始数据集的变异性。

2.2 步骤

  1. 标准化数据:使数据具有零均值和单位方差。
  2. 计算协方差矩阵:确定数据特征之间的关系。
  3. 计算特征值和特征向量:协方差矩阵的特征向量将定义主成分的方向,特征值将定义每个主成分的方差。
  4. 选择主成分:根据特征值的大小,选择前n个主成分。
  5. 转换到新的空间:将原始数据投影到这些主成分上。

3. Python实现

我们将使用Python的numpymatplotlib库来实现PCA,并可视化结果。

3.1 导入库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA as skPCA
from sklearn.datasets import make_blobs

3.2 创建数据集 

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

3.3 可视化原始数据 

plt.scatter(X[:, 0], X[:, 1], s=50)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Original Data')
plt.show()

3.4 PCA实现 

# 使用sklearn的PCA
pca = skPCA(n_components=2)  # 选择2个主成分
X_r = pca.fit_transform(X)# 可视化降维后的数据
plt.scatter(X_r[:, 0], X_r[:, 1], s=50)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('Reduced Data with PCA')
plt.show()

3.5 手动实现PCA

如果需要更深入理解PCA,可以手动实现:

# 标准化数据
mean = X.mean(axis=0)
X_std = (X - mean) / X.std(axis=0)# 计算协方差矩阵
cov_matrix = np.cov(X_std, rowvar=False)# 计算特征值和特征向量
eig_vals, eig_vecs = np.linalg.eig(cov_matrix)# 选择前2个最大的特征值对应的特征向量
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:, i]) for i in range(len(eig_vals))]
eig_pairs.sort(key=lambda x: x[0], reverse=True)
top_eig_vecs = np.array([eig_pairs[0][1], eig_pairs[1][1]])# 转换到新的空间
X_pca = X_std.dot(top_eig_vecs)

4. 结论

PCA是一种强大的降维技术,可以有效地在保留数据集中大部分变异性的同时减少数据的维度。通过Python的sklearn库,我们可以轻松地实现PCA,并利用matplotlib库进行数据可视化。

 

 

 

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

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

相关文章

C++封装

1. 封装 1.1. struct 当单一变量无法完成描述需求的时候,结构体类型解决了这一问题。可以将多个类型打包成一体,形成新的类型,这是c语言中的封装 但是,新类型并不包含,对数据类的操作。所有操作都是通过函数的方式进…

015.chromium源码修改-绕过cdp检测-出售成品

一、cpd检测是什么 开发者工具协议(Chrome DevTools Protocol,就简称CDP)cdp检测(Chrome DevTools Protocol Detection),是许多网站常用的机器人检测手段之一。通常是利用浏览器开发者工具的进行的功能检测或漏洞探测。当每次打开…

IT专业入门:高考假期预习指南

IT专业入门:高考假期预习指南 方向一:基础课程预习指南 在IT领域,基础知识的掌握至关重要。以下是一些基本课程和知识点,帮助你在正式进入大学前有所准备: 计算机科学导论:理解计算原理、计算机组成以及…

【C++】——【 STL简介】——【详细讲解】

目录 ​编辑 1. 什么是STL 2. STL的版本 3. STL的六大组件 1.容器(Container): 2.算法(Algorithm): 3.迭代器(Iterator): 4.函数(Function): 5.适配器(Adapter): 6.分配器(Allocator): 4. STL的…

调度器APScheduler定时执行任务

APScheduler(Advanced Python Scheduler)是一个Python库,用于调度任务,使其在预定的时间间隔或特定时间点执行。它支持多种调度方式,包括定时(interval)、日期(date)和Cr…

探索IT世界的第一步:高考后的暑期学习指南

目录 前言1. IT领域概述1.1 IT领域的发展与现状1.2 IT领域的主要分支1.2.1 软件开发1.2.2 数据科学1.2.3 网络与安全1.2.4 系统与运维 2. 学习路线图2.1 基础知识的学习2.1.1 编程语言2.1.2 数据结构与算法 2.2 实战项目的实践2.2.1 个人项目2.2.2 团队项目 2.3 学习资源的利用…

综合项目实战--jenkins流水线

一、流水线定义 软件生产环节,如:需求调研、需求设计、概要设计、详细设计、编码、单元测试、集成测试、系统测试、用户验收测试、交付等,这些流程就组成一条完整的流水线。脚本式流水线(pipeline)的出现代表企业人员可以更自由的通过代码来实现不同的工作流程。 二、pi…

Python实战,桌面小游戏,剪刀石头布

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python项目开发实战_桌面小游戏-剪刀石头布_编程案例解析实例详解课程教程.pdf 创建一个基于Python的桌面小游戏“剪刀石头布”是一个很好的编程实践…

C++ 识别 .lua文件内用户自定义的全局函数

摘要: 此系列是为经手的项目介绍编译和使用,以及项目开发过程中遇到的bug解决方案或项目开发过程中有意思的需求设计等等项目相关的博文。 此篇是为开发自定义界面项目过程中系统页面与脚本交互的一个小需求,系统导入用户自己编写的.lua脚本文…

气膜建筑照明:吊式与落地灯杆的利弊—轻空间

气膜建筑以其独特的设计和高效的功能性,广泛应用于体育场馆、工厂等各类场所。在这些气膜建筑中,照明方式的选择尤为重要。尽管有多种照明方式可供选择,但常用的反射光源形式在气膜建筑中尤为普遍。轻空间将重点介绍两种常用的反射照明方式&a…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据,当然大部分时候都只是作为请求 / 响应的数据组装中心,但是有一个插件是怎么都绕不过去的:Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…

Linux中vim文本编辑器你了解多少?

在Linux中,vim(Vi IMproved)是一个非常强大的文本编辑器,它基于更古老的vi编辑器,并添加了许多增强功能。vim有几种不同的模式,包括命令模式、插入模式和可视模式,每种模式都有特定的功能和快捷…

音乐:触动心灵的艺术语言

Enjoy your music 音 乐 作为一种跨越时空和文化的艺术形式,拥有着无穷的魅力和力量。 它不仅能够带给我们愉悦的听觉享受,还对我们的身心健康、认知发展和社会交往产生着深远的影响。 一、音乐的基本元素 音乐由多个基本元素构成,包括…

【CentOS7.6】yum 报错:Could not retrieve mirrorlist http://mirrorlist.centos.org

一、报错 1.报错内容如下 在使用 yum makecache 命令时报错,在 yum install -y xxx 的时候报错等等 [roothcss-ecs-a901 yum.repos.d]# yum makecache Loaded plugins: fastestmirror Determining fastest mirrors Could not retrieve mirrorlist http://mirrorl…

Linux 常见的几种编辑器的操作步骤

在大多数命令行文本编辑器中,保存并关闭文件的操作方式基本相似。以下是常见的几种编辑器的操作步骤: 使用 vi 编辑器保存并关闭文件 编辑文件: sudo vi /path/to/file 编辑内容: 按 i 进入插入模式,编辑文件内容。 …

Go 语言条件语句

Go 语言条件语句 在编程语言中,条件语句用于根据特定条件执行不同的代码路径。Go 语言提供了几种条件语句,包括 if、switch 和 select。这些语句使得程序可以根据不同的条件执行不同的操作,从而实现程序的逻辑分支。 1. if 语句 if 语句是…

【web APIs】快速上手Day03

目录 Web APIs - 第3天全选文本框案例事件流事件捕获事件冒泡阻止冒泡解绑事件on事件方式解绑addEventListener方式解绑 注意事项-鼠标经过事件的区别两种注册事件的区别 事件委托综合案例-tab栏切换改造 其他事件页面加载事件元素滚动事件页面滚动事件-获取位置页面滚动事件-滚…

巴西东南湾乌巴图巴 ANTARES 监测站数据

ANTARES monitoring station in Ubatuba, Southeast Brazilian Bight 巴西东南湾乌巴图巴 ANTARES 监测站 简介 ANTARES 区域网络由分布在拉丁美洲的沿岸时间序列站组成。主要目的是研究气候和人为影响引起的长期变化,以及用于卫星匹配和算法开发的海洋颜色。Uba…

SoftCLT: 时间序列的软对比学习《Soft Contrastive Learning for Time Series》(时间序列、时序分类任务、软...

2024年6月25日,10:11,好几天没看论文了,一直在摸鱼写代码(虽然也没学会多少),今天看一篇师兄推荐的。 论文: Soft Contrastive Learning for Time Series 或者是: Soft Contrastive Learning for Time Seri…

[C++][设计模式][组合模式]详细讲解

目录 1.动机(Motivation)2.模式定义3.要点总结4.代码感受 1.动机(Motivation) 软件在某些情况下,客户代码过多地依赖于对象容器复杂的内部实现结构,对象容器内部实现结构(而非抽象结构)的变化引起客户代码的频繁变化,带来了代码的维护性、扩…