机器学习:基于主成分分析(PCA)对数据降维

news2024/10/1 19:27:50

机器学习:基于主成分分析(PCA)对数据降维

作者:AOAIYI

作者简介:Python领域新星作者、多项比赛获奖者:AOAIYI首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


专栏案例:机器学习
机器学习:基于逻辑回归对某银行客户违约预测分析
机器学习:学习k-近邻(KNN)模型建立、使用和评价
机器学习:基于支持向量机(SVM)进行人脸识别预测
决策树算法分析天气、周末和促销活动对销量的影响
机器学习:线性回归分析女性身高与体重之间的关系

文章目录

  • 机器学习:基于主成分分析(PCA)对数据降维
  • 一、实验目的
  • 二、实验原理
  • 三、实验环境
  • 四、实验内容
  • 五、实验步骤
    • 1.数据准备
    • 2.PCA分析
    • 3.查看主成分的解释能力
    • 4.主成分轴(Principal Axes)的可视化
    • 5.基于PCA的降维
    • 6.降维处理
    • 7.PCA逆向处理
    • 8.使用digits.data训练PCA模型并将结果可视化
  • 总结


一、实验目的

1、了解数据降维的各种算法原理

2、熟练掌握sklearn.decomposition中降维方法的使用

二、实验原理

主成分分析算法(Principal Component Analysis, PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。

主成分分析原理
设法将原来变量重新组合成一组新的相互无关的几个综合变量,同时根据实际需要从中可以取出几个较少的总和变量尽可能多地反映原来变量的信息的统计方法叫做主成分分析或称主分量分析,也是数学上处理降维的一种方法。主成分分析是设法将原来众多具有一定相关性(比如P个指标),重新组合成一组新的互相无关的综合指标来代替原来的指标。通常数学上的处理就是将原来P个指标作线性组合,作为新的综合指标。最经典的做法就是用F1(选取的第一个线性组合,即第一个综合指标)的方差来表达,即Va(rF1)越大,表示F1包含的信息越多。因此在所有的线性组合中选取的F1应该是方差最大的,故称F1为第一主成分。如果第一主成分不足以代表原来P个指标的信息,再考虑选取F2即选第二个线性组合,为了有效地反映原来信息,F1已有的信息就不需要再出现在F2中,用数学语言表达就是要求Cov(F1,F2)=0,则称F2为第二主成分,依此类推可以构造出第三、第四,……,第P个主成分。
在这里插入图片描述

sklearn中主成分分析的模型

class sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False, svd_solver=’auto’, tol=0.0, iterated_power=’auto’, random_state=None)

sklearn.decomposition.PCA参数介绍

接下来我们主要基于sklearn.decomposition.PCA类来讲解如何使用scikit-learn进行PCA降维。PCA类基本不需要调参,一般来说,我们只需要指定要降维到的维度,或者希望降维后主成分的方差和占原始维度所有特征方差和的比例阈值就可以了。

现在我们介绍一下sklearn.decomposition.PCA的主要参数:

    1. n_components:这个参数指定了希望PCA降维后的特征维度数目。最常用的做法是直接指定降维到的维度数目,此时n_components是一个大于等于1的整数。当然,我们也可以指定主成分的方差和所占的最小比例阈值,让PCA类自己去根据样本特征方差来决定降维到的维度数,此时n_components是一个(0,1]之间的浮点数。当然,我们还可以将参数设置为"mle",此时PCA类会用MLE算法根据特征的方差分布情况自己去选择一定数量的主成分特征来降维。我们也可以使用默认值,即不输入n_components,此时n_components=min(样本数,特征数)。
    1. whiten:判断是否进行白化。所谓白化,就是对降维后的数据的每个特征进行归一化,让方差都为1。对于PCA降维本身来说,一般不需要白化。如果在PCA降维后有后续的数据处理动作,可以考虑白化。默认值是False,即不进行白化。
    1. 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算法来降维。一般来说,使用默认值就够了。

除了这些输入参数外,有两个PCA类的成员值得关注。第一个是explained_variance_,它代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分。第二个是explained_variance_ratio_,它代表降维后的各主成分的方差值占总方差值的比例,这个比例越大,则越是重要的主成分。

三、实验环境

Python 3.9

Anaconda 4

Jupyter Notebook

四、实验内容

本实验介绍了主成分分析算法PCA并以实例验证

五、实验步骤

1.数据准备

1.导入所需的模块

import numpy as np  
import matplotlib.pyplot as plt  
import seaborn as sns;sns.set()
%matplotlib inline  

