pca降维

news2024/11/18 17:50:52

两个矩阵相乘的意义是将右边矩阵中的每一列向量 ai 变换到左边矩阵中以每一行行向量为基所表示的空间中去

选择不同的基可以对同样一组数据给出不同的表示,如果基的数量少于向量本身的维数,则可以达到降维的效果。

将一组 N 维向量降为 K 维,其目标是选择 K 个单位正交基,使得原始数据变换到这组基上后,各变量两两间协方差为 0(保证两个变量是不相关的),而变量方差则尽可能大(在正交的约束下,取最大的 K 个方差)。

                                                          

具体原理:【机器学习】降维——PCA(非常详细) - 知乎 (zhihu.com)

import matplotlib.pyplot as plt
#导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import numpy as np
#2.提取数据集
iris = load_iris()
y = iris.target
X = iris.data
print('鸢尾花的种类',iris.target_names)

print('数据的维度',X.shape)
pca = PCA(n_components=2) #实例化
pca = pca.fit(X) #拟合模型
X_dr = pca.transform(X) #获取新矩阵
print('降维后数据的维度',X_dr.shape)

#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
print('查看降维后每个新特征向量上所带的信息量大小',pca.explained_variance_)
# 属性explained_variance_ratio_,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 .又叫做可解释方差贡献率
print('查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比',pca.explained_variance_ratio_)
#整个降维后的特征向量所带的所有信息在原始总信息量上的占比。
print('降维后的特征向量所带的所有信息在原始总信息量上的占比',pca.explained_variance_ratio_.sum())

import matplotlib.pyplot as plt
#导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import numpy as np
#2.提取数据集
iris = load_iris()
y = iris.target
X = iris.data
print('鸢尾花的种类',iris.target_names)

print('数据的维度',X.shape)
# 选择最好的n_components:累积可解释方差贡献率曲线
# 累积可解释方差贡献率曲线是一条以降维后保留的特征个数为横坐标,降维后新特征矩阵捕捉到的可解释方差贡献率为纵坐标的曲线,能够帮助我们决定n_components最好的取值
pca=PCA().fit(X)
plt.plot([1,2,3,4],np.cumsum(pca.explained_variance_ratio_))
plt.xticks([1,2,3,4]) #这是为了限制坐标轴显示为整数
plt.xlabel('number of components after dimension reduction')
plt.ylabel('cumulative explained variance ratio')
plt.show()

 

 按信息量占比选超参数

import matplotlib.pyplot as plt
#导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import numpy as np
#2.提取数据集
iris = load_iris()
y = iris.target
X = iris.data
print('鸢尾花的种类',iris.target_names)

print('数据的维度',X.shape)
pca = PCA(n_components=0.93) #实例化
pca = pca.fit(X) #拟合模型
X_dr = pca.transform(X) #获取新矩阵
print('降维后数据的维度',X_dr.shape)

#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
print('查看降维后每个新特征向量上所带的信息量大小',pca.explained_variance_)
# 属性explained_variance_ratio_,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 .又叫做可解释方差贡献率
print('查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比',pca.explained_variance_ratio_)
#整个降维后的特征向量所带的所有信息在原始总信息量上的占比。
print('降维后的特征向量所带的所有信息在原始总信息量上的占比',pca.explained_variance_ratio_.sum())

 人脸图像的降维

import matplotlib.pyplot as plt
#fetch_lfw_people数据为7个人的1000多张照片组成的人脸数据
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import numpy as np
#2.提取数据集
#min_faces_per_person=60每个人最少需要的脸图
faces = fetch_lfw_people(min_faces_per_person=20)
y = faces.target
X = faces.data
print('人脸的类别',faces.target_names)

#原始数据的可视化
for i in range(1,21):
    plt.subplot(4,5,i)
    data=X[i]
    image=data.reshape(62,47)
    plt.imshow(image,cmap='gray')
plt.show()

print('数据的维度',X.shape)
pca = PCA(n_components=196) #实例化
pca = pca.fit(X) #拟合模型
X_dr = pca.transform(X) #获取新矩阵
print('降维后数据的维度',X_dr.shape)

V = pca.components_
print('新特征空间',V.shape)
x1=np.dot(X,V[:196,:].T)
print('手工降维',x1.shape)
print('判断手工降维和Pca降维',x1==X_dr)

##新特征空间可视化
for i in range(1,21):
    plt.subplot(4,5,i)
    data=V[i]
    image=data.reshape(62,47)
    plt.imshow(image,cmap='gray')
