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

机器学习之PCA降维

主成分分析(PCA,Principal Component Analysis)

主成分分析(PCA)是一种常见的无监督学习技术,广泛应用于数据降维、数据可视化以及特征提取等任务。PCA的目标是通过线性变换将数据从高维空间映射到低维空间,同时尽可能保留数据的变异性(即数据的主要特征)。

1. PCA的基本思想

PCA的核心思想是找出数据中方差最大的方向,并用这些方向来描述数据。通过这些方向(称为“主成分”),我们可以在保持数据的主要信息的同时,减少数据的维度。

具体来说,PCA的过程可以分为以下几个步骤:

  1. 标准化数据:通常情况下,在进行PCA之前,我们会对数据进行标准化(零均值单位方差处理)。这一步骤非常重要,因为PCA的结果受数据尺度的影响。如果数据的不同特征量纲不同,PCA可能会偏向那些尺度较大的特征。

  2. 计算协方差矩阵:通过计算数据的协方差矩阵,我们可以了解不同特征之间的相关性。协方差矩阵的每个元素表示两个特征之间的协方差。如果两个特征之间的协方差较大,说明它们之间存在较强的线性关系。

  3. 计算特征值和特征向量:对协方差矩阵进行特征值分解(或奇异值分解)。特征值代表每个主成分方向的重要性,而特征向量则代表这些方向本身。

  4. 排序和选择主成分:将特征值按降序排列,选择最大的几个特征值对应的特征向量作为主成分。每个主成分都代表数据中的一个方向,这些方向是原始特征空间中最能表示数据方差的方向。

  5. 将数据投影到新空间:使用选定的主成分将数据从高维空间映射到低维空间,这样我们就可以得到降维后的数据。

2. PCA的数学过程

假设我们有一个 n×m 的数据矩阵 X,其中 n 是样本数,m 是特征数。PCA的数学步骤如下:

  1. 数据标准化: 对每个特征减去均值,得到零均值数据:

    X′=X−μ

    其中,μ 是特征的均值。

  2. 计算协方差矩阵: 协方差矩阵 C 计算公式为:

  3. 特征值分解: 对协方差矩阵 C 进行特征值分解,得到特征值和特征向量:

    其中,λi是特征值,vi是对应的特征向量。

  4. 选择主成分: 按照特征值的大小对特征向量进行排序,选择前 k个特征值对应的特征向量,组成一个新的矩阵 Vk。

  5. 数据映射: 使用选定的特征向量将原数据映射到新的低维空间:

    Xnew=X′Vk

    其中,Xnew是降维后的数据,Vk是由前 k 个主成分组成的矩阵。

3. PCA的应用
  • 数据降维:PCA最常见的应用之一是降维。当数据具有很多特征时,可能存在冗余信息,PCA可以通过减少特征数量来简化模型,减少计算开销,同时尽量保留数据的原始信息。

  • 数据可视化:PCA常用于将高维数据投影到2D或3D空间,帮助我们对数据进行可视化。通过观察降维后的数据,我们可以识别数据的分布、模式或异常。

  • 去噪声:通过去除一些较小的主成分,可以消除数据中的噪声,增强信号。

  • 特征提取:PCA可以用来提取数据中的重要特征,尤其是在图像处理、语音识别等领域。它能够帮助我们识别最具代表性的特征,从而简化后续的处理和建模。

4. PCA的优缺点
  • 优点

    1. 降维效率高:PCA是一种线性降维方法,计算过程相对简单且高效,适用于大规模数据。
    2. 数据压缩:PCA能够有效地减少数据的维度,去除冗余特征。
    3. 去噪效果:去除低方差成分,可以减少噪声的影响,提高数据质量。
  • 缺点

    1. 线性假设:PCA只能捕捉数据中的线性关系,对于非线性数据的表现不佳。
    2. 信息丢失:虽然PCA可以减少数据维度,但如果选择的主成分较少,可能会丢失重要信息。
    3. 特征不可解释性:PCA的主成分是原始特征的线性组合,通常难以直观解释。