2.构建示例数据

#创建随机数生成器  
rng=np.random.RandomState(1)  
X=np.dot(rng.rand(2,2),rng.randn(2,200)).T  
  
plt.scatter(X[:,0],X[:,1])  
plt.axis("equal") 

在这里插入图片描述

如上所示,第一组示例数据为一组样本量为200的随机的二维数组

2.PCA分析

1.导入 Scikit-Learn 中用于主成分分析的 PCA 模块,构建一个主成分分析模型对象,并进行训练。在这次构建中,我们设定 PCA 函数的参数 n_components 为2,这意味这我们将得到特征值最大的两个特征向量

from sklearn.decomposition import PCA  
pca=PCA(n_components=2)  
#使用fit()方法拟合模型  
pca.fit(X)  

在这里插入图片描述

n_components参数表示PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n

2.模型训练完成后, components_ 属性可以查看主成分分解的特征向量:

print(pca.components_) 

在这里插入图片描述

3.使用.shape方法查看矩阵形状

pca.components_.shape  

在这里插入图片描述

4.使用type()方法查看pca.components_类型

type(pca.components_)  

在这里插入图片描述

3.查看主成分的解释能力

1.explained_variance_代表降维后的各主成分的方差值。方差值越大,则说明越是重要的主成分

pca.explained_variance_  

在这里插入图片描述

4.主成分轴(Principal Axes)的可视化

1.我们可以通过如下方式将主成分分析中的特征向量描绘出来,下图中向量的起点为样本数据的均值

def draw_vector(v0,v1,ax=None):  
    ax = ax or plt.gca()  
    arrowprops=dict(linewidth=2,shrinkA=0,shrinkB=0)  
    ax.annotate('',v1,v0,arrowprops=arrowprops)  
#描绘数据  
plt.scatter(X[:,0],X[:,1],alpha=0.2)  
  
for length,vector in zip(pca.explained_variance_,pca.components_):  
    v = vector * 3 * np.sqrt(length)  
    draw_vector(pca.mean_,pca.mean_ + v)  
      
plt.axis('equal')

在这里插入图片描述

5.基于PCA的降维

1.将n_components设置为1,并使用fit()方法进行拟合

pca=PCA(n_components=1)  
pca.fit(X)

在这里插入图片描述

6.降维处理

1.将数据X转换成降维后的数据X_pca,并打印X和X_pca的矩阵形状

X_pca=pca.transform(X)  
  
print("original shape:",X.shape)  
print("transformed shape:",X_pca.shape)

在这里插入图片描述

2.使用切片打印X的前十项

X[:10]

在这里插入图片描述

3.使用切片打印X_pca的前十项

X_pca[:10]

在这里插入图片描述

7.PCA逆向处理

1.将降维后的数据转换成原始数据

X_new=pca.inverse_transform(X_pca)  
#描绘数据  
plt.scatter(X[:,0],X[:,1],alpha=0.2)  
plt.scatter(X_new[:,0],X_new[:,1],alpha=0.8)  
plt.axis('equal')  

8.使用digits.data训练PCA模型并将结果可视化

1.导入sklearn.datasets模块中的load_digits函数

from sklearn.datasets import load_digits  
digits=load_digits()  
#查看digits.data的矩阵形状  
digits.data.shape  

在这里插入图片描述

2.使用digits.data训练PCA模型并将结果可视化

pca=PCA().fit(digits.data)  
plt.plot(np.cumsum(pca.explained_variance_ratio_))  
plt.xlabel("number of components")  
plt.ylabel("cumlative explained variance") 

在这里插入图片描述


总结

主成分分析算法(Principal Component Analysis, PCA)的目的是找到能用较少信息描述数据集的特征组合。它意在发现彼此之间没有相关性、能够描述数据集的特征,确切说这些特征的方差跟整体方差没有多大差距,这样的特征也被称为主成分。这也就意味着,借助这种方法,就能通过更少的特征捕获到数据集的大部分信息。

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

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

相关文章

JavaWeb--HTTP

HTTP1 简介2 请求数据格式2.1 格式介绍3 响应数据格式3.1 格式介绍3.2 响应状态码3.2.1状态码大类3.2.2常见的响应状态码3.3 自定义服务器目标: 理解HTTP协议和HTTP请求与响应数据的格式 1 简介 HTTP概念 HyperText Transfer Protocol,超文本传输协议&a…

造成android UI卡顿的原因及解决方法

Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次。如果UI线程的执行时间超过16ms,则会产生丢帧…

