深度学习自编码器 - 去噪自编码器篇

序言

在深度学习的广阔天地中,自编码器作为一种强大的无监督学习工具,通过重构输入数据的方式,不仅实现了数据的有效压缩,还探索了数据的内在表示。而去噪自编码器( Denoising Autoencoder, DAE \text{Denoising Autoencoder, DAE} Denoising Autoencoder, DAE),作为自编码器的一个变种,更是以其独特的去噪能力,在众多应用中脱颖而出。去噪自编码器在训练过程中,会故意向输入数据中添加噪声,然后迫使模型从这种被“污染”的数据中恢复出原始的纯净数据。这一过程不仅锻炼了模型的鲁棒性,还促进了模型学习到更加稳健和本质的数据特征,从而提高了其在噪声环境下的泛化能力。

去噪自编码器(Denoising Autoencoders)

  • 去噪自编码器 ( denoising autoencoder, DAE \text{denoising autoencoder, DAE} denoising autoencoder, DAE) 是一类接受损坏数据作为输入,并训练来预测原始未被损坏数据作为输出的自编码器。
  • DAE \text{DAE} DAE的训练过程如图例1中所示。
    • 我们引入一个损坏过程 C ( x ~ ∣ x ) C(\tilde{\mathbf{x}}\mid\mathbf{x}) C(x~x),这个条件分布代表给定数据样本 x \mathbf{x} x 产生损坏样本 x ~ \tilde{\mathbf{x}} x~ 的概率。
    • 自编码器则根据以下过程,从训练数据对 ( x , x ~ ) (\boldsymbol{x},\tilde{\boldsymbol{x}}) (x,x~) 中学习重构分布 ( reconstruction distribution \text{reconstruction distribution} reconstruction distribution) p reconstruct ( x ∣ x ~ ) p_{\text{reconstruct}}(\mathbf{x}\mid\tilde{\mathbf{x}}) preconstruct(xx~)
      • 从训练数据中采一个训练样本 x \boldsymbol{x} x
      • C ( x ~ ∣ x = x ) C(\tilde{\mathbf{x}}\mid \mathbf{x}=\boldsymbol{x}) C(x~x=x)采一个损坏样本 x ~ \tilde{x} x~
      • ( x , x ~ ) (\boldsymbol{x},\tilde{\boldsymbol{x}}) (x,x~)作为训练样本来估计自编码器的重构分布 p reconstruct ( x ∣ x ~ ) = p decoder ( x ∣ h ) p_{\text{reconstruct}}(\boldsymbol{x}\mid\tilde{\boldsymbol{x}})=p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}) preconstruct(xx~)=pdecoder(xh),其中 h \boldsymbol{h} h是编码器 f ( x ~ ) f(\tilde{\boldsymbol{x}}) f(x~)的输出, p decoder p_{\text{decoder}} pdecoder根据解码函数 g ( h ) g(\boldsymbol{h}) g(h)定义。
  • 通常我们可以简单地对负对数似然 − log ⁡ p decoder ( x ∣ h ) -\log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}) logpdecoder(xh)进行基于梯度如minibatch梯度下降)的近似最小化。只要编码器是确定性的,去噪自编码器就是一个前馈网络,并且可以使用与其他前馈网络完全相同的方式进行训练。
  • 因此我们可以认为DAE是在以下期望下进行随机梯度下降:
    − E x ∼ p ~ data ( x ) E x ~ ∼ C ( x ~ ∣ x ) log ⁡ p decoder ( x ∣ h = f ( x ~ ) ) -\mathbb{E}_{\mathbf{x}\sim\tilde{p}_{\text{data}}(\mathbf{x})}\mathbb{E}_{\tilde{x}\sim C(\tilde{\mathbf{x}}\mid\ \boldsymbol{x})} \log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}=f(\tilde{\boldsymbol{x}})) Exp~data(x)Ex~C(x~ x)logpdecoder(xh=f(x~)) — 公式1 \quad\textbf{---\footnotesize{公式1}} 公式1

