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

《机器学习》—— PCA降维

文章目录

  • 一、PCA降维简单介绍
  • 二、python中实现PCA降维函数的介绍
  • 三、代码实现
  • 四、PCA降维的优缺点

一、PCA降维简单介绍

  • PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。
  • 它通过线性变换将原始数据转换到新的坐标系统中,使得任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依此类推。
  • PCA的主要目的是通过保留数据集中对方差贡献最大的特征来降低数据的维度,同时尽可能保留原始数据的信息。
  • PCA降维的步骤
    • 1、标准化数据
      由于PCA对数据的尺度非常敏感,因此在进行PCA之前,通常需要先将数据标准化(也称为归一化),即每个特征减去其均值并除以其标准差,使得每个特征的均值为0,方差为1。
    • 2、计算协方差矩阵
      协方差矩阵衡量的是数据集中各个特征之间的相关性。对于n维数据,其协方差矩阵是一个n×n的矩阵,其中每个元素C ij是第i个特征和第j个特征的协方差。
    • 3、计算协方差矩阵的特征值和特征向量
      特征值表示了每个主成分在数据集中的方差贡献率,而特征向量则定义了新的坐标轴的方向。
    • 4、选择主成分
      根据特征值的大小,选择前k个最大的特征值对应的特征向量。这些特征向量将构成新的特征空间,其中k是降维后的维度数。
    • 5、将原始数据投影到新的特征空间
      使用选定的特征向量作为基,将原始数据投影到新的特征空间,得到降维后的数据。

二、python中实现PCA降维函数的介绍

  • 在Python中,使用scikit-learn库来进行PCA分析,其中PCA是通过PCA类来实现的

  • PCA类有以下参数(默认值)

    PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)
    
  • 重要参数的介绍:

  • n_components:这个参数可以帮我们指定希望PCA降维后的特征维度数目。

    • 如果为整数,表示要降维到的目标,比如十维的数据,指定n_components=5,表示将十维数据降维到五维;
    • 如果为小数,表示累计方差百分比。
  • copy : bool类型,True或者False,缺省时默认为True。 表示是否在运行算法时,将原始训练数据复制一份。

    • 若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;
    • 若为False,则运行PCA算法后,原始训练数据的值会改,因为是在原始数据上进行降维计算。
  • whiten:判断是否进行白化。

    • 所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1对于PCA降维本身来说,一般不需要白化。如果你PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
  • svd_solver:即指定奇异值分解SVD的方法,由于特征分解是奇异值分解SVD的一个特例,一般的PCA库都是基于SVD实现的。有4个可以选择的值:{‘auto’, ‘full’, ‘arpack’, ‘randomized’}。

    • randomized一般适用于数据量大,数据维度多同时主成分数目比例又较低的PCA降维,它使用了一些加快SVD的随机算法。
    • full则是传统意义上的SVD,使用了scipy库对应的实现。
    • arpack和randomized的适用场景类似,区别是randomized使用的是scikit-learn自己的SVD实现,而arpack直接使用了scipy库的sparse SVD实现。
    • auto是默认值,即PCA类会自己去在前面讲到的三种算法里面去权衡,选择一个合适的SVD算法来降维。一般来说,使用默认值就够了。
  • 一些返回值属性

    • components_:一个形状为(n_components, n_features)的NumPy数组,包含了定义主成分的特征向量(即每个主成分是原始特征的哪个线性组合)。
    • explained_variance_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差值。方差值越大,则说明越是重要的主成分。
    • explained_variance_ratio_:一个形状为(n_components,)的NumPy数组,包含了每个主成分解释的方差占总方差的比例。