5. PCA的Python实现

在Python中,可以使用scikit-learn库中的PCA类来实现主成分分析。以下是一个简单的示例:

import numpy as np
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler# 假设X是我们的原始数据矩阵
X = np.random.randn(100, 5)  # 100个样本,5个特征# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 初始化PCA对象
pca = PCA(n_components=2)  # 降到2维# 拟合PCA并转换数据
X_pca = pca.fit_transform(X_scaled)print("降维后的数据形状:", X_pca.shape)
以使用 Python 中的 matplotlibsklearn 来生成一个展示PCA过程的图。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler# 创建一个简单的二维数据集
np.random.seed(0)
X = np.random.randn(100, 2)# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 执行PCA,降到1维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X_scaled)# 可视化原始数据和PCA后的投影
plt.figure(figsize=(8, 6))# 绘制原始数据
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], alpha=0.7, label='Original Data')# 绘制主成分方向
origin = np.mean(X_scaled, axis=0)
plt.quiver(origin[0], origin[1], pca.components_[0, 0], pca.components_[0, 1],angles='xy', scale_units='xy', scale=1, color='r', label='Principal Component')# 绘制PCA后的投影
plt.scatter(X_pca, np.zeros_like(X_pca), alpha=0.7, color='g', label='PCA Projection')plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.title('PCA: Projection of Data onto Principal Component')
plt.grid(True)
plt.show()

图解说明:

  1. 原始数据(蓝色点):这表示原始的二维数据。
  2. 主成分(红色箭头):这表示通过PCA找到的主要方向(最大方差的方向),用箭头表示。
  3. PCA后的投影(绿色点):数据点被投影到主成分方向后,降维到一维。
6. 总结

PCA是一种强大的线性降维工具,广泛应用于数据处理和机器学习任务中。它能够通过找到数据中的主要成分来简化问题,降低计算复杂度,但其线性假设限制了它在一些复杂数据结构上的表现。

相关文章:

机器学习之PCA降维

主成分分析(PCA,Principal Component Analysis) 主成分分析(PCA)是一种常见的无监督学习技术,广泛应用于数据降维、数据可视化以及特征提取等任务。PCA的目标是通过线性变换将数据从高维空间映射到低维空间…...

《 OpenCV 环境搭建》