plt.show()

#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
print('查看降维后每个新特征向量上所带的信息量大小',pca.explained_variance_)
# 属性explained_variance_ratio_,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 .又叫做可解释方差贡献率
print('查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比',pca.explained_variance_ratio_)
#整个降维后的特征向量所带的所有信息在原始总信息量上的占比。
print('降维后的特征向量所带的所有信息在原始总信息量上的占比',pca.explained_variance_ratio_.sum())

 

 inverse_transform 实现图像的降噪

 降维的目的之一就是希望抛弃掉对模型带来负面影响的特征,而我们相信,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带的信息应该不会在PCA过程中被大量抛弃。inverse_transform能够在不恢复原始数据的情况下,将降维后的数据返回到原本的高维空间,即是说能够实现”保证维度,但去掉方差很小特征所带的信息“。

import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import numpy as np
from sklearn.datasets import load_digits
rng = np.random.RandomState(1218)
digits = load_digits()
data=digits.data
label=digits.target

print('数据的维度',data.shape)
print('数据的类别',set(digits.target.tolist()))

# 原始数据的可视化
for i in range(1,21):
    plt.subplot(4,5,i)
    image=data[i].reshape(8,8)
    plt.imshow(image,cmap='gray')
plt.show()

noisy = np.random.normal(0,2,data.shape)
print(noisy.mean())
print(noisy.std())
noisy=data+noisy
#噪声数据可视化
for i in range(1,21):
    plt.subplot(4,5,i)
    image=noisy[i].reshape(8,8)
    plt.imshow(image,cmap='gray')
plt.show()

#模型实例化并拟合
pca=PCA(0.9,svd_solver='full').fit(noisy)

X_dr=pca.transform(noisy)
print('降维后的维度',X_dr.shape)

# 逆转降维结果,实现降噪
data=pca.inverse_transform(X_dr)
print('逆转后的结果',data.shape)

#降噪后的结果可视化
for i in range(1,21):
    plt.subplot(4,5,i)
    image=noisy[i].reshape(8,8)
    plt.imshow(image,cmap='gray')
plt.show()

#属性explained_variance_,查看降维后每个新特征向量上所带的信息量大小(可解释性方差的大小)
print('查看降维后每个新特征向量上所带的信息量大小',pca.explained_variance_)
# 属性explained_variance_ratio_,查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比 .又叫做可解释方差贡献率
print('查看降维后每个新特征向量所占的信息量占原始数据总信息量的百分比',pca.explained_variance_ratio_)
#整个降维后的特征向量所带的所有信息在原始总信息量上的占比。
print('降维后的特征向量所带的所有信息在原始总信息量上的占比',pca.explained_variance_ratio_.sum())

参考文献

【机器学习】降维——PCA(非常详细) - 知乎 (zhihu.com)

机器学习-Sklearn-04(降维算法PCA和SVD)_Henrik698的博客-CSDN博客_explained_variance_ratio_

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

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

相关文章

SpringCloud-Ribbon负载均衡

关于Ribbon负载均衡 1.什么是Ribbon Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。 简单的说,Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix的中间层服务连接在一起。…

智慧工地管理系统解决方案厂商-喜讯科技

智慧工地是建筑行业管理结合互联网的一种新的管理系统,应用最新的大数据、云计算和物联网的技术,对施工现场的人、机、料、法、环等资源进行集中管理,以可控化、数据化以及可视化的智能系统对项目管理进行全方位立体化的实时监管。 喜讯科技智…

elasticsearch8.5体验(docker部署)

服务部署 拉取elasticsearch镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.5.0拉取kibana镜像 docker pull docker.elastic.co/kibana/kibana:8.5.0创建docker网络 docker network create elastic启动elasticsearch docker run --name es01 --net el…

使用固定的公网TCP端口地址远程桌面【内网穿透】

文章目录1. 为远程桌面保留一个TCP地址2. 配置远程桌面隧道2.1 登录cpolar web ui2.2 修改远程桌面隧道信息2.3 查看公网地址3. 使用固定TCP地址远程桌面总结在上一篇文章中,我们通过cpolar映射远程桌面3389端口,成功实现了在外远程桌面控制家里/公司的W…

万字干货|Synchronized关键字详解

文章目录前言线程安全什么是synchronized关键字?synchronized实现方式1.修饰实例方法2.修饰静态方法3.修饰代码块synchronized关键字底层原理synchronized修饰实例方法monitor锁是什么?Java对象内存布局synchronized修饰代码块锁优化自旋锁锁粗化锁消除锁…