三、代码实现

  • 数据集介绍

    • 此数据集是一份少量的(60+)鸢尾花数据,前四列为特征数据,最后一列为标签数据
    • 部分数据如下所示
      在这里插入图片描述
  • 此数据中有四个特征,代表的有4个维度,下面将通过PCA降维方法将其降维至2维,并将降维后的特征数据划分为新的数据集,传入到逻辑回归模型中进行训练与测试

  • 并将没有进行PCA降维处理的原数据也传入到回归模型中,得出结果,进行比较

  • 代码如下

    from sklearn.decomposition import PCA
    import pandas as pd# 读取数据
    data = pd.read_excel('hua.xlsx')# 数据划分
    x = data.iloc[:, :-1]  # 训练数据
    y = data.iloc[:, -1]  # 标签数据# 实例化PCA对象
    pca = PCA(n_components=2)
    pca.fit(x)print('特征所占百分比:{}'.format(sum(pca.explained_variance_ratio_)))
    print('每个主成分的方差值:{}'.format(pca.explained_variance_))new_x = pca.transform(x)
    print('PCA降维后数据:')
    print(new_x)# 切分降维后的数据集
    from sklearn.model_selection import train_test_splitx_train_pca, x_test_pca, y_train_pca, y_test_pca = \train_test_split(new_x, y, test_size=0.2, random_state=0)from sklearn.linear_model import LogisticRegression# 实例一个逻辑回归模型
    classifier_pca = LogisticRegression()
    classifier_pca.fit(x_train_pca, y_train_pca)  # 训练数据from sklearn import metrics# accuracy 值
    train_score_pca = classifier_pca.score(x_train_pca, y_train_pca)
    print("训练集数据测试的accuracy值为:{}".format(train_score_pca))
    # 训练集数据评估指标报告
    train_predict_pca = classifier_pca.predict(x_train_pca)
    print("训练集数据评估指标报告")
    print(metrics.classification_report(y_train_pca, train_predict_pca))test_score_pca = classifier_pca.score(x_test_pca, y_test_pca)
    print("测试集数据测试的accuracy值为:{}".format(test_score_pca))
    # 测试集数据评估指标报告
    test_predict_pca = classifier_pca.predict(x_test_pca)
    print("测试集数据评估指标报告")
    print(metrics.classification_report(y_test_pca, test_predict_pca))print("**************************************************************")# 切分原始数据集
    x_train, x_test, y_train, y_test = \train_test_split(x, y, test_size=0.2, random_state=0)classifier = LogisticRegression()
    classifier.fit(x_train, y_train)# accuracy 值
    train_score = classifier.score(x_train, y_train)
    print("训练集数据测试的accuracy值为:{}".format(train_score))
    # 训练集数据评估指标报告
    train_predict = classifier.predict(x_train)
    print("训练集数据评估指标报告")
    print(metrics.classification_report(y_train, train_predict))test_score = classifier.score(x_test, y_test)
    print("测试集数据测试的accuracy值为:{}".format(train_score))
    # 测试集数据评估指标报告
    test_predict = classifier.predict(x_test)
    print("测试集数据评估指标报告")
    print(metrics.classification_report(y_test, test_predict))
    
  • 结果如下
    在这里插入图片描述
    在这里插入图片描述

  • 由于此数据集的数据量太少,降维前后的模型训练结果基本差不多,在大的数据集中对比最终的结果可能会更加明显

四、PCA降维的优缺点

  • 优点:
    • 1.计算方法简单,容易实现。
    • 2.可以减少指标筛选的工作量。
    • 3.消除变量间的多重共线性。
    • 4.在一定程度上能减少噪声数据。
  • 缺点:
    • 1.特征必须是连续型变量(可以在一定范围内连续取值的变量)。
    • 2.无法解释降维后的数据是什么。
    • 3.有时候贡献率小的成分有可能更重要,但是会被降维的时候舍弃掉。

相关文章:

《机器学习》—— PCA降维

文章目录 一、PCA降维简单介绍二、python中实现PCA降维函数的介绍三、代码实现四、PCA降维的优缺点 一、PCA降维简单介绍 PCA(主成分分析,Principal Component Analysis)是一种常用的数据降维技术。它通过线性变换将原始数据转换到新的坐标系…...

植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48

摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…...

server 2016搭建FTP服务

目录 一、实验环境 二、在server 2016上面安装FTP服务 三、在server 2016上面配置FTP服务 四、创建用户(也可创建用户组,给用户组赋予权限) 一、实验环境 windows server 2016用于安装ftp服务 windows 10作为客户端进行测试。 二、在s…...

物理学基础精解【4】