《OpenCV 环境搭建》 一、OpenCV 简介二、准备工作三、安装 OpenCV(一)获取安装包(二)安装过程 四、配置环境变量(一)系统环境变量配置(二)项目环境变量配置(以 Visual S…...

【阅读记录-章节7】Build a Large Language Model (From Scratch)

系列文章目录 【阅读记录-章节1】Build a Large Language Model (From Scratch) 【阅读记录-章节2】Build a Large Language Model (From Scratch) 【阅读记录-章节3】Build a Large Language Model (From Scratch) 【阅读记录-章节4】Build a Large Language Model (From Scr…...

在js中实现下载base64数据,兼容低版本

详细步骤如下 1、解析 Base64 数据: 如果数据流中包含前缀 data:…;base64,,先分离 MIME 类型和 Base64 数据部分。如果没有前缀,假设默认 MIME 类型(如 application/octet-stream)。 2、Base64 解码: 使…...

垃圾分割数据集labelme格式659张1类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):659 标注数量(json文件个数):659 标注类别数:1 标注类别名称:["garbage"] 每个类别标注的框数&#…...

深入探索 npm cache clean --force:清理 npm 缓存的艺术

npm 是 JavaScript 编程语言的包管理器,它是 Node.js 运行环境的默认包管理器。npm 提供了一个丰富的生态系统,包括数以百万计的可重用代码包。然而,随着时间的推移,npm 的缓存可能会变得庞大,影响性能或导致一些奇怪的…...

Flink中并行度和slot的关系——任务和任务槽

一、任务槽(task slots) Flink的每一个TaskManager是一个JVM进程,在其上可以运行多个线程(任务task),那么每个线程可以拥有多少进程资源呢?任务槽就是这样一个概念,对taskManager上每个任务运行…...

22【AUTOSAR自适应平台设计的概述01】杂项概念介绍

1.AUTOSAR自适应平台设计的概述 本小课题主要是让读者对AUTOSAR自适应平台设计的思路有个宏观的概念,不拘泥于具体的技术细节。 总结如下: 概述AUTOSAR自适应平台(AP)的设计。为AP用户和实施者提供总体设计和关键概念2.具体的章节由以下几个部分组成: 技术范围和方法: 介…...

基础运维学习计划-base版

目录 需要学习的内容? liunx基础 sql/mysql基础 tcp/ip协议基础 http基础 dns基础 网络基础:交换&路由概念&原理 常见网络协议 月学习计划 12.26 日 (bilibili自己找视频看看,资源很多) 12.27日 1…...

Golang的发展历程

Golang的发展历程可以分为以下几个阶段: 设计阶段:2007年,Google开始研究开发一种新的编程语言,主要出于对C和Java等编程语言的不足之处的反思。经过一年多的研究和讨论,Golang的设计方案得到确定,主要包括…...

数据结构之线性表之顺序表

定义: 由n(n>0)个数据特性相同的元素构成的有限序列称为线性表 简单来说n个相同数据类型的数据组wsw合在一起的这么一个集合就是一个线性表 线性表包括顺序表和链表 1. 顺序表(我们所有的代码实现都用函数来封装&#xff09…...

GESP202309 二级【小杨的 X 字矩阵】题解(AC)

》》》点我查看「视频」详解》》》 [GESP202309 二级] 小杨的 X 字矩阵 题目描述 小杨想要构造一个 的 X 字矩阵( 为奇数),这个矩阵的两条对角线都是半角加号 ,其余都是半角减号 - 。例如,一个 5 5 5 \times 5 5…...

流量主微信小程序工具类去水印

工具类微信小程序流量主带后台管理,可开通广告,带自有后台管理,不借助第三方接口 介绍 支持抖音,小红书,哔哩哔哩视频水印去除,功能实现不借助第三方平台。可实现微信小程序流量主广告变现功能&#xff0c…...

Es搭建——单节点——Linux

Es搭建——单节点——Linux 一、安装 下载安装包: 官网下载地址:https://www.elastic.co/downloads/elasticsearch 上传包到linux 切换到安装目录下 解压:tar -zxvf elasticsearch-7.17.1-linux-x86_64.tar.gz 重命名安装文件夹 mv elastics…...

linux安装idea

参考原网址:在Linux系统中安装idea教程_idea linux-CSDN博客 1.下载idea Download IntelliJ IDEA – The Leading Java and Kotlin IDE 选择Download,下载正确的文件名:ideaIU-2024.3.1.1.tar.gz 2.安装vim sudo apt install vim 3.解压…...

PLSQL 客户端连接 Oracle 数据库配置

1. 安装Oracle客户端 首先,安装Oracle客户端。可以从Oracle官方网站下载Oracle Instant Client, 安装完成后,请记住安装路径,因为将在后续步骤中需要用到它。 2. 配置环境变量 添加环境变量 ORACLE_HOME 安装Oracle客户端后,配…...

C#调用OpenXml,读取excel行数据,遇到空单元跳过现象处理

问题及现象 在OpenXML中文件不包含空白单元格的条目,这就是跳过空白单元格的原因。 所以如果当我们打开一个excel,读取一个表格数据,发现如果有空单元格,openXML会跳过导致读取的数据发生错位。 比如这个是原始的excel表格数据…...

【计算机视觉CV-图像分类】06 - VGGNet的鲜花分类实现:从数据预处理到模型优化的完整实战!

目录 引言 VGGNet概述 VGGNet的网络架构 基于预训练VGGNet的五类鲜花分类实现 4.1 数据准备与预处理 4.2 模型实例化与参数调整 4.3 模型训练与保存最优模型 4.4 模型导入与预测 4.5 训练过程的可视化 模型优化与防止过拟合 总结与展望 参考文献 引言 在计算机视觉…...

QT 控件定义为智能指针引发的bug

问题描述&#xff1a; std::unique_ptr<QStackedLayout> m_stacked_layout; 如上为定义&#xff1b; 调用&#xff1a; Line13ABClient::Line13ABClient(QWidget *parent) : BaseWidget(parent) { // 成员变量初始化 m_get_ready false; m_tittle_wnd…...

@register_model 装饰器

使用 register_model 装饰器来注册模型类有以下几个优势&#xff1a; 自动化注册&#xff1a; 通过装饰器自动将模型类注册到一个全局字典中&#xff0c;避免了手动注册的繁琐操作&#xff0c;使代码更加简洁和易于维护。 易于扩展&#xff1a; 可以方便地添加新模型&#xff…...

图像处理-Ch7-图像金字塔和其他变换

Ch7 小波变换&其他图像变换 文章目录 Ch7 小波变换&其他图像变换背景知识(bk)图像金字塔(Image Pyramid)子带编码(Sub-band Coding)Z - 变换(线性变换)完美重建滤波器组(PCFB, Perfect Construction Filter Banks)有限脉冲响应&#xff08;FIR&#xff09;滤波器双正交…...

解决在vue3+vite+element-plus 中echarts在el-dialog无法正常显示问题

核心&#xff1a;在dom加载完成后调用echarts实例 的resize()方法 这里是一个例子 这里封装一个echarts <template><div class"container" ref"container"></div> </template> <script lang"ts" setup> import {…...

SQL进阶技巧:如何计算摆动的序列?| LeetCode 376.-摆动序列

目录 0 摆动序列 1 数据准备 2 问题分析 3 小结 0 摆动序列 原题链接:376. 摆动序列 - 力扣(LeetCode) 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的…...

告别卡顿:探索 Java FGC 的根源与高效解决方案

Java Full Garbage Collection (FGC) 的产生原因及解决办法 引言 在Java应用程序的生命周期中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;是确保内存有效管理的关键机制。然而&#xff0c;当发生Full Garbage Collection&#xff08;FGC&#xff09…...

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…...

准备考试:解决大学入学考试问题

引言 在编程竞赛和算法挑战中&#xff0c;我们经常会遇到各种类型的组合问题。这些问题不仅考验我们的逻辑思维能力&#xff0c;还要求我们熟练掌握数据结构和算法。在这篇文章中&#xff0c;我们将探讨一个有趣的问题——“准备考试”&#xff0c;这个问题来自于一个虚构的情…...

vue3中如何自定义插件

英译汉插件 i18n.ts export default {install: (app: any, options: any) > {// 注入一个全局可用的$translate()方法app.config.globalProperties.$translate (key: string) > {// 获取options对象的深层属性// 使用key作为索引return key.split(".").redu…...

Linux应用软件编程-多任务处理(进程)

多任务&#xff1a;让系统具备同时处理多个事件的能力。让系统具备并发性能。方法&#xff1a;进程和线程。这里先讲进程。 进程&#xff08;process&#xff09;&#xff1a;正在执行的程序&#xff0c;执行过程中需要消耗内存和CPU。 进程的创建&#xff1a;操作系统在进程创…...

PyCharm专项训练5 最短路径算法

一、实验目的 本文的实验目的是通过编程实践&#xff0c;掌握并应用Dijkstra&#xff08;迪杰斯特拉&#xff09;算法和Floyd&#xff08;弗洛伊德&#xff09;算法来解决图论中的最短路径问题。 二、实验内容 数据准备&#xff1a; 使用邻接表的形式定义两个图graph_dijkstra…...

“AI+Security”系列第4期(一)之“洞” 见未来:AI 驱动的漏洞挖掘新范式

在数字化浪潮下&#xff0c;安全漏洞问题日益严峻&#xff0c;成为各行业发展的重大挑战。近日&#xff0c;“AISecurity” 系列第 4 期线下活动于北京成功举办&#xff0c;聚焦 “洞” 见未来&#xff1a;AI 驱动的漏洞挖掘新范式&#xff0c;汇聚了安全领域的众多专家。 本次…...

安卓蓝牙扫描流程

目录 系统广播 流程图 源码跟踪 系统广播 扫描开启广播&#xff1a;BluetoothAdapter.ACTION_DISCOVERY_STARTED "android.bluetooth.adapter.action.DISCOVERY_STARTED";扫描关闭广播&#xff1a;BluetoothAdapter.ACTION_DISCOVERY_FINISHED "android.b…...

【视觉惯性SLAM:对极几何】

对极几何&#xff08;Epipolar Geometry&#xff09;介绍 对极几何是立体视觉中的核心内容之一&#xff0c;它描述了两个相机在观察同一个三维场景时&#xff0c;成像平面之间的几何关系。对极几何能够约束图像中对应点的位置关系&#xff0c;是双目立体匹配、三维重建、以及位…...

Stream `Collectors.toList()` 和 `Stream.toList()` 的区别(Java)

Stream Collectors.toList() 和 Stream.toList() 的区别 问题背景 在以下代码中&#xff1a; Test void test() {JSONArray nodes new JSONArray();String[] names {"df1", "df2", "df3"};for (String name : names) {JSONObject obj new …...

【Python知识】Python面向对象编程知识

Python面向对象编程知识 概述1. 类&#xff08;Class&#xff09;2. 对象&#xff08;Object&#xff09;3. 封装&#xff08;Encapsulation&#xff09;4. 继承&#xff08;Inheritance&#xff09;5. 多态&#xff08;Polymorphism&#xff09;6. 抽象&#xff08;Abstractio…...

安卓帧率获取

背景 性能优化&#xff0c;经常用到一些指标&#xff0c;诸如帧率、功耗等。对于普通app来讲&#xff0c; 之前一直使用gfxinfo指令获取丢帧率。但是这个指令无法获取游戏的帧率&#xff0c;查阅资料&#xff0c;发现SurfaceFlinger可以获取游戏帧率。 帧率获取原理 获取当前f…...

shell脚本(全)

shell脚本概述 第一个shell脚本 shell注释 shell变量 shell位置参数 shell字符串 shell内置命令 shell命令替换 输出 流程控制IF export命令 退出脚本 运行Shell脚本 实例导航 shell脚本概述 在说什么是shell脚本之前&#xff0c;先说说什么是shell。 从程序员的…...

Flask-----SQLAlchemy教程

存session session[username] username # 存储数据到 session 取session username session.get(username) render_template return render_template(index.html, usernameAlice)&#xff0c;渲染一个包含 username 变量的模板。 redirect return redirect(url_for(profil…...

【C++11】可变模板参数

目录 可变模板的定义方式 参数包的展开方式 递归的方式展开参数包 STL中的emplace相关接口函数 STL容器中emplace相关插入接口函数 ​编辑 模拟实现&#xff1a;emplace接口 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板&#xff0c;相比 C9…...

.NET开发人员学习书籍推荐

作为一名.NET开发人员&#xff0c;掌握相关技术是提升开发能力和拓展职业发展的关键。无论你是刚入门的新人&#xff0c;还是希望精进技术的资深开发者&#xff0c;选择合适的学习资源至关重要。下面是一些经典且实用的学习书籍推荐&#xff0c;帮助你在C#、SQL、前端开发等方面…...

jupyter切换内核方法配置问题总结

下面这个博客总结了3种不同的方法&#xff0c;很有调理&#xff0c;推荐尝试 【最全指南】如何在 Jupyter Notebook 中切换/使用 conda 虚拟环境&#xff1f; !!! 注意使用上面介绍的ipykernel方法2, 要在每一个希望被jupyter识别到的环境内【分别】安装ipykernel以及添加配置 …...

SVM理论推导

本文介绍支持向量机&#xff08;SVM&#xff09;的理论推导。 一、SVM 的基本思想 SVM 的目标是找到一个最优超平面&#xff0c;将样本分为不同的类别&#xff0c;并最大化类别间的间隔。 1. 线性可分情况下&#xff1a; 在特征空间中找到一个超平面&#xff0c;使得&#…...

如何永久解决Apache Struts文件上传漏洞

Apache Struts又双叒叕爆文件上传漏洞了。 自Apache Struts框架发布以来&#xff0c;就存在多个版本的漏洞&#xff0c;其中一些漏洞涉及到文件上传功能。这些漏洞可能允许攻击者通过构造特定的请求来绕过安全限制&#xff0c;从而上传恶意文件。虽然每次官方都发布补丁进行修…...

【Java数据结构与算法】第10-14章

第10章 树结构的基础部分 10.1 二叉树 10.1.1 为什么需要树这种数据结构 10.1.2 树示意图 10.1.3 二叉树的概念 10.1.4 二叉树遍历的说明 10.1.5 二叉树遍历应用实例(前序,中序,后序) 10.1.6 二叉树-查找指定节点 思路图解 10.1.7 二叉树-删除节点 package com.atguigu.tree;…...

MacOS M3源代码编译Qt6.8.1

编译时间过长&#xff0c;如果不想自己编译&#xff0c;可以通过如果网盘进行下载&#xff1a; 链接: https://pan.baidu.com/s/17lvF5jQ-vR6vE-KEchzrVA?pwdts26 提取码: ts26 在macOS上编译Qt 6需要一些前置步骤和工具。以下是编译Qt 6的基本步骤&#xff1a; 安装Xcode和…...

3.银河麒麟V10 离线安装Nginx

1. 下载nginx离线安装包 前往官网下载离线压缩包 2. 下载3个依赖 openssl依赖&#xff0c;前往 官网下载 pcre2依赖下载&#xff0c;前往Git下载 zlib依赖下载&#xff0c;前往Git下载 下载完成后完整的包如下&#xff1a; 如果网速下载不到请使用网盘下载 通过网盘分享的文件…...

实现 QTreeWidget 中子节点勾选状态的递归更新功能只影响跟节点的状态父节点状态不受影响

在 Qt 开发中&#xff0c;QTreeWidget 提供了树形结构的显示和交互功能。为了实现某个子节点勾选或取消勾选时&#xff0c;只影响当前节点及其子节点的状态&#xff0c;同时递归更新父节点的状态以正确显示 Qt::PartiallyChecked 或 Qt::Checked&#xff0c;我们可以借助 Qt 的…...

ubuntu24.04使用opencv4

ubuntu24.04LTS自带opencv4.5代码实例 //opencv_example.cpp #include <opencv2/opencv.hpp> #include <iostream>int main() {// 读取图像cv::Mat img cv::imread("image.jpg", cv::IMREAD_COLOR);if (img.empty()) {std::cerr << "无法读…...

R语言数据分析案例46-不同区域教育情况回归分析和探索

一、研究背景 教育是社会发展的基石&#xff0c;对国家和地区的经济、文化以及社会进步起着至关重要的作用。在全球一体化进程加速的今天&#xff0c;不同区域的教育发展水平呈现出多样化的态势。这种差异不仅体现在教育资源的分配上&#xff0c;还表现在教育成果、教育投入与…...

flink sink doris

接上文&#xff1a;一文说清flink从编码到部署上线 网上关于flink sink drois的例子较多&#xff0c;大部分不太全面&#xff0c;故本文详细说明&#xff0c;且提供完整代码。 flink doris版本对照表 1.添加依赖 <!--doris cdc--><!-- 参考&#xff1a;"https…...

《探索 Apache Spark MLlib 与 Java 结合的卓越之道》

在当今大数据与人工智能蓬勃发展的时代&#xff0c;Apache Spark MLlib 作为强大的机器学习库&#xff0c;与广泛应用的 Java 语言相结合&#xff0c;为数据科学家和开发者们提供了丰富的可能性。那么&#xff0c;Apache Spark MLlib 与 Java 结合的最佳实践究竟是什么呢&#…...