特征工程(七)—特征学习RBM

article/2025/11/6 23:51:44

1、MNIST数据集

"""
MNIST数据集,包括6000个0-9手写数字图像,以及学习的真实值此处使用很低级的特征,而不是解释性很好的特征。每一个数据点包括784个特征(灰度图像的像素值)
"""import numpy as np
import matplotlib.pyplot as plt
%matplotlib inlinefrom sklearn import linear_model, datasets, metrics# RBM 这是sklearn唯一的RBM实现
from sklearn.neural_network import BernoulliRBM
from sklearn.pipeline import  Pipeline# 把数据集导入到Numpy数组
images = np.genfromtxt('../data/mnist_train.csv', delimiter=',')# 6000个图像,785列(28像素 * 28像素  + 1个响应变量)
images.shape
#%%
# 785由784像素 + 一个响应变量(第1列)组成,除了响应的变量,每一列的范围都是0到255,表示像素的强度
# 0代表白色背景 255代表全黑的像素images_X, images_y = images[:, 1:], images[:, 0]# 值很大,但是scikit-learn的RBM会进行0~1的缩放
np.min(images_X),np.max(images_X)

在这里插入图片描述

# 查看第一个图像
plt.imshow(images_X[0].reshape(28, 28), cmap=plt.cm.gray_r)images_y[0]

在这里插入图片描述

'''
scikit-learn的唯一的RBM实现是伯努利RBM,要求数据的数值为0~1。修改原始数据集,只考虑硬编码的黑白像素强度,这样每个像素的值会变成0或1(白或黑)
'''# 缩放到0~1
images_X = images_X / 255
# 二分像素(白或黑)
images_X = (images_X > 0.5).astype(float)
np.min(images_X),np.max(images_X)
# 看一下修改后的数字5
plt.imshow(images_X[0].reshape(28, 28), cmap=plt.cm.gray_r)images_y[0]
# 可以看出,图像的模糊消失了,要分类的数字变得很清晰

在这里插入图片描述
应用PCA会如何

# 可以看出,图像的模糊消失了,要分类的数字变得很清晰
#%%
'''
引入RBM之前,先看看应用PCA会如何?使用特征(784个黑或白的像素),并对矩阵进行特征值的分解,从数据集中提取特征数字。从784个主成分中提取100个并绘制出来,查看一下外观。
'''
from sklearn.decomposition import PCApca = PCA(n_components=100)pca.fit(images_X)# 绘制100个主成分
plt.figure(figsize=(10, 10))
for i, comp in enumerate(pca.components_):plt.subplot(10, 10, i + 1)plt.imshow(comp.reshape((28, 28)), cmap=plt.cm.gray_r)plt.xticks()plt.yticks()plt.suptitle('100 components by pca')plt.show()# 协方差矩阵被缩放程原始图像尺寸时候,特征值的样子。
# 每个主成分都试图理解图像的某个方面,例如,第1个(也是最重要的)特征图像有可能捕捉数字0
# 前10个主成分似乎保留了一点数字的形状,之后图像好像没什么意义了。这可能是因为,PCA(LDA)是参数变换,从图像等复杂数据集提取的能力有限。

在这里插入图片描述
在这里插入图片描述

full_pca = PCA(n_components=784)
full_pca.fit(images_X)import matplotlib as mpl
# 解决中文乱码
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = Falseplt.plot(np.cumsum(full_pca.explained_variance_ratio_)
)
plt.xlabel('主成分')
plt.ylabel('累积方差')# 100个主成分捕获90%的方差

在这里插入图片描述
在这里插入图片描述
从MNIST中提取RBM的特征

'''
从MNIST中提取RBM的特征'''
rbm = BernoulliRBM(random_state=0, # 复现训练verbose=True, # 查看训练过程n_iter=20, # 前后向传导的次数n_components=100 # 希望创建的特征数,任意整数
)rbm.fit(images_X)

在这里插入图片描述

# 对rbm进行可视化,查看和特征数字的区别
# 绘制100个主成分
plt.figure(figsize=(10, 10))
for i, comp in enumerate(rbm.components_):plt.subplot(10, 10, i + 1)plt.imshow(comp.reshape((28, 28)), cmap=plt.cm.gray_r)plt.xticks()plt.yticks()plt.suptitle('100 components by rbm')plt.show()# rbm特征在提取不同的形状和笔划

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

plt.figure(figsize=(25, 25))
for i, comp in enumerate(top_features):plt.subplot(5, 4, i + 1)plt.imshow(rbm.components_[comp].reshape((28, 28)), cmap=plt.cm.gray_r)plt.title("Components {},feature value:{}".format(comp,round(image_new_features[comp], 2)), fontsize=20)plt.suptitle('20 components by top_features', fontsize=30)plt.show()# 里面特征十分有意义,例如,34好像直接识别出了5,21隔离了数字5底部的圆圈

