【机器学习】无监督学习算法之:自编码器

自编码器

  • 1、引言
  • 2、自编码器
    • 2.1 定义
    • 2.2 原理
    • 2.3 实现方式
    • 2.4 算法公式
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥, 今天可以讲一讲 自编码器嘛
小鱼:请说清楚,是什么编码器?
小屌丝:自编码器
小鱼:自己的写的编码器吗?
小屌丝:你要是这么说,也没毛病, 自己写自编码器博文
小鱼:… 那我不写了。
小屌丝:…别啊。
小鱼:那你说清楚,是什么自编码器呢?
小屌丝:就是 无监督学习的 自编码器
小鱼:… 感觉自己给你挖坑。
小屌丝: 没关系, 我带铁锹的哦 。你看
在这里插入图片描述

小鱼:此时小鱼的想法。
在这里插入图片描述

小屌丝:我不是那个意思了。
小鱼:那你是啥意思。
小屌丝:(⊙o⊙)…,嗯… 听说xxx(此处省略几个字)要上zhong了哦
小鱼: 那还等什么。

2、自编码器

2.1 定义

自编码器是一种无监督的神经网络模型,它试图通过训练网络来学习一个恒等函数,即输出尽可能接近输入的表示。

自编码器由两部分组成:编码器(Encoder)和解码器(Decoder)。

编码器负责将输入数据压缩成一个低维的隐藏层表示(编码),而解码器则负责从编码中重构出原始输入。

2.2 原理

自编码器的原理基于神经网络的学习能力。

在训练过程中,自编码器通过最小化重构误差来优化网络参数,使得解码器能够准确地从编码中恢复出原始输入。

通过限制隐藏层的大小,自编码器可以学习到一个紧凑的、有意义的输入表示,这个表示能够捕捉到输入数据的关键特征。

2.3 实现方式

实现自编码器通常包括以下步骤:

  • 构建网络结构
    • 定义编码器和解码器的网络层,以及它们的连接方式。
    • 编码器通常是一个多层感知机(MLP),通过一系列线性变换和非线性激活函数将输入数据压缩成低维编码。
    • 解码器则是一个与编码器结构对称的网络,用于从编码中重构出原始输入。
  • 定义损失函数
    • 损失函数用于衡量解码器输出的重构数据与原始输入之间的差异。
    • 常用的损失函数包括均方误差(MSE)和交叉熵损失等。
  • 训练网络
    • 使用无监督学习方法(如随机梯度下降)来训练自编码器。
    • 在训练过程中,网络参数通过反向传播算法进行更新,以最小化损失函数。
  • 应用
    • 一旦自编码器训练完成,它可以用于多种任务,如数据降维、特征提取、去噪等。
    • 通过提取编码层的输出,我们可以获得输入数据的低维表示,用于后续的分析和建模。

2.4 算法公式

自编码器的算法公式主要涉及编码和解码过程。假设输入数据为(x),编码器的输出(即编码)为(h),解码器的输出为(\hat{x})。

  • 则编码过程

[ h = f encoder ( x ) ] [ h = f_{\text{encoder}}(x) ] [h=fencoder(x)]

其中,$(f_{\text{encoder}})$表示编码器的映射函数,通常是一个参数化的神经网络。
  • 解码过程

[ x ^ = f decoder ( h ) ] [ \hat{x} = f_{\text{decoder}}(h) ] [x^=fdecoder(h)]

其中,$(f_{\text{decoder}})$表示解码器的映射函数,也是一个参数化的神经网络。
  • 损失函数通常定义为重构误差,如均方误差

[ L ( x , x ^ ) = 1 n ∑ i = 1 n ( x i − x ^ i ) 2 ] [ L(x, \hat{x}) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \hat{x}_i)^2 ] [L(x,x^)=n1i=1n(xix^i)2]

其中,(n)是输入数据的维度。