JavaSE08-运算符

文章目录一、算术运算符1.字符参与运算2.字符串参与 运算二、赋值运算符三、自增自减运算符四、比较运算符五、逻辑运算符六、三元运算符算术运算符、赋值运算符、自增自减运算符、比较运算符、逻辑运算符、三元运算符一、算术运算符 1.字符参与运算 char类型参与算术运算&…

Jmeter使用教程

目录一,简介二,Jmeter安装1,下载2,安装三,创建测试1,创建线程组2,创建HTTP请求默认值3,创建HTTP请求4,添加HTTP请求头5,添加断言6,添加查看结果树…

BoostSearcher搜索引擎项目

BoostSearcher搜索引擎项目 1.BoostSearcher这个项目是什么? 答:一个为Boost文档建立索引的站内搜索引擎,简单的说就是一个类似于csdn站内文档搜索框。 项目展示: gitee:https://gitee.com/zxlfx/boost-search-engine-project …

二叉树——堆

一,树的概念及结构 1.树 4.结点的度:一个节点含有子树的个数称为该结点的度;如:A 的度为6. 5.叶节点或终端节点:度为0的节点称为叶节点;如:B 6.非终端结点或分支节点:度部位0的结…

【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

每日一题——L1-085 试试手气(15)

L1-085 试试手气 我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:…

【Java8】

1、接口中默认方法修饰为普通方法 在jdk8之前,interface之中可以定义变量和方法,变量必须是public、static、final的,方法必须是public、abstract的,由于这些修饰符都是默认的。 接口定义方法: public抽象方法需要子类实现 接口定…

TCP报文详解

目录 🐇今日良言:但尽全力,且让心安 🐼一、TCP协议特点 🐳二、TCP协议段格式 🐯三、TCP的10个核心机制 🐝四、三次握手和四次挥手 🐇今日良言:但尽全力,且让心安 🐼一、TCP协议特点 TCP :Tr…

OAuth 2.0 认证和攻击面

0x00 前提 最近在测试公司的 oauth 认证方面的问题,要再去熟悉一下这块,所以把这块写一下。 0x01 OAuth2.0 概念 OAuth是一个关于授权(authorization)的开放网络标准,目前是最常见最通用的一个授权协议。 什么地方…

uni-app:获取当前经纬度解决方案+如何布置全局组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.布置全局组件 在我们开发的过程中,会碰到一个现象,就是在页面里面引入组件,总算要写import,components才能引用,这里给大家分享我们的一个…

JavaWeb--Tomcat

Tomcat1 简介1.1 什么是Web服务器2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件目标: 掌握Tomcat的使用掌握在IDEA中使用To…

CMake模块的使用和自定义模块

CMake模块的使用和自定义模块一、前言二、使用Find模块2.1、准备工作2.2、添加头文件路径和库文件2.3、< name >_FOUND 来控制工程特性三、编写自定义的Find模块3.1、 准备工作3.2、cmake 模块3.3、使用自定义的FindHELLO 模块构建工程3.4、如果没有找到hello library四、…

备战金三银四,熬夜半个月汇集大厂 Java 岗 1600 页面试真题

如果你不停地加班。却很少冒险&#xff0c;也很少学习&#xff0c;那你极大可能会陷入到内卷中。 为什么这么说呢&#xff1f;我们先来捋清楚「内卷」的概念&#xff1a; 「内卷化」简而言之就是&#xff1a;日复一日&#xff0c;越混越掉坑里。 所谓内卷化&#xff0c;指一种…

CHAPTER 2 Web Server - nginx 功能示例

nginx功能示例2.1 Nginx反向代理-示例1. 配置nginx.conf2. 配置访问机器的hosts3. 访问网址4. 遗留问题2.2 Nginx负载均衡-详解及示例2.2.1 负载均衡配置参数简介1. upstream模块简介2. 负载均衡算法简介2.2.2 示例演示1. 修改配置文件2. 示例效果2.3 Nginx动静分离-示例1. 修改…

【华为OD机试模拟题】用 C++ 实现 - 任务调度(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

【电路设计】常见电路及相关解释

前言 在接触电路设计过程中&#xff0c;往往需要用到一些常见的电路&#xff0c;但是临时查找又太浪费时间&#xff0c;因此&#xff0c;想总结一些常见电路的分析方式。 1 RC电路充放电公式 一般的RC电路如下图所示。 其充放电公式如下所示。 VtV0(V1−V0)(1−e−tRC)tRCln…