在这里插入图片描述

2、在流水线上应用rbm

1、对原始像素值应用线性模型

'''
对原始像素值应用线性模型
'''
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
import numpy as np# 把数据集导入到Numpy数组
images = np.genfromtxt('../data/mnist_train.csv', delimiter=',')
# 785由784像素 + 一个响应变量(第1列)组成,除了响应的变量,每一列的范围都是0到255,表示像素的强度
# 0代表白色背景 255代表全黑的像素images_X, images_y = images[:, 1:], images[:, 0]# 缩放到0~1
images_X = images_X / 255
# 二分像素(白或黑)
images_X = (images_X > 0.5).astype(float)# 创建逻辑回归
lr = LogisticRegression()
params = {'C':[1e-2, 1e-1, 1e0, 1e1, 1e2]
}grid = GridSearchCV(lr, params)# 拟合数据
grid.fit(images_X, images_y)'''
最佳参数:{'C': 0.1}
交叉验证的最佳准确率:0.8983333333333332
'''
print('最佳参数:{}'.format(grid.best_params_))
print('交叉验证的最佳准确率:{}'.format(grid.best_score_))

2、对提取的PCA主成分应用线性模型

'''
对提取的pca主成分应用线性模型
'''
from sklearn.decomposition import PCA
from sklearn.pipeline import Pipeline
pca = PCA()params = {'clf__C':[1e-2, 1e-1, 1e0, 1e1, 1e2],'pca__n_components': [10, 100, 200]
}# 创建流水线
pipeline = Pipeline([('pca', pca),('clf', lr)]
)grid = GridSearchCV(pipeline, params)# 拟合数据
grid.fit(images_X, images_y)'''
最佳参数:{'clf__C': 0.1, 'pca__n_components': 100}
交叉验证的最佳准确率:0.8981666666666666准确率稍差一些。
'''
print('最佳参数:{}'.format(grid.best_params_))
print('交叉验证的最佳准确率:{}'.format(grid.best_score_))

3、对提取的RBM特征应用线性模型

'''
对提取的rbm特征应用线性模型
'''
from sklearn.neural_network import BernoulliRBMrbm = BernoulliRBM(random_state=0)params = {'clf__C':[1e-2, 1e-1, 1e0, 1e1, 1e2],'rbm__n_components': [100, 200]
}
# 创建流水线
pipeline = Pipeline([('rbm', rbm),('clf', lr)]
)grid = GridSearchCV(pipeline, params)# 拟合数据
grid.fit(images_X, images_y)'''
最佳参数:{'clf__C': 1.0, 'rbm__n_components': 200}
交叉验证的最佳准确率:0.9206666666666667
rbm模块的交叉验证率是,能从数字中提取200个新特征。以上说明,面对复杂的任务(例如图像识别、音频处理、和自然语言处理),特征学习算法很有效。
'''
print('最佳参数:{}'.format(grid.best_params_))
print('交叉验证的最佳准确率:{}'.format(grid.best_score_))

http://chatgpt.dhexx.cn/article/m3deIL4B.shtml

相关文章

特征学习-RBM与PCA应用在LR

Table of Contents 1. 基本信息查询 导入package2. 提取PCA 成分3. 提取RBM主成分 取出前20个最有代表性的特征提取后20个特征4. RBM在machine learning中效果 直接用LR模型采用PCA主成分的LR采用RBM主成分的LR 1. 基本信息查询 导入package import numpy as np import matpl…

受限玻尔兹曼机RBM

基本概念代码 基本概念 受限玻尔兹曼机(RBM)是一个两层神经网络,第一层被称为可见层,第二层被称为隐藏层,因为网络只有两层,所以又被称为浅层神经网络。 该模型最早由 Paul Smolensky 于 1986 年提出&…

理解RBMDBN

RBM 关于受限玻尔兹曼机RBM,网上很多博客[1][2]都总结推导RBM很详细,很少有人能通俗地解释一下RBM的用途和有点,我觉得[2]写得很好,可以参考辅助理解,下面简单总结一下我的理解和一些相关知识。 网络结构 RBM是一个…

中小企业RBM结合VRRP组网

组网拓扑图 FW-A配置: sysname FW1090-A # track 1 interface GigabitEthernet1/0/1 physical ///检测上行口 # track 2 interface GigabitEthernet1/0/2 physical ///检测下行口 # ospf 1 router-id 192.168.10.254 ///OSPF发布于核心互联路由 defa…

RBM受限玻尔兹曼机

