机器学习(13)---降维实例

news2024/11/29 4:33:15

目录

  • 一、人脸识别降维
    • 1.1 查看原图
    • 1.2 降维后的图像
  • 二、迷你案例
    • 2.1 用人脸识别看PCA降维后的信息保存量
    • 2.2 噪音过滤
    • 2.3 手写数字降维(随机森林)
    • 2.4 手写数字降维(KNN)
    • 2.4 案例总结


一、人脸识别降维

1.1 查看原图

注意:无法加载fetch_lfw_people数据集的,请参考下面链接https://blog.csdn.net/m0_62881487/article/details/132797449

from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

# faces = fetch_lfw_people(min_faces_per_person=60)
# print(faces.data.shape)
faces = fetch_lfw_people(data_home = "D:\\Download\\",download_if_missing=False,min_faces_per_person=60)
X = faces.data
#print(faces.data.shape)     (1348,2914) 1348是图像的个数
#print(faces.images.shape)   (1348, 62, 47)返回数据图片个数,每个数据特征矩阵行和列


#subplots用来创建子图画布,前两个参数是说几行几列。 fig是画布,axes就是子图对象
fig, axes = plt.subplots(3,8
                         ,figsize=(8,4) #大小
                         ,subplot_kw = {"xticks":[],"yticks":[]} #不要显示坐标轴
                        )

#对axes对象进行处理
for i, ax in enumerate(axes.flat): #axes.flat后变成了一维
   ax.imshow(faces.images[i,:,:]  #索引为i的图,取出所有行和所有列,对应(1348, 62, 47)
             ,cmap="gray")
plt.show()

在这里插入图片描述

1.2 降维后的图像

pca = PCA(150).fit(X)
V = pca.components_
V.shape
fig, axes = plt.subplots(3,8,figsize=(8,4),subplot_kw = {"xticks":[],"yticks":[]})
for i, ax in enumerate(axes.flat):
    ax.imshow(V[i,:].reshape(62,47),cmap="gray")
plt.show()

在这里插入图片描述

二、迷你案例

2.1 用人脸识别看PCA降维后的信息保存量

 1. 代码块:

from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
faces = fetch_lfw_people(data_home = "D:\\Download\\",download_if_missing=False,min_faces_per_person=60)
X = faces.data
pca = PCA(150)
X_dr = pca.fit_transform(X)

X_inverse = pca.inverse_transform(X_dr)

fig, ax = plt.subplots(2,10,figsize=(10,2.5)
                       ,subplot_kw={"xticks":[],"yticks":[]}
                      )
for i in range(10):
    ax[0,i].imshow(faces.images[i,:,:],cmap="binary_r")
    ax[1,i].imshow(X_inverse[i].reshape(62,47),cmap="binary_r")
plt.show()

 2. 结论:可以明显看出,这两组数据可视化后,由降维后再通过inverse_transform转换回原维度的数据画出的图像和原数据画的图像大致相似,但原数据的图像明显更加清晰。这说明inverse_transform并没有实现数据的完全逆转。这是因为,在降维的时候,部分信息已经被舍弃了,X_dr中往往不会包含原数据100%的信息,所以在逆转的时候,即便维度升高,原数据中已经被舍弃的信息也不可能再回来了。所以,降维不是完全可逆的。

 Inverse_transform的功能,是基于X_dr中的数据进行升维,将数据重新映射到原数据所在的特征空间中,而并非恢复所有原有的数据。但同时,我们也可以看出,降维到300以后的数据,的确保留了原数据的大部分信息,所以图像看起来,才会和原数据高度相似,只是稍稍模糊罢了。

2.2 噪音过滤

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

 2. 查看数据集:

from sklearn.datasets import load_digits #手写数字的数据集
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
digits = load_digits()
#print(digits.data.shape)  (1797, 64)  8行8列
def plot_digits(data):
 fig, axes = plt.subplots(4,10,figsize=(10,4)
                          ,subplot_kw = {"xticks":[],"yticks":[]}
                         )
 for i, ax in enumerate(axes.flat):
     ax.imshow(data[i].reshape(8,8),cmap="binary")
 plt.show()
plot_digits(digits.data)

在这里插入图片描述
 3. 添加噪音:

np.random.RandomState(42)
#在指定的数据集中,随机抽取服从正态分布的数据
#两个参数,分别是指定的数据集,和抽取出来的正态分布的方差
noisy = np.random.normal(digits.data,2)
plot_digits(noisy)

在这里插入图片描述
 4. 逆转降维结果,实现降噪:

pca = PCA(0.5).fit(noisy)
X_dr = pca.transform(noisy)
without_noise = pca.inverse_transform(X_dr)
plot_digits(without_noise)

在这里插入图片描述

2.3 手写数字降维(随机森林)

 1. 画累计方差贡献率曲线,找最佳降维后维度的范围。

from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
data = pd.read_csv(r"D:\Download\digit recognizor.csv")
X = data.iloc[:,1:] #取除了第一列标签以外的列
y = data.iloc[:,0] #取第一列
pca_line = PCA().fit(X)
plt.figure(figsize=[20,5]) #括号里面是尺寸
plt.plot(np.cumsum(pca_line.explained_variance_ratio_))
plt.xlabel("number of components after dimension reduction")
plt.ylabel("cumulative explained variance ratio")
plt.show()

在这里插入图片描述

 2. 降维后维度的学习曲线,继续缩小最佳维度的范围。

score = []
for i in range(1,101,10):
    X_dr = PCA(i).fit_transform(X)
    once = cross_val_score(RFC(n_estimators=10,random_state=0)
                               ,X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(1,101,10),score)
plt.show()

在这里插入图片描述

 3. 细化学习曲线,找出降维后的最佳维度,从图线中可以看出最佳维度是23。

在这里插入图片描述

 4. 查看模型效果:

X_dr = PCA(23).fit_transform(X)
print(cross_val_score(RFC(n_estimators=100,random_state=0),X_dr,y,cv=5).mean()) #0.945

2.4 手写数字降维(KNN)

 1. 在之前的建模过程中,因为计算量太大,所以我们一直使用随机森林,但事实上,我们知道KNN的效果比随机森林更好。现在我们的特征数量已经降到不足原来的3%,可以使用KNN了。

from sklearn.neighbors import KNeighborsClassifier as KNN
print(cross_val_score(KNN(),X_dr,y,cv=5).mean()) #0.9698571428571429

 2. KNN的k值学习曲线:KNN中参数填4时效果最好。

score = []
for i in range(10):
    once = cross_val_score(KNN(i+1),X_dr,y,cv=5).mean()
    score.append(once)
plt.figure(figsize=[20,5])
plt.plot(range(10),score)
plt.show()

在这里插入图片描述

2.4 案例总结

在这里插入图片描述

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

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

相关文章

vue3 自定义Hooks

文章目录 前言一、Hooks是什么?二、图片转换Base641.Hooks2.使用 三、监听元素宽高(自定义指令Hooks)1.Hooks2.使用 总结 前言 本文主要记录了vue3学习中自定义Hooks和vue2中Mixins的使用与案例。 一、Hooks是什么? Hooks用来处…

html给下拉框添加搜索、分页功能(通过ajax从服务器获取搜索数据)

文章目录 下拉框搜索分页功能开发功能使用源码和Demo(点个赞再走咯)test.htmlsearchable-select.csssearchserver-select.js 下拉框搜索分页功能开发 最近需要开发一个下拉框从服务器通过Ajax请求搜索数据库并且分页的组件,源码和demo放在下面…

【微信小程序开发】宠物预约医疗项目实战-开发功能介绍

【微信小程序开发】宠物医院项目实战-开发功能介绍 前言 本项目主要带领大家学习微信小程序开发技术,通过一个完整的项目系统的学习微信小程序的开发过程。鉴于一些同学对视频教学跟不上节奏,为此通过图文描述的方式,完整的将系统开发过程记…

【Redis】Redis常见面试题

【Redis】Redis常见面试题(3) 文章目录 【Redis】Redis常见面试题(3)1. 特性&应用场景1.1 Redis能实现什么功能1.2 Redis支持分布式的原理1.3 为什么Redis这么快1.4 Redis实现分布式锁1.5 Redis作为缓存 2. 数据类型2.1 Redis…

C# 委托学习1

委托的标准定义是,委托是一种引用类型,表示对具有特定参数列表和返回类型的方法的引用; 在实例化委托时,你可以将其实例与任何具有兼容签名和返回类型的方法相关联; 还有一种定义看上去也是正确的:委托是…

