sklearn降维算法1 - 降维思想与PCA实现

news/2024/5/20 8:05:18/文章来源:https://blog.csdn.net/Sun123234/article/details/128857480

目录

    • 1、概述
      • 1.1 维度概念
    • 2、PCA与SVD
      • 2.1 降维实现
      • 2.2 重要参数n_components
        • 2.2.1 案例:高维数据的可视化
        • 2.2.2 最大似然估计自选超参数
        • 2.2.3 按信息量占比选超参数

1、概述

1.1 维度概念

shape返回的结果,几维几个方括号嵌套
在这里插入图片描述
特征矩阵特指二维的
一般来说,维度指的是样本的数量或特征的数量
降维算法,指降低特征矩阵中特征的数量。降维是为了让算法运算能更快,效果更好,但还有一种需求:数据可视化(三维以上的无法可视化)

sklearn中降维算法被包括在模块decomposition中,这是一个矩阵分解模块
在这里插入图片描述
在这里插入图片描述
SVD和主成分分析PCA属于矩阵分解算法中的入门算法,都是通过分解特征矩阵来降维。

2、PCA与SVD

特征选择方法:方差过滤。
如果一个特征的方差很小,则意味着这个特征上很可能有大量取值都相同(比如90%都是1,只有10%是0,甚至100%是1),那这一个特征的取值对样本而言就没有区分度,这种特征就不带有有效信息。从方差的这种应用就可以推断出,如果一个特征的方差很大,则说明这个特征上带有大量的信息。
因此,在降维中,PCA使用的信息量衡量指标,就是样本方差,又称可解释性方差,方差越大,特征所带的信息量越多。

在这里插入图片描述
问:方差计算公式中为什么除数是n-1?
答:这是为了得到样本方差的无偏估计

2.1 降维实现

sklearn.decomposition.PCA

举一个栗子:
原数据,特征x1和x2,三个样本点,在二维平面中可以作图出来,现在每个数据特征的均值是2,方差计算出来为1

目标:进行降维,只用一个一个特征向量来描述这组数据,即将二维数据降为一维数据,并且尽可能地保留信息量,即让数据的总方差尽量靠近2。于是,我们将原本的直角坐标系逆时针旋转45°,形成了新的特征向量x1和x2

新数据:x2上的数值此时都变成了0,因此x2明显不带有任何有效信息了(此时x2的方差也为0了)。此时,x1特征上方差为2

结果:根据信息含量的排序,取信息含量最大的一个特征,因为我们想要的是一维数据。所以我们可以将x2删除,同时也删除图中的x2特征向量,剩下的x1*就代表了曾经需要两个特征来代表的三个样本点。
通过旋转原有特征向量组成的坐标轴来找到新特征向量和新坐标平面,我们将三个样本点的信息压缩到了一条直线上,实现了二维变一维,并且尽量保留原始数据的信息。一个成功的降维,就实现了。
在这里插入图片描述
将二维特征矩阵进行推广:
二维特征矩阵:

  1. 输入原数据,结构为 (3,2) 找出原本的2个特征对应的直角坐标系,本质是找出这2个特征构成的2维平面
  2. 决定降维后的特征数量:1
  3. 旋转,找出一个新坐标系。新特征向量让数据能够被压缩到少数特征上,并且总信息量不损失太多
  4. 找出数据点在新坐标系上,2个新坐标轴上的坐标
  5. 选取第1个方差最大的特征向量,删掉没有被选中的特征,成功将2维平面降为1维

n维特征矩阵:

  1. 输入原数据,结构为 (m,n) 找出原本的n个特征向量构成的n维空间V
  2. 决定降维后的特征数量:k
  3. 通过某种变化,找出n个新的特征向量,以及它们构成的新n维空间V
  4. 找出原始数据在新特征空间V中的n个新特征向量上对应的值,即“将数据映射到新空间中”
  5. 选取前k个信息量最大的特征,删掉没有被选中的特征,成功将n维空间V降为k维

五步骤:原数据特征 - 降维数 - 变换成新特征空间 - 数据映射到新空间 - 按信息量排序,取前k个

步骤3中,变化找到新特征向量,让数据能够被压缩到少数特征上并且总信息量不损失太多的技术就是矩阵分解

PCA和SVD比较
PCA和SVD是两种不同的降维算法,但他们都遵从上面的过程来实现降维,只是两种算法中矩阵分解的方法不同,信息量的衡量指标不同罢了。

PCA使用方差作为信息量的衡量指标,并且特征值分解来找出空间V。降维完成之后,PCA找到的每个新特征向量就叫做“主成分”,而被丢弃的特征向量被认为信息量很少,这些信息很可能就是噪音。