受限玻尔兹曼机(RBM) 一、RBM的网络结构 RBM的网络结构如下图所示: RBM中包括两层,即: 可见层(visible layer),图上的___v___隐藏层(hidden layer),图上的___h___ 由上图可知,在同一层中,如…

RBM

目录 总结: 伯努利-伯努利RBM 概念: 公式定义 训练过程 高斯-伯努利RBM 概念: 总结: RBM是基于能量函数假设的,优化目标是使能量函数最小化,也设定为重构的可见层等于真实值的概率最大化。在利用极…

DL:RBM 简介、网络结构

在学习Hinton的stack autoencoder算法(论文 Reducing the Dimensionality of Data with Neural Networks)之前需要了解什么是RBM,现在就我学习的情况,查找的资料(大部分来自博客、论文),简单介绍…

RBM的理解

前言 对RBM(Restricted Boltzmann Machine)的理解进行简单的总结。   主要涉及RBM的图结构,为什么场能E(v,h)要如此定义,优化的思路到底是怎么来的,MRF与MC在优化时起到怎么样的作用,CD的意义,RBM的实现。 RBM RB…

受限玻尔兹曼机(RBM)理解

受限玻尔兹曼机(RBM)多见深度学习,不过笔者发现推荐系统也有相关专家开始应用RBM。实际上,作为一种概率图模型,用在那,只要场景和数据合适都可以。有必要就RBM做一个初步了解。 1、 RBM定义 RBM记住三个要…

RBM(受限玻尔兹曼机)解析

1.RBM结构 RBM包括隐层、可见层和偏置层。 与前馈神经网络不一样,RBM在可见层和隐层间的链接方向不定的(即可以双向传播:隐层—>可见层和可见层—>隐层)和完全链接的。如下图表示了一个微型的RBM 如上图所示,…

深度学习 --- 受限玻尔兹曼机详解(RBM)

本节终于来到了重头戏受限玻尔兹曼机,为了能深入理解本节,我们深入讲了很多基础知识,这些基础知识很重要,是理解本节的基础,同时也是你学习其他算法的基础如强化学习、自然语言处理等。本节的安排是先对比一下受限玻尔…

超市进销存管理系统软件(JFrame简版)

出于对桌面软件的爱好,学习过程中使用swing做了一个简单系统,所有布局代码自己手写,未使用swing构建工具,swing构建工具会产生的代码非常糟糕 想要快速构建好看的UI组件,可以使用NetBeans,或者idea等相关插件 有兴趣…

基于javaweb的超市进销存管理系统(java+ssm+jsp+bootstrap+jquery+mysql)

基于javaweb的超市进销存管理系统(javassmjspbootstrapjquerymysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功…

Java项目:ssm超市进销存管理系统

作者主页:夜未央5788 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 ssm超市进销存管理系统 项目介绍 超市进销存管理系统,主要分为管理员与员工两种角色:管理员主要功能模块有: 进货管理:进…

基于Spring+SpringMVC+MyBatis超市进销存管理系统

基于SSM超市进销存管理系统 一、系统介绍二、功能展示1.进货信息2.退货信息3.商品信息4.商品类别5.库存信息6.库存预警7.临期商品8.销售信息9.客户退货信息10.客户信息11.供应商信12.用户信息管理(管理员) 三、获取源码 一、系统介绍 系统主要功能&…

Java编写的超市进销存管理系统 功能非常齐全,代码可直接运行

今天为大家分享一个java语言的超市进销存管理系统,目前系统已经完成了初步功能,后续会进一步完善。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步 开发环境 开发语言为Java&#xf…

基于ThinkPHP5+MySQL的超市进销存管理系统

目 录 摘 要 I Abstract II 1 前 言 1 1.1 项目开发背景 1 1.2 项目开发意义 1 1.3 主要工作 1 2 系统分析 2 2. 1 需求分析 2 2. 2 可行性分析 2 2.2.1 经济可行性 2 2.2.2 技术可行性 2 2.2.3 操作可行性 2 2.2.4 社会可行性 2 3 开发环境 3 3.1 开发工具 3 3.1.1 操作系统 3…

计算机毕业设计系列基于SSM的超市进销存管理系统

目录 一、项目介绍 二、开题报告 三、项目截图 四、源码获取 一、项目介绍 计算机毕业设计系列基于SSM的超市进销存管理系统 本项目是一款基于SSM的超市进销存管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1. 包含&…

毕设-基于SpringBoot超市进销存管理系统

环境:开发工具:idea,数据库:MySQL5.7 jdk1.8 架构:SpringBoot,前端html 主要功能 货物管理员:进货管理、退货管理等; 商品管理员:管理商品、商品类别、供应商、客户、商品…

【附源码】Java计算机毕业设计小超市进销存管理系统(程序+LW+部署)

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