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

news/2024/11/17 2:43:38/

目录

  • 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:continuer = (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, Xdef train(Ks, epoches):images = []# 初始化D,从Y中随机选取K列作为DU, _, _ = np.linalg.svd(Y)D = U[:, :K]for epoch in range(epoches):# 每一次更新D之后由OMP算法求得稀疏矩阵XX = linear_model.orthogonal_mp((D-D.min())/(D.max()-D.min()), Y)# KSVD算法更新DD, X = KSVD(Y, D, X, K)# 计算损失并输出L2_loss = (((Y - np.dot(D, X)) ** 2) ** 0.2).mean()# 最后一轮更新D之后还需要拟合一下新的XX = 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.ppmy.cn/news/580899.html

相关文章

年轻人存款难题:挑战与可能

近日&#xff0c;有一项调查结果显示&#xff0c;大约五分之一的年轻人的存款不超过一万元。并且&#xff0c;存款达到十万元似乎成为一个“坎”&#xff0c;因为超过这个金额的存款已经超过了53.7%的人。这个令人关注的数据引发了广泛的讨论&#xff0c;让我们深入探讨一下年轻…

MySQL数据库——主从复制

目录 前言一、读写分离概述1. 什么是读写分离&#xff1f;2. 为什么要读写分离呢&#xff1f;3. 什么时候要读写分离&#xff1f;4. 主从复制与读写分离5. mysq支持的复制类型6. 主从复制的工作过程7. MySQL主从复制延迟 二、主从复制配置方法 前言 在实际的生产环境中&#x…

【TWS API使用教程2】---如何使用 TWS API在ubuntu和windows上分别设置contract、获取contract详细信息、设置order、下单、获取持仓信息、获取账户信息

这个是接下来几篇文章的汇总,先提供代码,大家尝试运行之后,没有问题了,再详细了解下,这些代码究竟有什么意义。 在测试的过程中,发现同样的代码,在ubuntu上和在windows上表现是不一样的 具体就是在windows上,基本上每两秒都会断联一次,导致运行的过程中,需要经常重新…

百款 TWS蓝牙耳机 蓝牙天线拆机分析与仿真

上一篇&#xff1a;贴片陶瓷天线原理 与 HFSS模型建立和仿真分析总结 &#xff08;原创文章&#xff0c;转载请与作者联系&#xff09; 0.前言 TWS是英文True Wireless Stereo的缩写&#xff0c;即真正无线立体声的意思&#xff0c;TWS技术同样也是基于蓝牙芯片技术的发展。 …

TWS耳机及相关蓝牙协议

TWS - True Wireless Stereo&#xff0c;即真正无线立体声 优势&#xff1a;真无线结构&#xff1b; 劣势&#xff1a;关键是蓝牙的传输方案不稳定&#xff1a; 1、传输稳定性差&#xff0c;容易受到外界干扰&#xff1b; 2、主副耳机信号不同步&#xff1b; 3、音质差&#x…

BES2500SDK TWS组队逻辑及触发机制详述

芯片上电初始化 跑到app_init&#xff08;再apps.cpp文件里面&#xff09; 代码断如下&#xff1a; int app_init(void) { int nRet 0; struct nvrecord_env_t *nvrecord_env; #ifdef POWER_ON_ENTER_TWS_PAIRING_ENABLED bool need_check_key false; #else …

【TWS API 使用教程8】一个基于TWS API的简单的程序化策略

使用前面的TWS API写成的simpleClient做了一个简单的策略,供大家参考。不要用于实盘,大概率会亏损。 TWS API相关的教程 【TWS API使用教程1】—如何在自己创建的client和TWS之间创建一个连接,并请求当前的时间 【TWS API使用教程2】—如何使用 TWS API在ubuntu和windows上…

高通Linux Android 平台中的蓝牙功能学习 (6)-- TWS介绍

概要: 介绍了手机中针对免提配置文件 (HFP) 和高级音频传输配置文件 (A2DP) 的 Qualcomm TrueWireless Stereo + (TWS+) 支持、主机端免提音频网关 (AG) 的高级设计、以及 Android OS/Bluedroid 协议栈中的 A2DP SRC 角色(使手机能够执行诸如向 TWS+ 耳塞式耳机传输 语音/音…