机器学习强基计划9-2:图解字典学习KSVD算法(附Python实战)

news2024/11/26 0:18:16

目录

  • 0 写在前面
  • 1 字典学习
  • 2 问题形式化
  • 3 KSVD算法
  • 4 Python实现

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。

🚀详情:机器学习强基计划(附几十种经典模型源码)


1 字典学习

人类社会一切已发现或未发现的知识都必须通过字、词、句进行表示,而整体的知识量非常庞大——人类每天产生的新知识约2T;换言之,无论人类的知识多么浩瀚,一本新华字典或牛津字典也足以表达人类从古至今乃至未来的所有知识——字典中字、词、句的排列组合。所以字典相当于庞大数据集的一种降维表示,且蕴藏样本背后最本质的特征。现代神经科学表明,哺乳动物大脑的初级视觉皮层主要工作就是进行图像的字典表示。

考虑样本矩阵的一种分解

X = D A \boldsymbol{X}=\boldsymbol{DA} X=DA

其中 X = [ x 1 x 2 ⋯ x m ] ∈ R d × m \boldsymbol{X}=\left[ \begin{matrix} \boldsymbol{x}_1& \boldsymbol{x}_2& \cdots& \boldsymbol{x}_m\\\end{matrix} \right] \in \mathbb{R} ^{d\times m} X=[x1x2xm]Rd×m是样本矩阵; A = [ α 1 α 2 ⋯ α m ] ∈ R k × m \boldsymbol{A}=\left[ \begin{matrix} \boldsymbol{\alpha }_1& \boldsymbol{\alpha }_2& \cdots& \boldsymbol{\alpha }_m\\\end{matrix} \right] \in \mathbb{R} ^{k\times m} A=[α1α2αm]Rk×m是样本 X \boldsymbol{X} X的编码矩阵,其中 α i \boldsymbol{\alpha }_i αi x i \boldsymbol{x}_i xi的编码; D = [ d 1 d 2 ⋯ d k ] ∈ R d × k \boldsymbol{D}=\left[ \begin{matrix} \boldsymbol{d}_1& \boldsymbol{d}_2& \cdots& \boldsymbol{d}_k\\\end{matrix} \right] \in \mathbb{R} ^{d\times k} D=[d1d2dk]Rd×k称为字典(dictionary) d i \boldsymbol{d}_i di称为字典的一个原子(atom),通常经过归一化处理, k k k称为字典的词汇量,可由用户指定。设样本相当于字典而言相当庞大,即 m ≫ k m\gg k mk

在这里插入图片描述

考察样本的编码形式:

  • k < d k<d k<d,则 D \boldsymbol{D} D称为欠完备字典,相当于特征选择或线性降维技术;
  • k > d k>d k>d,则 D \boldsymbol{D} D称为过完备字典,编码维度增大似乎违背了避免维数灾难的原则,但此时约束 α i \boldsymbol{\alpha }_i αi x i \boldsymbol{x}_i xi稀疏表示(sparse representation)——含有大量零元素。

2 问题形式化

字典学习(dictionary learning)研究如何从普通稠密样本中学习出字典,并将样本转换为恰当稀疏的表示形式,从而简化学习任务、降低模型复杂度。形式化为

min ⁡ D , α i ∑ i = 1 m ∥ x i − D α i ∥ 2 2 + λ ∑ i = 1 m ∥ α i ∥ 1 \underset{\boldsymbol{D},\boldsymbol{\alpha }_i}{\min}\sum_{i=1}^m{\left\| \boldsymbol{x}_i-\boldsymbol{D\alpha }_i \right\| _{2}^{2}}+\lambda \sum_{i=1}^m{\left\| \boldsymbol{\alpha }_i \right\| _1} D,αimini=1mxii22+λi=1mαi1

字典学习可以分为两步:

  1. 固定字典对原始样本进行稀疏编码;
  2. 基于原始样本与稀疏表示更新字典。

关于稀疏表示和稀疏编码请参考机器学习强基计划9-1:图解匹配追踪(MP)与正交匹配追踪(OMP)算法

可见字典更新与稀疏编码在同一个优化过程中完成,字典学习的最终目标也是为了获得稠密样本的稀疏编码,因此不致混淆的情况下,字典学习与稀疏编码语义相同。本节重点介绍字典学习的第二步——字典更新。具体地,在给出稀疏编码后,优化问题变为

min ⁡ D ∥ X − D A ∥ F 2 \min _{\boldsymbol{D}}\left\| \boldsymbol{X}-\boldsymbol{DA} \right\| _{F}^{2} DminXDAF2

3 KSVD算法