训练过程中,通过最小化损失函数来更新编码器和解码器的参数。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-03-11
# @Author : Carl_DJ'''
实现功能:使用 Keras库实现自编码器'''
import numpy as np  
from keras.layers import Input, Dense  
from keras.models import Model  # 假设输入数据维度为784(例如,展平后的28x28图像)  
input_dim = 784  
encoding_dim = 32  # 编码维度  # 定义编码器模型  
input_img = Input(shape=(input_dim,))  
encoded = Dense(encoding_dim, activation='relu')(input_img)  # 定义解码器模型  
decoded = Dense(input_dim, activation='sigmoid')(encoded)  # 构建自编码器模型  
autoencoder = Model(input_img, decoded)  # 编译模型  
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')  # 生成一些随机数据作为示例  
x_train = np.random.random((1000, input_dim))  
x_train = x_train.astype('float32') / 255.  # 训练自编码器  
autoencoder.fit(x_train, x_train,  epochs=50,  batch_size=256,  shuffle=True,  validation_data=(x_train, x_train))  # 使用编码器提取特征  
encoder = Model(input_img, encoded)  
encoded_imgs = encoder.predict(x_train)

代码实现功能解析

  • 定义自编码器模型:使用Keras库定义了一个简单的自编码器模型。自编码器是一种无监督学习模型,它试图学习一个恒等函数,即输出尽可能地复制输入。它由两部分组成:编码器和解码器。

    • 编码器:将输入数据压缩成一个低维表示,这里使用了单个全连接层(Dense layer),输出维度为encoding_dim(在这个例子中是32)。
    • 解码器:从编码器的输出中重构出原始输入数据,这里也使用了单个全连接层,输出维度与输入维度相同(input_dim,这里是784)。
  • 编译模型:使用Adam优化器和二元交叉熵损失函数来编译自编码器模型。优化器用于更新模型的权重以最小化损失函数,而损失函数衡量了模型输出与原始输入之间的差异。

  • 生成训练数据:生成了一个随机的数据集x_train,其形状为(1000, 784)。这里假设这些数据代表784维的特征(例如,展平的28x28像素的图像)。然后,这些数据被归一化到0到1的范围内。

  • 训练自编码器:使用生成的训练数据x_train来训练自编码器模型。训练过程中,模型会尝试学习一个函数,使得输入数据通过编码器和解码器后能够尽可能地接近原始输入。

  • 提取特征:训练完成后,代码构建了一个新的模型encoder,该模型仅包含自编码器中的编码器部分。然后,使用这个编码器模型对训练数据x_train进行预测,得到其低维表示encoded_imgs。这些低维表示可以被视为输入数据的特征,可以用于后续的任务,如分类、聚类等。

在这里插入图片描述

3、总结

看到这里,今天的分享就该结束了。

自编码器通过学习输入数据的压缩表示来实现无监督特征学习。
它延伸应用于数据去噪、异常检测等任务中。但编码空间容易趋向平均值,需要设计特殊结构进行正则化。
自编码器为后来的变分自编码器等深度学习模型奠定基础。

当然, 随着深度学习技术的不断发展,自编码器也在不断演进和创新。例如,变分自编码器(VAE)卷积自编码器(CAE) 等变体在特定任务上取得了更好的效果。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习机器学习领域的知识。

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

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

相关文章

除了大众点评,中国未来还会产生多少家这样的人工智能公司? - 学习Yelp公司的软件工程-评价和推荐系统

原文作者:Jason Sleight,ML(Machine Learning)平台集团技术负责人 翻译:数字化营销工兵 了解数据是Yelp成功的重要组成部分。为了将我们的消费者与当地优秀的企业联系起来,我们每天为各种任务提供数百万条建…

前端面试02(JS)

文章目录 前端面试02(JS)1、js的组成2、js内置对象3、操作数组的方法4、数据类型的检测方法5、闭包是什么6、前端内存泄漏7、事件委托8、基本数据类型和引用数据类型9、原型链10、JS如何实现继承 🎉写在最后 前端面试02(JS&#x…

百度交易中台之系统对账篇

作者 | 天空 导读 introduction 百度交易中台作为集团移动生态战略的基础设施,面向收银交易与清分结算场景,赋能业务、提供高效交易生态搭建。目前支持百度体系内多个产品线,主要包括:度小店、小程序、地图打车、文心一言等。本文…

从零开始搭建游戏服务器 第四节 MongoDB引入并实现注册登录

这里写目录标题 前言正文添加依赖安装MongoDB添加MongoDB相关配置创建MongoContext类尝试初始化DB连接实现注册功能测试注册功能实现登录逻辑测试登录流程 结语下节预告 前言 游戏服务器中, 很重要的一点就是如何保存玩家的游戏数据. 当一个服务端架构趋于稳定且功能全面, 开发…

qt-pdf-viewer-library 编译过程记录

1.qtpdfviewerinitializer.h 中 类模板问题需要修改为下面代码: https://github.com/develtar/qt-pdf-viewer-library 下载代码: 编译出现错误 修改代码,如下: 2.无法触发onViewerLoaded 事件,就是界面无法显示PDF文件 修改下面代码&#…

使用JNDIExploit-1.2-SNAPSHOT.jar复现log4j2详细流程

1.进入到改工具所在的目录,然后cmd打开命令行 查看一下帮助信息 -l 指定开启ladp服务的端口 -p 指定开启http服务的端口 -i 指定开启服务的ip,也就是攻击者的ip,也可以是黑客的公网服务器 因为这里的靶场是部署在kali当中的&#xf…

MySQL数据库操作学习(5)函数和储存过程

文章目录 一、简介二、函数1.格式2.带参数的函数3.定义变量3.如何查询变量值 三、储存过程1.格式2.参数3.in的接入参数4.out的接入参数5.in和out区别 四、应用场景 一、简介 在 SQL 中,函数(Function)和存储过程(Stored Procedur…

web渗透测试漏洞复现:未授权访问漏洞合集

web渗透测试漏洞复现 Active MQ 未授权访问 Atlassian Crowd 未授权访问 CouchDB 未授权访问 Docker 未授权访问 Dubbo 未授权访问 Druid 未授权访问 Elasticsearch 未授权访问 FTP 未授权访问 Hadoop 未授权访问 JBoss 未授权访问 Jenkins 未授权访问 Jupyter Notebook 未授权…

竞争优势:大型语言模型 (LLM) 如何重新定义业务策略

人工智能在内容创作中的突破 在当今快节奏的商业环境中,像 GPT-4 这样的大型语言模型 (LLM) 不再只是一种技术新颖性; 它们已成为重新定义跨行业业务战略的基石。 从增强客户服务到推动创新,法学硕士提供了企业不容忽视的竞争优势。 1. 加强…

设计模式中的UML基础

设计模式中的UML基础 目录 1、UML概述 2、UML的用途 3、UML的构成 4、UML图 5、UML类图 5.1、类的构成 5.2、类与类之间的关系 6、绘制UML图的软件工具 在讲解设计模式时,会使用到UML建模中的类图去讲解类与类之间的关系,所以这里需要给大家普…

蓝桥杯day4刷题日记

P8605 [蓝桥杯 2013 国 AC] 网络寻路 思路来源于https://www.luogu.com.cn/article/iat8irsf #include <iostream> using namespace std; int n,m; int q[10010]; int v[100010],u[100010]; long long res;int main() {cin>>n>>m;for(int i0;i<m;i){cin…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

Android Studio实现内容丰富的安卓校园二手交易平台(带聊天功能)

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号083 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看二手商品列表 3.发布二手商品 4.商品详情 5.聊天功能…

NodeJS 中的设计模式

Node.js 是一个流行的 JavaScript 运行时&#xff0c;允许开发者使用事件驱动、非阻塞 I/O 模型构建可扩展的网络应用程序。和任何复杂的框架一样&#xff0c;Node.js 应用程序可以从使用成熟的设计模式中受益&#xff0c;以促进代码重用、可维护性和健壮性。本文将概述一些对 …

在微信小程序中或UniApp中自定义tabbar实现毛玻璃高斯模糊效果

backdrop-filter: blur(10px); 这一行代码表示将背景进行模糊处理&#xff0c;模糊程度为10像素。这会导致背景内容在这个元素后面呈现模糊效果。 background-color: rgb(255 255 255 / .32); 这一行代码表示设置元素的背景颜色为白色&#xff08;RGB值为0, 0, 0&#xff09;&a…

docker批量删除容器或镜像

删除容器 停止所有容器 删除所有容器&#xff0c;需要先停止所有运行中的容器 docker stop docker ps -a -q docker ps -a -q&#xff0c;意思是列出所有容器(包括未运行的)&#xff0c;只显示容器编号&#xff0c;其中 -a : 显示所有的容器&#xff0c;包括未运行的。 …

以太坊的演变:EIP、ERC 概念以及革命性的 ERC20、ERC721 和 ERC115 标准

文章目录 一、EIP——以太坊发展的基石1.1 什么是EIP&#xff1f;1.2 历史背景&#xff1a;前身的 BIP1.3 EIP的重要性1.4 流程&#xff1a;从提案到实施 二、进入 ERC——以太坊内的标准化协议2.1 解读 ERC&#xff1a;以太坊征求意见2.2 ERC 标准的诞生和意义 三、聚焦 ERC20…

如何动态修改spring中定时任务的调度策略(2)

上一篇文章中我们一下走读了一下spring中实现@Scheduled的源码,想必你对spring中实现定时调度的原理更加了解吧,文末我们两个问题, 1.spring在进行定时调度时,使用的线程池是默认,那么这个默认的线程池的配置是怎样的呢? 2.如何动态调整调度策略。 接下来我们详细分析一…

第四百一十二回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

在Linux/Ubuntu/Debian中使用iFuse访问iOS 设备(例如 iPhone 或 iPad)上的文件可双向复制粘贴

iFuse 是一款工具&#xff0c;可让你在 Linux 系统上安装 iOS 设备&#xff08;例如 iPhone 或 iPad&#xff09;&#xff0c;使你能够访问其文件系统并与设备传输文件。 以下是有关如何使用 iFuse 的基本指南&#xff1a; 安装依赖项&#xff1a;在安装 iFuse 之前&#xff0c…