而SVD使用奇异值分解来找出空间V,其中Σ也是一个对角矩阵,不过它对角线上的元素是奇异值

问题:
无论是PCA和SVD都需要遍历所有的特征和样本来计算信息量指标。并且在矩阵分解的过程之中,会产生比原来的特征矩阵更大的矩阵
无论是Python还是R,或者其他的任何语言,在大型矩阵运算上都不是特别擅长,无论代码如何简化,我们不可避免地要等待计算机去完成这个非常庞大的数学计算过程。因此,降维算法的计算量很大运行比较缓慢,但无论如何,它们的功能无可替代

PCA和特征选择都是特征工程的一部分,两者区别?

答:特征工程中有三种方式:特征提取,特征创造和特征选择。
特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,我们依然知道这个特征在原数据的哪个位置,代表着原数据上的什么含义。
而PCA,是将已存在的特征进行压缩,降维完毕后的特征不是原本的特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。通常来说,在新的特征矩阵生成之前,我们无法知晓PCA都建立了怎样的新特征向量,新特征矩阵生成之后也不具有可读性,我们无法判断新特征矩阵的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义了。以PCA为代表的降维算法因此是特征创造的一种。
PCA一般不适用于探索特征和标签之间的关系的模型(如线性回归),因为无法解释的新特征和标签之间的关系不具有意义。在线性回归模型中,我们使用特征选择。

2.2 重要参数n_components

n_components是我们降维后需要的维度,即降维后需要保留的特征数量K,
[0, min(X.shape)]范围中的整数

问题:
如果留下的特征太多,就达不到降维的效果,如果留下的特征太少,那新特征向量可能无法容纳原始数据集中的大部分信息,因此,n_components既不能太大也不能太小
解决:如果降维目标是可视化,希望可视化一组数据来观察数据分布,我们往往将数据降到三维以下,很多时候是二维,即n_components的取值为2。

2.2.1 案例:高维数据的可视化

可视化:至少要降维到3维
1,导模块

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris #鸢尾花数据
from sklearn.decomposition import PCA

2,数据了解

iris = load_iris()
y = iris.target
x = iris.data
x.shape  #(150,4)-150条样本,4个特征,4维度
import pandas as pd
pd.DataFrame(x)

在这里插入图片描述
y的输出,三种可能
3,降维:

#调用PCA
pca = PCA(n_components=2) #实例化
pca = pca.fit(x) #拟合模型
x_dr = pca.transform(x) #获取新矩阵
x_dr.shape  #输出(150,2)降维到了2维#fit_transform一步到位
#x_dr = PCA(2).fit_transform(x)

4,可视化
对于得到的x_dr
在这里插入图片描述

x_dr[y==0,0]#取出标签为0的记录的,第一列的数据

在这里插入图片描述

plt.figure() #要画图,给一个画布
plt.scatter(x_dr[y==0,0],x_dr[y==0,1],c=c="red", label=iris.target_names[0]) #标签为0的数据,散点图x提供横纵坐标,y表现不同颜色
#iris.target_names特征名字
plt.scatter(X_dr[y==1, 0], X_dr[y==1, 1], c="black", label=iris.target_names[1])
plt.scatter(X_dr[y==2, 0], X_dr[y==2, 1], c="orange", label=iris.target_names[2])plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

在这里插入图片描述
上面的作图代码,可以用for循环实现一下:
对数据,名字,颜色都循环