服务器硬件规格常用查看命令——通用命令

1. lshw 使用lshw命令可以查看服务器硬件配置的详细信息。使用它可以在支持DMI的x86或IA-64系统以及某些PowerPC机器上打印内存配置、固件版本、主板配置、CPU版本、G4可以工作)。目前该命令支持 CPU频率、缓存、总线速度等信息(已知PowerMac DMI&#…

[附源码]JAVA毕业设计同德佳苑物业信息(系统+LW)

[附源码]JAVA毕业设计同德佳苑物业信息(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术…

Java正则表达式

Java正则表达式正则表达式概述、初体验正则表达式的匹配规则正则表达式的常见案例正则表达式在方法中的应用正则表达式爬取信息正则表达式概述、初体验 正则表示: 正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性。 正则表达式初…

为远程群辉NAS配置固定二级子域名【内网穿透】

由于使用免费的cpolar内网穿透,所生成的公网地址为随机临时的公网地址,24小时内会发生变化。对于需要长期访问的用户来讲,我们可以为其配置固定的二级子域名,同时提高带宽,实现更为高效流畅的访问。 配置固定的二级子…

β-1,3-D-葡聚糖修饰仿生中空二氧化硅复合粒子|葡聚糖修饰BiO2-x纳米片

β-1,3-D-葡聚糖修饰仿生中空二氧化硅复合粒子|葡聚糖修饰BiO2-x纳米片 中文名称:β-1,3-D-葡聚糖修饰仿生中空二氧化硅复合粒子 产品描述:仿生中空二氧化硅粒子和β1,3D葡聚糖经过偶联反应后得到;其中,仿生中空二氧化硅粒子的纳米传输孔道的孔径范…

AT8637S(PHS/EN输入接口单通道0.8A低压H桥IC)

描述 AT8637S为摄像机、消费类产品、玩具和其它低电压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。AT8637/AT8637S能够驱动一个直流电机或其他诸如螺线管的器件。输出驱动模块由N MOS功率管构成的H桥组成,以驱动电机绕组。AT8637/AT8637S 能够…

[附源码]Python计算机毕业设计SSM基于响应式交友网站(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

大数据开发要学Java框架吗?

大数据开发要学Java框架吗?学习大数据要去学习Java而且还要精通,不仅要掌握Java基础知识还要掌握一些核心的Java架构。从java基础开始,学习大数据开发过程中必备的离线数据分析、实时数据分析和内存数据计算等,掌握大数据体系中几乎所有的核心…

(八)Vue之计算属性

文章目录插值语法实现methods实现计算属性实现计算属性简写Vue学习目录 上一篇:(七)Vue之事件处理 先看一个需求:提供两个输入框,一个输入姓,一个输入名,在下面展示全名。 插值语法实现 页…

vue3中的四种插槽的介绍-保证让你看看的明明白白!

插槽 当组件中只有一个插槽的时候,我们可以不设置 slot 的 name 属性。 v-slot 后可以不带参数,但是 v-slot 在没有设置 name 属性的时候, 插槽口会默认为“default”。 插槽主要是在封装组件的时候去使用 注意点:v-slot 只能添加…

【操作系统】操作系统硬件组成和进程

硬件组成体系结构 1.为什么要学操作系统 从操作系统-网络-应用程序-存储等多方面诊断和优化。比如:接口突然响应慢、服务器内存、CPU占用率高、Redis、MySQL查询慢,怎末排查问题。 2.性能优化诊断方法论 (1)围绕两个点&#x…

第12章 初识消息队列(MessageQueuing)

1 Redis分布式缓存数据库结合“StackExchange.Redis”中间件实现消息队列(MessageQueuing) Redis分布式缓存数据库消息队列(MessageQueuing)队列的实现模式有: 1、【生产(Producter)】--【消费(Worker)】模式。 变种模式:【基于异步消息队列List lpush-b…

Zabbix部署agent2

客户端提前部署好 下载rpm环境 http://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-agent2-5.0.2-1.el7.x86_64.rpm安装 [rootvpn_server opt]# yum localinstall zabbix-agent2-5.0.2-1.el7.x86_64.rpm -y# 修改配置⽂件,启动zabbix-agent2# 在zabbix-serve…

代码随想录第二天

专题:数组 题目:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 2: 输入:nums [-7,-3,2,3,11] 输出:[4,9,9,…

[附源码]JAVA毕业设计外卖点餐系统(系统+LW)

[附源码]JAVA毕业设计外卖点餐系统(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…