文章目录 运动和力质点运动机械运动的参考系运动的相对性运动学中坐标系 参考文献 运动和力 质点运动 一个物体相对于另一个物体的位置或一个物体的某些部分相对于其他部分的位置 ,随着时间而变化的过程,叫机械运动 。质点是一个物理学中的理想化模型&…...

【区块链 + 人才服务】Blockchain Workshop- 区块链编程实践平台 | FISCO BCOS应用案例

Blockchain Workshop v2.0(以下简称 BCW v2.0)是点宽网络科技有限公司升级的全新区块链实践教育平台产品。 BCW v2.0 区块链实践教育平台面向高校区块链专业人才培养,用于区块链专业技术学习和智能合约编程学习,平台基于 FISCO BC…...

Java面试篇基础部分-Java中常用的I/O模型

阻塞I/O模型 阻塞式的I/O模型是一种非常常见的I/O模型机制,在进行数据读写操作的时候,客户端会发生阻塞等待。 工作流程如图所示,该用户线程一直阻塞,等待内存中的数据就绪;内存中的数据就绪之后,内核态的数据将拷贝到用户线程中,并且返回I/O的执行结果到用户线程。这个…...

如何使用python运行Flask开发框架并实现无公网IP远程访问

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…...

第三届828 B2B企业节开幕,大腾智能携手华为云共谱数字化新篇章

8月27日,由华为携手上万家伙伴共同发起的第三届828 B2B企业节在贵州正式开幕。 本届企业节推出上万款数智产品,600多个精选解决方案,旨在融通数智供需,加速企业智改数转,助推中国数智产业实力再升级。中共贵州省委副书…...

Linux网络编程IO管理

网络 IO 涉及到两个系统对象,一个是用户空间调用 IO 的进程或者线程,一个是内核空间的内核系统,比如发生 IO 操作 read 时,它会经历两个阶段: 等待内核协议栈的数据准备就绪;将内核中的数据拷贝到用户态的…...

SpringCloud集成ELK

1、添加依赖 <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>6.1</version> </dependency>2、在logback-spring.xml中添加配置信息&#xff08;logback-sp…...

【卷起来】VUE3.0教程-06-组件详解

各位看官&#xff0c;点波关注和赞吧 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构&#xff1a; 这和我们嵌套 HTML 元素的方式类似&#xff0c;Vue 实现了自己的…...

JS Web

Web API 元素通用属性 元素自身属性 事件处理...

【Linux】传输层协议——UDP

零、传输层的作用是负责数据能够从发送端传输到接收端 一、再来认识一下端口号 端口号&#xff08;Port&#xff09;标识了一个主机进行通信的不同的应用程序。在TCP/IP协议中&#xff0c;用“源IP”&#xff0c;“源端口号”&#xff0c;“目的IP”&#xff0c;“目的端口号”…...

算法学习攻略总结 : 入门至进阶,通关之路指南

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; <搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到…...

《卷积神经网络 CNN 原理探秘》

CNN基本原理详解 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…...

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…...

派遣函数 - 通过设备链接打开设备

利用文件IO相关的Wn32API对设备进行“打开”和“关闭”操作。要打开设备&#xff0c;必须通过设备的名字才能得到该设备的柄。前面介绍过&#xff0c;每个设备都有设备名称&#xff0c;如HelloDDK驱动程序的设备名为“Device\\MyDDKDevice”&#xff0c;但是设备名无法被用户模…...

Vue 2 中的 `$set` 方法详解

在 Vue 2 中&#xff0c;响应式数据的更新非常重要&#xff0c;因为它确保了当数据改变时&#xff0c;视图能够自动更新。Vue 使用一套高效的机制来追踪依赖并在数据变化时更新视图。然而&#xff0c;在某些情况下&#xff0c;直接修改对象的属性可能不会触发视图更新。这时&am…...

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合&#xff0c;结果不去重 3. collect_set 收集并形成set集合&#xff0c;结果去重 案例演示 1. 每个月的入职人数以及姓名 炸裂函数 概述 案例演示 1. 数据准备 1&#xff09;表…...

水壶问题记录

https://leetcode.cn/problems/water-and-jug-problem/description/?envTypestudy-plan-v2&envId2024-spring-sprint-100...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...