得分估计

  • 得分匹配( Hyv a ¨ rinen, 2005a \text{Hyvärinen, 2005a} Hyva¨rinen, 2005a) 是最大似然的代替。它提供了概率分布的一致估计,鼓励模型在各个数据点 x \boldsymbol{x} x 上获得与数据分布相同的得分 ( score \text{score} score)。在这种情况下,得分是一个特定的梯度场:
    ∇ x log ⁡ p ( x ) \nabla_x \log p(\boldsymbol{x}) xlogp(x) — 公式2 \quad\textbf{---\footnotesize{公式2}} 公式2

  • 我们将在后续篇章:得分匹配和比率匹配中更详细地讨论得分匹配。对于现在讨论的自编码器,理解学习 log ⁡ p data \log p_{\text{data}} logpdata 的梯度场是学习 p data p_{\text{data}} pdata 结构的一种方式就足够了。

  • DAE \text{DAE} DAE的训练准则(条件高斯 p ( x ∣ h ) p(\boldsymbol{x}\mid\boldsymbol{h}) p(xh))能让自编码器学到能估计数据分布得分的向量场 ( g ( f ( x ) ) − x ) (g(f(\boldsymbol{x}))-\boldsymbol{x}) (g(f(x))x) ,这是 DAE \text{DAE} DAE的一个重要特性。具体如图例2所示。

  • 去噪地训练一类采用高斯噪声和均方误差作为重构误差的特定去噪自编码器( sigmoid \text{sigmoid} sigmoid隐藏单元,线性重构单元),与训练一类特定的被称为 RBM \text{RBM} RBM的无向概率模型是等价的 ( Vincent, 2011 \text{Vincent, 2011} Vincent, 2011)。

    • 这类模型将在后续给出更详细的介绍;对于现在的讨论,我们只需知道这个模型能显式的给出 p model ( x ; θ ) p_{\text{model}}(\boldsymbol{x};\boldsymbol{\theta}) pmodel(x;θ)
    • RBM \text{RBM} RBM使用去噪得分匹配 ( denoising score matching \text{denoising score matching} denoising score matching) ( Kingma and LeCun, 2010a \text{Kingma and LeCun, 2010a} Kingma and LeCun, 2010a) 训练时,它的学习算法与训练对应的去噪自编码器是等价的。
    • 在一个确定的噪声水平下, 正则化的得分匹配不是一致估计量;相反它会恢复分布的一个模糊版本。
    • 然而,当噪声水平趋向于 0 0 0且训练样本数趋向与无穷时,一致性就会恢复。我们将会在后续更新篇章:去噪得分匹配更详细地讨论去噪得分匹配。
  • 自编码器和 RBM \text{RBM} RBM还存在其他联系。

    • 得分匹配应用于 RBM \text{RBM} RBM后,其代价函数将等价于重构误差结合类似 CAE \text{CAE} CAE惩罚的正则项 ( Swersky et al., 2011 \text{Swersky et al., 2011} Swersky et al., 2011)。
    • Bengio and Delalleau(2009) \text{Bengio and Delalleau(2009)} Bengio and Delalleau(2009) 指出自编码器的梯度是对 RBM \text{RBM} RBM对比散度训练的近似。
  • 对于连续的 x \boldsymbol{x} x,高斯损坏和重构分布的去噪准则得到的得分估计适用于一般编码器和解码器的参数化 ( Alain and Bengio, 2013 \text{Alain and Bengio, 2013} Alain and Bengio, 2013)。

    • 这意味着一个使用平方误差准则:
      ∥ g ( f ( x ~ ) ) − x ∥ 2 \Vert g(f(\tilde{\boldsymbol{x}}))-\boldsymbol{x}\Vert^2 g(f(x~))x2 — 公式3 \quad\textbf{---\footnotesize{公式3}} 公式3
      和噪声方差 σ 2 \sigma^2 σ2的损坏:
      C ( x ~ = x ~ ∣ x ) = N ( x ~ ; μ = x , ∑ = σ 2 I ) C(\tilde{x}=\tilde{\boldsymbol{x}}\mid\boldsymbol{x})=N(\tilde{\boldsymbol{x}};\mu=\boldsymbol{x},\sum=\sigma^2 I) C(x~=x~x)=N(x~;μ=x,=σ2I) — 公式4 \quad\textbf{---\footnotesize{公式4}} 公式4
      的通用编码器-解码器架构可以用来训练估计得分。
    • 图例3展示其中的工作原理。
  • 一般情况下,不能保证重构函数 g ( f ( x ) ) g(f(\boldsymbol{x})) g(f(x)) 减去输入 x \boldsymbol{x} x 后对应于某个函数的梯度,更不用说得分 。

    • 这是早期工作 ( Vincent, 2011 \text{Vincent, 2011} Vincent, 2011) 专用于特定参数化的原因(其中 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x 能通过另一个函数的导数获得)。
    • Kamyshanska and Memisevic (2015) \text{Kamyshanska and Memisevic (2015)} Kamyshanska and Memisevic (2015)通过标识一类特殊的浅层自编码器家族,使 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x 对应于这个家族所有成员的一个得分,以此推广 Vincent, 2011 \text{Vincent, 2011} Vincent, 2011的结果。
  • 目前为止我们所讨论的仅限于去噪自编码器如何学习表示一个概率分布。

    • 更一般的,我们可能希望使用自编码器作为生成模型,并从该分布中进行采样。
    • 这将在后续篇章:从AE采样中讨论。