colors = ['red','black', 'orange']plt.figure()
foriin [0, 1, 2]:plt.scatter(X_dr[y == i, 0],X_dr[y == i, 1],alpha=.7  #颜色透明度,c=colors[i],label=iris.target_names[i]               )
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

鸢尾花数据集,是一个明显的分簇分布。一个有很好效果的数据集

5,探索降维后数据:
explained_variance_,查看降维后每个新特征向量上所带的信息量大小

#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)pca.explained_variance_

在这里插入图片描述
降维后剩下的x1和x2,所以返回了这两个的方差

explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比

#属性explained_variance_ratio,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比#又叫做可解释方差贡献率
pca.explained_variance_ratio_
#大部分信息都被有效地集中在了第一个特征上

在这里插入图片描述
结果显示,原始总信息的92%在新特征x1上,原始总信息的5%在新特征x2上

pca.explained_variance_ratio_.sum() 

输出97.76%,说明原始信息的97%都留在了新特征上。特征减掉了两个,而信息损失不到3%。–PCA效果好

6,选择最好的n_components:累积可解释方差贡献率曲线

累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值。

当参数n_components中不填写任何值,则默认返回min(X.shape)个特征,可以画出累计可解释方差贡献率曲线

pca_line = PCA().fit(X)
pca_line.explained_variance_ratio_

在这里插入图片描述
返回的是,每个特征带有的原始信息的占比

import numpy as np
np.cumsum(pca_line.explained_variance_ratio_) #返回的是累加
import numpy as np
pca_line = PCA().fit(X)
plt.plot([1,2,3,4],np.cumsum(pca_line.explained_variance_ratio_))
#上面的[1,2,3,4]是x的取值,不写,会自动写入坐标
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

在这里插入图片描述
找图像中的转折点

2.2.2 最大似然估计自选超参数

除了输入整数,n_components还有哪些选择呢?
PCA可以用最大似然估计(maximum likelihood estimation)自选超参数的方法,输入“mle”作为n_components的参数输入,就可以调用这种方法。

pca_mle = PCA(n_components="mle")
pca_mle = pca_mle.fit(X)
X_mle = pca_mle.transform(X)X_mle #自动选择了三列特征

在这里插入图片描述

pca_mle.explained_variance_ratio_.sum()
#0.994
#得到了比设定2个特征时更高的信息含量,对于鸢尾花这个很小的数据集来说,3个特征对应这么高的信息含量,并不需要去纠结于只保留2个特征,毕竟三个特征也可以可视化

2.2.3 按信息量占比选超参数

输入[0,1]之间的浮点数,并且让参数svd_solver ==‘full’,表示希望降维后的总解释性方差占比大于n_components 指定的百分比,即是说,希望保留百分之多少的信息量。

比如说,如果我们希望保留97%的信息量,就可以输入
n_components = 0.97,PCA会自动选出能够让保留的信息量超过97%的特征数量。

pca_f = PCA(n_components=0.97,svd_solver="full") #帮忙选出总信息占比超过97%的特征
pca_f = pca_f.fit(X)
X_f = pca_f.transform(X)
X_f #自动选择了两维

在这里插入图片描述

pca_f.explained_variance_ratio_  #[0.92,0.053]pca_f.explained_variance_ratio_.sum() #0.97

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

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

相关文章

truffle 创建测试合约并部署到测试网络

1、npm 安装truffle npm install -g truffle2、创建truffle项目 mkdir imooc-on-blockchain-truffle && cd imooc-on-blockchain-truffle3、初始化truffle目录,会生成如下几个目录 contracts 存放.sol合约文件migrations 部署脚本目录test 测试文件目录t…

【GlobalMapper精品教程】045:空间分析工具(2)——相交

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述相交工具的使用。 文章目录 一、实验数据二、符号化设置三、相交运算四、结果展示五、心灵感悟一、实验数据 加载配套实验数据(…

分布式之分布式事务V2

写在前面 本文一起来看下分布式环境下的事务问题,即我们经常听到的分布式事务问题。想要解决分布式事务问题,需要使用到分布式事务相关的协议,主要有2PC即两阶段提交协议,TCC(try-confirm-cancel)&#xf…

html的表单标签(form)

目录标题1、表单标签主要有三大类:2、表单标签中常见的属性3、例子代码及结果4、注意:5、表单中特殊的属性表单标签可以用来数据交互,而前面学的六个标签只能发送不能接收。 表单标签的作用就是数据交互1、表单标签主要有三大类: …

ImageMagick任意文件读取漏洞(CVE-2022-44268)

0x00 前提 前几天爆出一个 ImageMagick 漏洞 ,可以造成一个任意文件读取的危害比较可观,最近有时间来复现学习一下 主要是影响的范围很大,很多地方都有这个问题,需要来学习一下 0x01 介绍 ImageMagick 是一个免费的开源软件套…

SpringMVC:拦截器(12)

拦截器1. 拦截器概念2. 拦截器入门案例2.1 环境准备2.2 拦截器开发步骤1: 创建拦截器类步骤2: 配置拦截器类步骤3: SpringMVC添加SpringMvcSupport包扫描和interceptor包扫描步骤4: 简化SpringMvcSupport的编写5 测试3. 拦截器参数解析(了解)3.1 前置处理…

【Call for papers】SIGCOMM-2023(CCF-A/计算机网络/2023年2月15日截稿)

ACM SIGCOMM is the flagship annual conference of the ACM Special Interest Group on Data Communication (SIGCOMM). ACM SIGCOMM 2023, the 37th edition of the conference series, will be held in New York City, US, September 10 - 14, 2023. 文章目录1.会议信息2.时…

Redis集群搭建(主从、哨兵、分片)

1.单机安装Redis 首先需要安装Redis所需要的依赖: yum install -y gcc tcl然后将课前资料提供的Redis安装包上传到虚拟机的任意目录: 例如,我放到了/tmp目录: 解压缩: tar -xzf redis-6.2.4.tar.gz解压后&#xff1…

OpenPPL PPQ量化(5):执行引擎 源码剖析

目录 PPQ Graph Executor(PPQ 执行引擎) PPQ Backend Functions(PPQ 算子库) PPQ Executor(PPQ 执行引擎) Quantize Delegate (量化代理函数) Usage (用法示例) Hook (执行钩子函数) 前面四篇博客其实就讲了下面两行代码: ppq_ir load_onnx_graph(onnx_impor…

FlinkCEP - Flink的复杂事件处理

版本说明 本文中以Flink 1.16.1 版本讲解说明 Note:Flink1.16.1版本相较于之前版本增强的within函数, 支持模式序列中相邻事件间的超时定义,以前版本只支持模式序列中第一个事件到最后一个事件之间的最大时间间隔。 快速开始 基于Kafka connecter 流…

《计算机组成与设计》01. 计算机抽象及相关技术

文章目录计算机体系结构中的 8 个伟大思想面向摩尔定律的设计使用抽象简化设计加速经常性事件通过并行提高性能通过流水线提高性能存储层次通过冗余提高可靠性性能性能的度量时钟周期数和时钟周期长度与CPU时间的公式指令性能公式经典的 CPU 性能公式CPI 计算公式程序执行时间计…

【前端】Vue项目:旅游App-(23)detail:房东介绍、热门评论、预定须知组件

文章目录目标过程与代码房东介绍landlord热门评论HotComment预定须知Book效果总代码修改或添加的文件detail.vuedetail-book.vuedetail-hotComment.vuedetail-landlord.vue参考本项目博客总结:【前端】Vue项目:旅游App-博客总结 目标 根据detail页面获…

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)

文章目录1. Sa-Token 介绍2. 登录认证2.1 登录与注销2.2 会话查询2.3 Token 查询3. 权限认证3.1 获取当前账号权限码集合3.2 权限校验3.3 角色校验4. 前后台分离(无Cookie模式)5. Sa-Token 集成 Redis6. SpringBoot 集成 Sa-Token6.1 创建项目6.2 添加依…

ChatGPT不是聊天机器人,是任何人值得重视的竞争对手。

ChatGPT使用了一种聊天界面来和用户互动,用户的理解成本降低,通过输入文字,来得到各种反馈。有预见性的创造者们,已经挖掘ChatGPT所展示出来的各种能力应该如何更好地融入我们的日常生活中。比如,生成菜谱、音乐播放列…

嵌入式开发----示波器入门

示波器入门前言一、示波器介绍关键指标工作原理二、功能按钮介绍三、一键入门四、 典型应用场景校准捕捉测试总线通讯总结前言 对于嵌入式工程师来说,示波器的使用极为重要,他就像是“电子工程师的眼睛”,把被测信号的实际波形显示在屏幕上&…

越界访问数组

越界访问是指访问&#xff08;操作修改&#xff09;了不属于自己的空间 我们以如下代码为例&#xff1a;此代码在vs中进行 #include <stdio.h> int main() {int i 0;int arr[] {1,2,3,4,5,6,7,8,9,10};for(i0; i<12; i){arr[i] 0;printf("hello\n");}r…

STM32单片机蓝牙APP可烘干升降晾衣架带照明灯

实践制作DIY- GC0123-蓝牙APP可烘干升降晾衣架 一、功能说明&#xff1a; 基于STM32单片机设计-蓝牙APP可烘干升降晾衣架 功能介绍&#xff1a; 硬件组成&#xff1a; STM32F103C系列最小系统单片机1个uln2003步进电机&#xff08;模拟升降&#xff09;1个uln2003步进电机&a…

python+django大学生成绩综合考评系统pycharm项目

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm 通常 一个Django model 对应一张数据表&#xff0c;model是以类的形式表现的 实现了ORM 对象…

第3章-进程同步、互斥与信号量(4)

进程同步、互斥与信号量 0 引言 操作系统的并发进程有些是独立的&#xff0c;有些需要相互协作。独立的进程在系统中执行时不受其他进程的影响&#xff0c;而另一些进程需要与其他进程共享数据&#xff0c;来完成共同的任务&#xff0c;这些进程之间具有协作关系。但我们要保…

C语言(通用函数qsort())

qsort()用于数组排序 void sqort(void *base,size_t nmemb,size_t size,int (*compar)(const void *,const void *)); 第一个参数&#xff1a;指向数组的指针 ANSI C允许把指向任何数据类型的指针强制转换成指向void的指针&#xff0c;因此&#xff0c;第一个参数可以引用任何…