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

news2024/9/20 0:59:06

自编码器

  • 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.coloradmin.cn/o/1528198.html

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

相关文章

【LabVIEW FPGA入门】并行执行

利用图形化编程的并行特性以及 FPGA 上 LabVIEW 图的真正并行实现,您可以通过将应用程序代码划分为更小的进程来进一步优化执行速度。与整个应用程序在一个循环中运行相比,这使得每个进程能够实现更高的循环速率和更高的应用程序整体执行速率。 …

Java-SpringAop 编程式事物实现

SpringAop 编程式事物实现 1. 数据库事物特性 原子性 多个数据库操作是不可分割的,只有所有的操作都执行成功,事物才能被提交;只要有一个操作执行失败,那么所有的操作都要回滚,数据库状态必须回复到操作之前的状态 …

【11】工程化

一、为什么需要模块化 当前端工程到达一定规模后,就会出现下面的问题: 全局变量污染 依赖混乱 上面的问题,共同导致了代码文件难以细分 模块化就是为了解决上面两个问题出现的 模块化出现后,我们就可以把臃肿的代码细分到各个小文件中,便于后期维护管理 前端模块化标准…

杰理-手表-卡槽式的sd卡热插拔

杰理-卡槽式的sd卡热插拔 卡槽式的sd卡热插拔,需要把TCFG_SD_ALWAY_ONLINE_ENABLE这个宏关掉

KT1328A主从一体蓝牙模块方案_主机使用流程以及开机返回信息说明

在KT6368A芯片基础上,新增KT1328A蓝牙主从一体版本,实现的是主从一体相互切换,可以设置为主机【类似于手机的角色】,也可以设置为从机角色,通过AT指令 不支持SPP,不支持低功耗 。功耗和之前KT6368A双模版本…

C#,图论与图算法,图(Graph)广度优先遍历(BFS,Breadth First Search)算法与源代码

1 深度优先算法与 宽度优先遍历 深度优先算法(DFS,Deep First Search)与 宽度优先遍历(BFS,Breadth First Search) 是树、图数据结构的基础性、标准性的遍历算法。 2 深度优先算法(DFS,Deep First Search) 深度优先搜索(DFS)是一种用于搜索图形或树数据结构的算法…

C#进阶实践项目(俄罗斯方块)

CSharp进阶实践项目--俄罗斯方块 1.需求分析 2.复用贪吃蛇开始等场景切换的代码 (自己写一遍,不难!!!) 入口: 更新接口: Game 类: BeginOrEndBaseScene 类:…

Linux/openEuler系统部署spring boot+vue前后端分离项目(nginx均衡代理)

Linux/openEuler系统部署spring bootvue前后端分离项目(nginx均衡代理) 1、系统环境准备,安装openjdk和nginx 可以看我前面的文章 华为openEuler系统安装openjdk并配置环境变量 openEuler系统安装nginx 2、打包后端SpringBoot项目并部署到…

电机学(笔记一)

磁极对数p: 直流电机的磁极对数是指电机定子的磁极对数,也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说,极对数越多,电机转速越低,扭矩越大,适用于低速、高扭矩的场合;相反&…

盘古信息2023工作总结表彰大会暨2024工作说明会圆满举行

春风拂面,万物复苏,正是扬帆起航的好时节。2024年3月16日,盘古家人们齐聚一堂,一场以“新产品 新市场 新商业模式 可作为”为主题的工作总结表彰暨说明会圆满举行。本次盛会采用线上线下相结合的方式,无论是盘古东莞总…

国创证券|初学炒股,想赚钱就得了解这些!

初学者炒股: 1、开户。 购买股票需要开立一个股票账户,有了股票账户后,才干生意股票。开立账户时,选择大型的、知名度高的证券公司比较好,例如国创证券、华泰证券、国泰君安、广发证券、招商证券、海通证券、银河证券…

了解常用测试模型 -- V模型、W模型

目录 V模型 测试流程 特点 优、缺点 w模型/双v模型 测试流程 特点 优、缺点 V模型 测试流程 用户需求:产品经理将用户需求转变为软件需求 需求分析与系统设计:验证需求是否正确,确定编程语言和框架 概要设计:项目结构设…

集简云数据表支持连接MySQL数据库,实现无缝数据连接

集简云数据表作为一款轻量级数据存储表单工具,已经帮助众多用户快速创建、管理、存储数据。在传统的数据处理中,如果想将企业原有的数据库数据同步到数据表,需要手动操作进行,工作量大且耗时耗力;同时,由于…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本 | 三维梁 | 3D梁 | 空间梁

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)

1.简介 经过宏哥长时间的查找,终于找到了一个含有iframe的网页。所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的。 2.iframe是什么 iframe就是我们常用的ifra…

CMU 10-414/714: Deep Learning Systems --hw3

实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量,只不过会有一些额外的属性(如shape、strides)来表明这个flat array在维度上的分布。底层运算(如加法、矩阵乘法)都…

网络安全的几个关键领域

网络安全是一个复杂且多维度的领域,涵盖了多个关键领域,涉及到信息保护、网络防护、应用安全、用户教育以及物理安全等多个方面。这些关键领域相互交织,共同构成了网络安全这一宏大且细致入微的领域。 今天德迅云安全就分享下网络安全的几个…

android studio的布局没有提示之SDK不匹配

我新建了一个项目,然后突然发现布局没有提示了: 我看了下我的build.gradle 我直接修改compileSdkVersion为30就能正常使用了

【贪心算法】Leetcode 55. 跳跃游戏 45. 跳跃游戏 I

【贪心算法】Leetcode 55. 跳跃游戏 45. 跳跃游戏 II Leetcode 55. 跳跃游戏解法1 贪心 Leetcode 45. 跳跃游戏I解法 贪心 Leetcode 55. 跳跃游戏 ---------------🎈🎈55. 跳跃游戏 题目链接🎈🎈------------------- 解法1 贪心…

【计算机网络篇】物理层(2)传输方式

文章目录 🍔传输方式⭐串行传输和并行传输⭐同步传输和异步传输🎈同步传输🎈异步传输 ⭐单向通信,双向交替通信和双向同时通信 🍔传输方式 在物理层中,传输方式是指数据在传输介质中传输的方式和方法。常见…