历史观点

  • 采用 MLP \text{MLP} MLP去噪的想法可以追溯到 LeCun (1987) \text{LeCun (1987)} LeCun (1987) Gallinari et al. (1987) \text{Gallinari et al. (1987)} Gallinari et al. (1987) 的工作。
    • Behnke (2001) \text{Behnke (2001)} Behnke (2001) 也曾使用循环网络对图像去噪。
    • 在某种意义上,去噪自编码器仅仅是被训练去噪的 MLP \text{MLP} MLP
    • 然而, “去噪自编码器’’ 的命名指的不仅仅是学习去噪,而且可以学到一个好的内部表示(作为学习去噪的副效用)。
    • 这个想法提出较晚 ( Vincent et al., 2008b, 2010 \text{Vincent et al., 2008b, 2010} Vincent et al., 2008b, 2010)。学习到的表示可以被用来预训练更深的无监督网络或监督网络。
    • 与稀疏自编码器、稀疏编码、收缩自编码器等正则化的自编码器类似, DAE \text{DAE} DAE的动机是允许使用容量非常大的编码器,同时防止在编码器和解码器学习一个毫无用处的恒等函数。
  • 在引入现代 DAE \text{DAE} DAE之前, Inayoshi and Kurita (2005) \text{Inayoshi and Kurita (2005)} Inayoshi and Kurita (2005) 探讨了与一些相同的方法和相同的目标。
    • 他们在监督目标的情况下最小化重构误差,并在监督 MLP \text{MLP} MLP的隐藏层注入噪声,通过引入重构误差和注入噪声提升泛化能力。
    • 然而,他们的方法基于线性编码器,因此无法学习到现代 DAE \text{DAE} DAE能学习的强大函数族。

  • 图例1:去噪自编码器代价函数的计算图。
    • 去噪自编码器代价函数的计算图。
      在这里插入图片描述

    • 说明:

      • 去噪自编码器被训练为从损坏的版本 x ~ \tilde{\boldsymbol{x}} x~ 重构干净数据点 x \boldsymbol{x} x
      • 这可以通过最小化损失 L = − log ⁡ p decoder ( x ∣ h = f ( x ~ ) ) L=-\log p_{\text{decoder}}(\boldsymbol{x}\mid\boldsymbol{h}=f(\tilde{\boldsymbol{x}})) L=logpdecoder(xh=f(x~)) 实现,其中 x ~ \tilde{\boldsymbol{x}} x~ 是样本 x \boldsymbol{x} x 经过损坏过程 C ( x ~ ∣ x ) C(\tilde{\boldsymbol{x}}\mid\boldsymbol{x}) C(x~x) 后得到的损坏版本。
      • 通常,分布 p decoder p_{\text{decoder}} pdecoder 是因子的分布(平均参数由前馈网络 g g g 给出)。

  • 图例2:去噪自编码器被训练为将损坏的数据点 x ~ \tilde{\boldsymbol{x}} x~ 映射回原始数据点 x \boldsymbol{x} x
    • 去噪自编码器被训练为将损坏的数据点 x ~ \tilde{\boldsymbol{x}} x~ 映射回原始数据点 x \boldsymbol{x} x
      在这里插入图片描述

    • 说明:

      • 我们将训练样本 x ~ \tilde{\boldsymbol{x}} x~ 表示为位于低维流形(粗黑线)附近的红叉。
      • 我们用灰色圆圈表示等概率的损坏过程 C ( x ~ ∣ x ) C(\tilde{\boldsymbol{x}}\mid\boldsymbol{x}) C(x~x)
      • 灰色箭头演示了如何将一个训练样本转换为经过此损坏过程的样本。
      • 当训练去噪自编码器最小化平方误差 ∥ g ( f ( x ~ ) ) − x ∥ 2 \Vert g(f(\tilde{\boldsymbol{x}}))-\boldsymbol{x}\Vert^2 g(f(x~))x2 的平均值时,重构 g ( f ( x ~ ) ) g(f(\tilde{\boldsymbol{x}})) g(f(x~)) 估计 E x , x ∼ p data ~ ( x ) C ( x ~ ∣ x ) [ x ∣ x ~ ] \mathbb{E}_{\mathbf{x},\tilde{\mathbf{x}\sim p_{\text{data}}}(\mathbf{x})C(\tilde{\mathbf{x}}\mid\mathbf{x})}[\mathbf{x}\mid\tilde{\boldsymbol{x}}] Ex,xpdata~(x)C(x~x)[xx~]
      • g ( f ( x ~ ) ) g(f(\tilde{\boldsymbol{x}})) g(f(x~)) 对可能产生 x ~ \tilde{\boldsymbol{x}} x~ 的原始点 x \boldsymbol{x} x 的质心进行估计,所以向量 g ( f ( x ~ ) ) − x ~ g(f(\tilde{\boldsymbol{x}}))-\tilde{\boldsymbol{x}} g(f(x~))x~ 近似指向流形上最近的点。
      • 因此自编码器可以学习由绿色箭头表示的向量场 g ( f ( x ) ) − x g(f(\boldsymbol{x}))-\boldsymbol{x} g(f(x))x
      • 该向量场估计得分 ∇ x log ⁡ p data ( x ) \nabla_x \log p_{\text{data}}(\boldsymbol{x}) xlogpdata(x) 为乘法因子,即平均均方根重构误差。

  • 图例3:由去噪自编码器围绕 1 1 1弯曲流形学习的向量场,其中数据集中在 2 2 2 维空间中。
    • 由去噪自编码器围绕 1 1 1弯曲流形学习的向量场,其中数据集中在 2 2 2 维空间中。
      在这里插入图片描述

    • 说明:

      • 每个箭头与重构向量减去自编码器的输入向量后的向量成比例,并且根据隐式估计的概率分布指向较高的概率。
      • 向量场在估计的密度函数的最大值处(在数据流形上)和密度函数的最小值处都为零。
      • 例如,螺旋臂形成局部最大值彼此连接的 1 1 1 维流形。
      • 局部最小值出现在两个臂间隙的中间附近。
      • 当重构误差的范数(由箭头的长度示出)很大时,在箭头的方向上移动可以显著增加概率,并且在低概率的地方大多也是如此。
      • 自编码器将这些低概率点映射到较高的概率重构。
      • 在概率最大的情况下, 重构变得更准确,因此箭头会收缩。
      • Alain and Bengio (2013) \text{Alain and Bengio (2013)} Alain and Bengio (2013) 许可转载此图。