KSVD算法的核心是利用奇异值分解SVD逐个更新字典原子。设 α i \boldsymbol{\alpha }^i αi表示稀疏矩阵 A \boldsymbol{A} A的第 i i i行,则优化问题等价于

min ⁡ d 1 , ⋯   , d k ∥ X − ∑ i = 1 k d i α i ∥ F 2 \underset{\boldsymbol{d}_1,\cdots ,\boldsymbol{d}_k}{\min}\left\| \boldsymbol{X}-\sum_{i=1}^k{\boldsymbol{d}_i\boldsymbol{\alpha }^i} \right\| _{F}^{2} d1,,dkmin Xi=1kdiαi F2

现固定住原子 d 1 , ⋯   , d i − 1 , d i + 1 , ⋯   , d k \boldsymbol{d}_1,\cdots ,\boldsymbol{d}_{i-1},\boldsymbol{d}_{i+1},\cdots ,\boldsymbol{d}_k d1,,di1,di+1,,dk而只考虑对 d i \boldsymbol{d}_i di的优化,即

min ⁡ d i ∥ ( X − ∑ j ≠ i d j α j ) − d i α i ∥ F 2 = min ⁡ d i ∥ E i − d i α i ∥ F 2 \underset{\boldsymbol{d}_i}{\min}\left\| \left( \boldsymbol{X}-\sum_{j\ne i}{\boldsymbol{d}_j\boldsymbol{\alpha }^j} \right) -\boldsymbol{d}_i\boldsymbol{\alpha }^i \right\| _{F}^{2}=\underset{\boldsymbol{d}_i}{\min}\left\| \boldsymbol{E}_i-\boldsymbol{d}_i\boldsymbol{\alpha }^i \right\| _{F}^{2} dimin Xj=idjαj diαi F2=dimin Eidiαi F2

其中 E i = X − ∑ j ≠ i d j α j \boldsymbol{E}_i=\boldsymbol{X}-\sum\nolimits_{j\ne i}^{}{\boldsymbol{d}_j\boldsymbol{\alpha }^j} Ei=Xj=idjαj是固定值,此时转换为调整 d i α i \boldsymbol{d}_i\boldsymbol{\alpha }^i diαi使之逼近 E i \boldsymbol{E}_i Ei的最小二乘问题,因为改变了字典原子 d i \boldsymbol{d}_i di,所以全体样本第 i i i维的稀疏表示 α i \boldsymbol{\alpha }^i αi也要随之改变,而改变 α i \boldsymbol{\alpha }^i αi可能会破坏稀疏编码过程的稀疏性,因此工程上需要特别处理: α i \boldsymbol{\alpha }^i αi仅保留非零元素, E i \boldsymbol{E}_i Ei仅保留 d i \boldsymbol{d}_i di α i \boldsymbol{\alpha }^i αi非零元素的乘积项,如图所示。

在这里插入图片描述

此时优化问题变为 min ⁡ d i , α ′ i ∥ E i ′ − d i α ′ i ∥ F 2 \min _{\boldsymbol{d}_i,\boldsymbol{\alpha }^{'i}}\left\| \boldsymbol{E}_{i}^{'}-\boldsymbol{d}_i\boldsymbol{\alpha }^{'i} \right\| _{F}^{2} mindi,αi Eidiαi F2,在KSVD算法中对 E i ′ \boldsymbol{E}_{i}^{'} Ei进行奇异值分解

E i ′ = U Σ V = [ u max ⁡ ⋯ u d ] [ σ max ⁡ ⋱ 0 ] [ v max ⁡ T ⋮ v m ′ T ] \boldsymbol{E}_{i}^{'}=\boldsymbol{U\varSigma V}=\left[ \begin{matrix} \boldsymbol{u}_{\max}& \cdots& \boldsymbol{u}_d\\\end{matrix} \right] \left[ \begin{matrix} \sigma _{\max}& & \\ & \ddots& \\ & & 0\\\end{matrix} \right] \left[ \begin{array}{c} \boldsymbol{v}_{\max}^{T}\\ \vdots\\ \boldsymbol{v}_{m'}^{T}\\\end{array} \right] Ei=UΣV=[umaxud] σmax0 vmaxTvmT

