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

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

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

相关文章

Mysql进阶SQL优化

SQL优化在开发场景中必不可少的技能之一,它能最大限度的提升SQL查询性能,如果随意使用也会出现不可预料的结局。 1、为什么要优化SQL 我们先说说不优化SQL造成什么现象。常见问题是响应时间长,用户体验感低。数据库频繁争抢锁,浪…

修改成清华镜像源解决Anaconda报The channel is not accessible源通道不可用问题

修改成清华镜像源解决Anaconda报The channel is not accessible源通道不可用问题 最近在通过pycharm开发python程序,引用anaconda环境建立虚拟环境时报错,报UnavailableInvalidChannel: The channel is not accessible or is invalid.应该是镜像源访问通…

年会游戏策划

一、游戏名称 单眼弹瓶盖 二、游戏目的 通过单眼瞄准方式,锻炼玩家的手眼协调能力和注意力。 三、游戏规则 1. 参与者需站在一定距离外,遮住左眼睛,先转三圈,走到瓶子前,将瓶子上没有拧紧的瓶盖用…

【Linux】flock 文件级别的锁定

flock 是 Linux/Unix 系统中的一个命令,用于实现文件级别的锁定。它允许你在多个进程之间共享对文件的访问,但确保在同一时间只有一个进程可以访问文件,避免竞态条件(race conditions)和数据不一致问题。 flock 的基本…

Selenium+Java(21):Jenkins发送邮件报错Not sent to the following valid addresses解决方案

问题现象 小月妹妹近期在做RobotFrameWork自动化测试,并且使用Jenkins发送测试邮件的时候,发现报错Not sent to the following valid addresses,明明各个配置项看起来都没有问题,但是一到邮件发送环节,就是发送不出去,而且还不提示太多有用的信息,急的妹妹脸都红了,于…

Redis6为什么引入了多线程?

大家好,我是锋哥。今天分享关于【Redis6为什么引入了多线程?】面试题。希望对大家有帮助; Redis6为什么引入了多线程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Redis 6 引入了多线程的主要目的是提高性能&#…

【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制

kubernetes 资源限制 kubernetes中资源限制概括 1.如果运行的容器没有定义资源(memory、CPU)等限制,但是在namespace定义了LimitRange限制,那么该容器会继承LimitRange中的 默认限制。 2.如果namespace没有定义LimitRange限制,那么该容器可…

Rancher V2.9.0 Docker安装教程

1、创建Rancher挂载目录 mkdir -p /home/rancher/k3s/agent/images/ 2、复制容器中的镜像tar包,防止挂载之后镜像包丢失导致创建集群报错 避免:Internal error occurred: failed calling webhook "default.cluster.cluster.x-k8s.io" dock…

pytorch将数据与模型都放到GPU上训练

默认是CPU,如果想要用GPU需要: 安装配置cuda,然后更新/下载支持gpu版本的pytorch,可以参考:https://blog.csdn.net/weixin_35757704/article/details/124315569设置device:device torch.device(cuda if t…

CPT203 Software Engineering 软件工程 Pt.1 概论和软件过程(中英双语)

文章目录 1.Introduction1.1 What software engineering is and why it is important(什么是软件工程,为什么它很重要)1.1 We can’t run the modern world without software(我们的世界离不开软件)1.1.1 What is Soft…

MongoDB 创建用户、User、Role 相关 操作

创建用户 # db.createUser() Creates a new user.详细 查看 db.createUser() - MongoDB Manual v8.0 设置用户 Role(创建用户时也可以设置) # db.grantRolesToUser() Grants a role and its privileges to a user. 详细 查看 db.grantRolesToUser(…

v-if 和 v-show 的区别

一、原理区别 1. v-if 这是一个指令,用于条件性地渲染一个元素块。当v-if表达式的值为true时,元素及其包含的子元素才会被渲染到 DOM 中;当表达式的值为false时,元素及其子元素会被完全移除。这意味着在切换v-if的条件时&#x…

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程,分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前,确保服务器已配置好 Docker、MySQL 和 Redis,可参考下列链接进行操作&#xff1…

[WASAPI]音频API:从Qt MultipleMedia走到WASAPI,相似与不同

[WASAPI] 从Qt MultipleMedia 来看WASAPI 最近在学习有关Windows上的音频驱动相关的知识,在正式开始说WASAPI之前,我想先说一说Qt的Multiple Media,为什么呢?因为Qt的MultipleMedia实际上是WASAPI的一层封装,它在是线…

绝美的数据处理图-三坐标轴-散点图-堆叠图-数据可视化图

clc clear close all %% 读取数据 load(MyColor.mat) %读取颜色包for iloop 1:25 %提取工作表数据data0(iloop) {readtable(data.xlsx,sheet,iloop)}; end%% 解析数据 countzeros(23,14); for iloop 1:25index(iloop) { cell2mat(table2array(data0{1,iloop}(1,1)))};data(i…

SVN和Git

SVN(Subversion)和 Git 都是流行的版本控制系统(VCS),但它们在架构、使用场景、功能等方面有所不同。以下是它们的主要区别、各自的好处以及如何使用它们的详细说明。 一、SVN 和 Git 的区别 1. 版本控制模型 SVN&…

Spring Boot自定义注解获取当前登录用户信息

写在前面 在项目开发过程中,难免都要获取当前登录用户的信息。通常的做法,都是开发一个获取用户信息的接口。 如果在本项目中,多处都需要获取登录用户的信息,难不成还要调用自己写的接口吗?显然不用! 以…

第三百四十六节 JavaFX教程 - JavaFX绑定

JavaFX教程 - JavaFX绑定 JavaFX绑定同步两个值:当因变量更改时,其他变量更改。 要将属性绑定到另一个属性,请调用bind()方法,该方法在一个方向绑定值。例如,当属性A绑定到属性B时,属性B的更改将更新属性A…

详解VHDL如何编写Testbench

1.概述 仿真测试平台文件(Testbench)是可以用来验证所设计的硬件模型正确性的 VHDL模型,它为所测试的元件提供了激励信号,可以以波形的方式显示仿真结果或把测试结果存储到文件中。这里所说的激励信号可以直接集成在测试平台文件中,也可以从…

深度学习:从原理到搭建基础模型

引言: 深度学习为什么火? 深度学习在处理复杂的感知和模式识别任务方面展现出了前所未有的能力。以图像识别为例,深度学习模型(如卷积神经网络 CNN)能够识别图像中的各种物体、场景和特征,准确率远超传统的计算机视觉方法。 当然这之中也还因为 大数据时代的推动(随着…