总结

  • 去噪自编码器的出现,为深度学习领域的数据处理和特征学习带来了新的视角和方法。通过引入噪声并尝试去除它,模型不仅学会了如何有效压缩和重构数据,还深刻理解了数据的本质结构和关键特征。这种能力使得去噪自编码器在图像处理、语音识别、自然语言处理等多个领域展现出卓越的性能。
  • 更重要的是,去噪自编码器所体现的学习理念——即通过对抗噪声来强化模型的内在表示能力——为深度学习的发展提供了宝贵的启示,推动了整个领域向更加智能、更加鲁棒的方向迈进。

往期内容回顾

深度学习自编码器 - 引言篇
深度学习自编码器 - 欠完备自编码器篇
深度学习自编码器 - 正则自编码器篇

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

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

相关文章

Java | Leetcode Java题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; public class Solution {public int characterReplacement(String s, int k) {int len s.length();if (len < 2) {return len;}char[] charArray s.toCharArray();int left 0;int right 0;int res 0;int maxCount 0;int[] freq n…

C++:多态(协变,override,final,纯虚函数抽象类,原理)

目录 编译时多态 函数重载 模板 运行时多态 多态的实现 实现多态的条件 协变 析构函数的重写 override 关键字 final 关键字 重载、重写、隐藏对比 纯虚函数和抽象类 多态的原理 多态是什么&#xff1f; 多态就是有多种形态 多态有两种&#xff0c;分别是编译时…

黑马智数Day1

src文件夹 src 目录指的是源代码目录&#xff0c;存放项目应用的源代码&#xff0c;包含项目的逻辑和功能实现&#xff0c;实际上线之后在浏览器中跑的代码就是它们 apis - 业务接口 assets - 静态资源 &#xff08;图片&#xff09; components - 组件 公共组件 constants…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 &#xff08;简单&#xff09; 2.移除元素 &#xff08;简单&#xff09; 3.删除有序数组中的重复项 &#xff08;简单&#xff09; 4.删除有序数组中的重复项 II&#xff08;中等&#xff09; 5.多数元素&#xff08;简单&am…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https://qm.qq.com/q/hMgWngXvcQhttps://qm.qq.com/q/hMgWngXvcQ你是否在寻找数学建模比赛的突破点&am…

LabVIEW机动车动态制动性能校准系统

机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合&#xff0c;实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率&#xff0c;而且具备良好的用户交互界面&#xff0c;使得操作更加简便、直观。 项目背景 随着机动车辆数量的…

Redisson实现分布式锁(看门狗机制)

目录 可重入锁&#xff1a; 锁重试和看门狗机制&#xff1a; 主从一致性&#xff1a; 首先引入依赖&#xff0c;配置好信息 3.使用Redisson的分布式锁 可重入锁&#xff1a; 可重入锁实现是通过redsi中的hash实现的&#xff0c;key依旧是业务名称加id&#xff0c;然后第一个…

Cocos Creator3.x设置动态加载背景图并且循环移动

效果图 项目结构 项目层级结构&#xff1a; 预制&#xff1a; 代码 import { _decorator, CCFloat, Component, Node, Sprite, instantiate, Prefab, assert } from cc; const { ccclass, property } _decorator;/*** 背景脚本*/ ccclass(Background) export class Backg…

前端入门:HTML+CSS

引言&#xff1a; 前端三大件&#xff1a;HTML、CSS、JS&#xff0c;每一个部分都很重要&#xff0c;我听过比较形象的比喻就是HTML&#xff08;HYPER TEXT MARKUP LANGUAGE&#xff09;相当于骨架&#xff0c;而CSS就是装饰渲染&#xff0c;JS则是动作功能实现。 之前的文章…

Qt 模型视图(三):视图类QAbstractItemView

文章目录 Qt 模型视图(三):视图类QAbstractItemView1.基本概念1.1.使用现有视图1.2.使用模型1.3.使用模型的多个视图1.4.在视图之间共享选择 Qt 模型视图(三):视图类QAbstractItemView ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视…

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行

1. Unity3D介绍 Unity3D是虚拟现实行业中&#xff0c;使用率较高的一款软件。 它有着强大的功能&#xff0c;是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…

感知笔记4:YOLO 3D 物体定位

如何在 ROS 中使用 YOLO 如何在 2D 中检测人和大象如何在 3D 中检测人和大象 有许多可用的深度学习库。您可能听说过&#xff1a;Keras、TensorFlow 和 Darknet。 在这里我们将使用 Darknet&#xff0c;因为它实现了 YOLOv3&#xff0c;这是一个对象检测模型。它非常快&…

【AI大语言模型】提示词工程基础及进阶

【AI大语言模型】提示词工程基础及进阶 什么是提示词&#xff08;Prompt&#xff09; 提示词&#xff08;Prompt&#xff09;是与人工智能对话时用来引导或触发生成某种输出的指令。 它相当于你在与 AI 进行互动时所提出的问题或任务说明。提示词可以是简短的指令、一个问题…

YOLOv8改进,YOLOv8替换主干网络为VanillaNet( CVPR 2023 华为提出的全新轻量化架构),大幅度涨点

改进前训练结果: 改进后训练结果: 摘要 基础模型的核心理念是“更多即不同”,这一理念在计算机视觉和自然语言处理领域取得了惊人的成功。然而,变压器模型的优化挑战和固有复杂性呼唤一种向简化转变的范式。在本研究中,引入了VanillaNet,一种拥抱设计优雅的神经网络架构…

VSCode好用的插件推荐

1. Chinese 将vscode翻译成简体中文 如果安装了依然是英文&#xff0c;请参考如下方法&#xff1a; ctrlshfitp 2. ESLint 自动检查规范 3. Prettier - Code formatter 可以自动调整代码的缩进、换行和空格&#xff0c;确保代码风格统一。通过配置&#xff0c;Prettier可…

掌握Android开发新趋势:Jetpack与现代架构技术全解析

随着Android开发技术的不断进步&#xff0c;Jetpack和现代架构技术已成为构建高效、可维护应用的关键。本文将为您介绍一套全面的学习资料&#xff0c;包括大纲、PDF文档、源代码以及学习视频&#xff0c;帮助您深入理解Jetpack核心库、架构组件以及现代开发工具。 内容&#…

python贪吃蛇游戏项目源码【免费】

使用Pygame库实现的贪吃蛇游戏。Pygame是一个用于创建视频游戏的Python模块集合&#xff0c;它提供了图形和声音库&#xff0c;使游戏开发变得容易。 初始化设置 屏幕大小 (SCREEN_WIDTH, SCREEN_HEIGHT): 定义了游戏窗口的宽度和高度。方格大小 (SIZE): 定义了游戏中每个小方…

简单水印通过python去除

简单水印通过python去除 先看效果&#xff0c;如果效果不是你需要的就可以不用浪费时间。 注意&#xff1a;这种主要还是对应的文字在水印上方的情况&#xff0c;同时最好不要有渐变水印否则可能最后输出的图片的水印还会有所残留&#xff0c;不过还是学习使用&#xff0c;相信…

救生圈检测系统源码分享

救生圈检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

基于协同过滤算法的商品推荐系统

系统展示 用户前台界面 管理员后台界面 商家后台界面 系统背景 随着互联网技术的飞速发展&#xff0c;用户每天面临的信息量呈爆炸式增长&#xff0c;如何有效地筛选出用户感兴趣的内容成为一大挑战。在此背景下&#xff0c;基于协同过滤算法的商品推荐系统应运而生。该系统通过…