ModuleNotFoundError: No module named ‘gevent‘

1、先确定pip版本: pip3 list: 看到没有gevent包 如果pip版本不是最新版可以使用命令python -m pip install --upgrade pip进行更新, 2、安装 pip3 install gevent 安装完成

联合国教科文发布,ChatGPT等生成式AI教育应用指南

联合国教科文组织(UNESCO)在官网发布了,全球首个《生成式AI与教育未来》的应用指南。呼吁各国实施适当的政策,以确保在教育中应用以人为本的方法来使用生成式AI。(指南下载地址:https://unesdoc.unesco.org…

排序(希尔、快速、归并排序)

文章目录 1.排序的概念及其运用 2.插入排序 3.选择排序 文章内容 1.排序的概念及其运用 1.1排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在…

K8s上安装gitlab-ce

文章目录 K8s上安装gitlab-ce操作如下gitlab-deployment.yml K8s上安装gitlab-ce 前言   使用pv-pvc来持久化gitlab的数据,配置,日志文件。   pod启动后需要需要修改external_url然后重启pod。 操作如下 mkdir -p /mnt/data01/gitlab ctr -n k8s.…

C# Onnx Yolov8 Cls 分类

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

sql server 触发器的使用

看数据库下的所有触发器及状态 SELECT a.name 数据表名 , sysobjects.name AS 触发器名 , sysobjects.crdate AS 创建时间 , sysobjects.info , sysobjects.status FROM sysobjects LEFT JOIN ( SELECT * FROM sysobjects WHERE xtype U ) AS a ON sysobjects.parent_obj a.…

Git: 工作区、暂存区、本地仓库、远程仓库

参考链接: Git: 工作区、暂存区、本地仓库、远程仓库 https://blog.csdn.net/weixin_36750623/article/details/96189838

阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

9月13日,阿里云宣布通义千问大模型已首批通过备案,并正式向公众开放,广大用户可登录通义千问官网体验,企业用户可以通过阿里云调用通义千问API。 通义千问在技术创新和行业应用上均位居大模型行业前列。IDC最新的AI大模型评估报告…

腾讯云AI超级底座新升级:训练效率提升幅度达到3倍

大模型推动AI进入新纪元,对计算、存储、网络、数据检索及调度容错等方面提出了更高要求。在9月7日举行的2023腾讯全球数字生态大会“AI超级底座专场”上,腾讯云介绍异构计算全新产品矩阵“AI超级底座”及其新能力。 腾讯云副总裁王亚晨在开场致辞中表示&…

创建第一个MyBatis框架--保姆级教学

文章目录 前言一、创建一个空的mybatis项目二、创建一个Maven模块三、各个文件的配置四、总结 前言 在idea上创建我的第一个MyBatis框架 一、创建一个空的mybatis项目 1、new一个新的项目 2、选择最下面,创建一个空项目 3、为空项目取一个名字,位置可以自己选 4、点…

TCP 和 UDP 的 Socket 调用

在网络层,Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6。另外,还要指定到底是 TCP 还是 UDP。TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 是基于数据报的,因…

java的集合进阶学习

1.集合类 集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 2.集合体系结构 3.Collection集合 Collection集合常用方法 Collection集合的遍历 4.List集合特点 LinkedList集合的特有功能 数组和链表数据结构 栈&#xff…

数据分析三剑客之Pandas

1.引入 前面一篇文章我们介绍了numpy,但numpy的特长并不是在于数据处理,而是在它能非常方便地实现科学计算,所以我们日常对数据进行处理时用的numpy情况并不是很多,我们需要处理的数据一般都是带有列标签和index索引的&#xff0…

MCU软核 1. Altera FPGA上运行8051

0. 环境 - Quartus 13 - EP4CE6E22开发板 - keil c51 - ag10kl144h(本工程兼容AGM) 下载8051源码:https://www.oreganosystems.at/products/ip-cores/8051-ip-core 1. Create Project File --> New Project Wizard 位置:E…

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称,它其实是一个三位一体的技术名词,ELK 的每个字母都来自一个技术组件,分别是 Elasticsearch(简称 ES)、Logstash 和 Kibana。 三个技术组件是独立的,后两个被elast…