其中奇异值矩阵按照奇异值从大到小排列,此时令 d i = u max ⁡ \boldsymbol{d}_i=\boldsymbol{u}_{\max} di=umax α ′ i = σ max ⁡ v max ⁡ T \boldsymbol{\alpha }^{'i}=\sigma _{\max}\boldsymbol{v}_{\max}^{T} αi=σmaxvmaxT即可达到原问题的近似最小值。按上述步骤遍历字典原子即可更新字典。

4 Python实现

核心代码如下所示

def KSVD(Y, D, X, K):
    for k in range(K):
        index = np.nonzero(X[k, :])[0]
        if len(index) == 0:
            continue
        r = (Y - np.dot(D, X))[:, index]
        U, S, V_T = np.linalg.svd(r, full_matrices=False)
        D[:, k] = U[:, 0]
        for j, xj in enumerate(index):
            X[k, xj] = S[0] * V_T[0, j]
    return D, X

def train(Ks, epoches):
	images = []
	# 初始化D,从Y中随机选取K列作为D
	U, _, _ = np.linalg.svd(Y)
	D = U[:, :K]
	for epoch in range(epoches):
	    # 每一次更新D之后由OMP算法求得稀疏矩阵X
	    X = linear_model.orthogonal_mp((D-D.min())/(D.max()-D.min()), Y)
	    # KSVD算法更新D
	    D, X = KSVD(Y, D, X, K)
	    # 计算损失并输出
	    L2_loss = (((Y - np.dot(D, X)) ** 2) ** 0.2).mean()
	# 最后一轮更新D之后还需要拟合一下新的X
	X = linear_model.orthogonal_mp((D-D.min())/(D.max()-D.min()), Y)
	# 重构图片
	rebuilded_image = np.clip(np.dot((D-D.min())/(D.max()-D.min()), X).reshape(*image.shape), 0, 1)
	images.append(rebuilded_image)
	return images

以图像重构为例说明字典学习的作用,如下所示,可以看出字典中原子量越多,重构效果越好。可以通过选择适当原子量的字典,实现对图像的压缩

在这里插入图片描述

完整代码通过下方名片联系博主获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

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

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

相关文章

基于Java+Swing实现的代码统计工具

基于JavaSwing实现的代码统计工具 一、系统介绍二、功能展示三、代码展示四、其他系统五、获取源码 一、系统介绍 系统可以统计C&#xff0c;C&#xff0c;Java代码的空行、注释、有效代码行数 使用说明 直接运行main方法即可 运行环境&#xff1a;idea jdk 二、功能展示 …

2023全国滋补健康产业创新发展交流会八月相聚上海

简介&#xff1a;2023全国滋补健康产业创新发展交流会&#xff0c;愉极2023年“优秀滋补品牌商”精英班&鲜炖鱼胶师培训考核班 愉极&燕博会 2023年“优秀滋补品牌商”精英班&鲜炖鱼胶师培训考核班 前言 在国家提倡全民养生&#xff0c;国民健康意识增强&#xf…

【从零开始学微服务】09.为什么需要服务注册发现?

大家好&#xff0c;欢迎来到万猫学社&#xff0c;跟我一起学&#xff0c;你也能成为微服务专家。 微服务调用的问题 在上一篇文章中&#xff0c;我们深入探讨了微服务架构的引入过程。在这种架构中&#xff0c;原本庞大且复杂的单体应用会根据业务需求被拆分成一系列精简的小型…

MySQL空间数据学习

一、MySQL空间数据形式 MKT 已知文本&#xff08;WKT&#xff09;格式。用已知文本&#xff08;WKT&#xff09;表示几何值是为用ASCII格式交换几何数据而设计的。OpenGIS规范提供了一个BackusNaur语法&#xff0c;它指定了写入WKT值的正式生成规则。 MKB 已知二进制&#xff…

【真题解析】系统集成项目管理工程师 2021 年上半年真题卷(综合知识)

本文为系统集成项目管理工程师考试(软考) 2021 年上半年真题(全国卷),包含答案与详细解析。考试共分为两科,成绩均 ≥45 即可通过考试: 综合知识(选择题 75 道,75分)案例分析(问答题 4 道,75分)综合知识(选择题*75)1-10 题11-20 题21-30 题31-40 题41-50 题51-60 …

LNMP环境

目录 安装Nginx MySQL PHP安装搭建 部署Discuz&#xff01;社区论坛 安装Nginx 1、关闭防火墙 2、安装依赖包 3、解包 4、配置路径编译安装 5、优化路径创建软连接 6、添加Nginx服务 7、赋权 8、启动服务 9、检查是否安装成功 MySQL 1、安装依赖环境 2、创建运行用户 3、…

带你深入学习“反射”技术

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

Git入门到精通全套教程(涵盖GitHub\Gitee码云)

一个小时搞定Git 对应的视频教程讲解&#xff1a; Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云&#xff09;_哔哩哔哩_bilibili 目录 1. 为什么要使用版本控制软件 2. 市场上的版本控制软件 3. Git简介 3.1Git简介 3.2集中式vs分布式 3.3作用 二、Git的使用…

【MySQL基础 | 第二篇】数据处理之分组查询

前言 查询语句属于DML&#xff08;Data Manipulation Language&#xff09;数据操作语言的其中一种&#xff0c;用于从数据库中提取所需的数据。通过灵活的条件和组合&#xff0c;查询语句帮助用户有效地获取、过滤和排序数据&#xff0c;满足各种信息需求。 文章目录 前言1️⃣…

阿里企业邮箱注册申请流程(图文详解)

2023阿里云企业邮箱注册流程&#xff0c;企业邮箱分为免费版、标准版、集团版和尊享版&#xff0c;阿里云百科分享企业邮箱版本区别&#xff0c;企业邮箱收费标准&#xff0c;以及阿里企业邮箱详细注册开通流程&#xff0c;包括阿里云账号注册、实名认证、企业邮箱版本区别及选…

基于Fedora 38的Ultramarine Linux 38推出了System76的调度器

导读Ultramarine Linux 38已经发布&#xff0c;它是另一个基于Fedora Linux的发行版&#xff0c;具有Budgie、GNOME、KDE Plasma和 elementary OS的Pantheon桌面环境的四个版本。 基于Fedora Linux 38&#xff0c;但默认使用Linux内核6.3&#xff0c;Ultramarine Linux 38&…

人工智能的几个概念

一、什么是人工智能 人工智能不是最近几年才兴起的&#xff0c;它已经有几十年发展的历史&#xff0c;下面是业内公认的一种关于人工智能概念的定义&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff1a;缩写为AI&#xff0c;是研究开发用于模拟、…

报名开启!2023大模型应用创新挑战赛来啦

满脑创意无处落地&#xff1f; 满身技术无人看到&#xff1f; 飞桨邀你开启大模型应用创意挑战之旅 寻找那个最具创意的你 资深开发者指导&#xff0c;助你落地“黄金”项目 大模型从业者合作交流 找到创业道路上的partner 高额奖金、技能提升、优质项目 官方扶持落地&#xff…

MCScanX安装与使用

为什么要写这篇文章&#xff1a; 最近因为朋友需要用到MCScanX画两个物种的共线性点图&#xff0c;但是发现搜到的blog中所提供的安装方法都不太相同&#xff0c;且在都会出现或多或少的问题&#xff0c;所以来找我帮忙&#xff0c;我搜到的所有blog安装链接http://chibba.pgml…

Flink的TopN

1.为什么定时器的时间设置为&#xff0c;窗口的end值1ms就可以呢&#xff1f; 因为定时器是下游&#xff0c;水位线是取的多个上游的最小的&#xff0c; 水位线是跟在数据后面的&#xff0c;所以当定时器的时间到达时&#xff0c;上游一定计算完成了&#xff0c;并且数据已经在…

LLM - 搭建 DrugGPT 结合药物化学分子知识的 ChatGPT 系统

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131384199 论文&#xff1a;DrugChat: Towards Enabling ChatGPT-Like Capabilities on Drug Molecule Graphs DrugChat&#xff0c;基…

便携式明渠流量计比对装置的基本要求

便携式明渠流量计比对装置的基本要求有哪些&#xff1f; 符合国标要求中对流量监测单元的比对&#xff08;每2分钟采集一次数据&#xff0c;连续记录 6次数据与在线流量计数据进行液位误差比对&#xff0c;测量10分钟内的流量数据与在线流量计数据进行流量误差比对&#xff09;…

springboot服务时间筛选问题,同一服务部署在本地和Linux服务器,同样的时间筛选数据不一致

项目场景&#xff1a; springboot项目通过时间筛选数据、 问题描述 时间筛选问题&#xff0c;同一服务部署在本地和Linux服务器&#xff0c;同样的时间筛选数据不一致 接收的参数 JsonFormat(pattern "yyyy-MM-dd") private Date queryDate;服务器打印日志出来的…

Linux常用命令——fsck命令

在线Linux命令查询工具 fsck 检查并且试图修复文件系统中的错误 补充说明 fsck命令被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化&#xff0c;可用fsck指令尝试加以修复。 语法 fsck(选项)(参数)选项 -a&#xff1a;自动修复文件系统&#xff0c;不询…

JavaScript数组遍历的各种方式

目录 第一种方式&#xff08;for循环&#xff09; 第二种方式&#xff08;forEach 遍历&#xff09; 第三种方式&#xff08;for...in&#xff09; 第四种方式&#xff08;for...of&#xff09; 第五种方式&#xff08;map方法遍历&#xff09; 六、性能对比 第一种方式&…