深入浅出字典学习2(Dictionary Learning)

文章目录

  • 一、理解K-SVD字典学习
  • 二、K-SVD字典学习算法概述
    • 2.1、随机初始化字典D
    • 2.2、固定字典,求取每个样本的稀疏编码
    • 2.3、逐列更新字典、并更新对应的非零编码

一、理解K-SVD字典学习

  • 字典学习也可简单称之为稀疏编码,字典学习偏向于学习字典 D\mathbf DD。从矩阵分解角度,看字典学习过程:给定样本数据集 Y\mathbf YY,Y\mathbf YY 的每一列表示一个样本;字典学习的目标是把 Y\mathbf YY 矩阵分解成 D\mathbf DD、X\mathbf XX 矩阵:
    Y≈DX(1)\mathbf Y \approx \mathbf D \mathbf X\tag{1}Y≈DX(1)
  • 同时满足约束条件:X\mathbf XX 尽可能稀疏,同时 D\mathbf DD 的每一列是一个归一化向量。D\mathbf DD 称之为字典,D\mathbf DD 的每一列称之为原子;X\mathbf XX 称之为编码矢量、特征、系数矩阵;字典学习可以有三种目标函数形式
  • 第一种形式
    D,X=argmin⁡12∥Y−DX∥2+λ⋅∥X∥0(2)\mathbf D, \mathbf X=\operatorname{argmin} \frac{1}{2}\|\mathbf Y-\mathbf D \mathbf X\|^{2}+\lambda \cdot\|\mathbf X\|_{0}\tag{2}D,X=argmin21​∥Y−DX∥2+λ⋅∥X∥0​(2) 注意:这种形式因为 L0L_0L0​ 难以求解,所以很多时候用 L1L_1L1​ 正则项替代近似。
  • 第2种形式
    D,X=arg⁡min⁡D,X{∥X∥0}st.∥Y−DX∥2≤ε(3)\begin{array}{l}{\mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\left\{\| \mathbf X\|_{0}\right\}} \\ {\text {st.} \quad\| \mathbf Y- \mathbf D \mathbf X\|^{2} \leq \varepsilon}\end{array}\tag{3}D,X=D,Xargmin​{∥X∥0​}st.∥Y−DX∥2≤ε​(3)注意:εεε是重构误差所允许的最大值。
  • 第3种形式
    D,X=arg⁡min⁡D,X∥Y−DX∥2st. ∥X∥0≤L(4)\begin{array}{l}{ \mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\| \mathbf Y- \mathbf D \mathbf X\|^{2}} \\ {\text {st. }\| \mathbf X\|_{0} \leq L}\end{array}\tag{4}D,X=D,Xargmin​∥Y−DX∥2st. ∥X∥0​≤L​(4) 注意:LLL 是一个常数,稀疏度约束参数,上面三种形式相互等价!

因为目标函数中存在两个未知变量D,X\bf D,XD,X,K-SVD是字典学习的一种经典算法,其求解方法跟lasso差不多,固定其中一个,然后更新另外一个变量,交替迭代更新。

  • 1. 如果 D\bf DD 的列数少于 Y\bf YY 的行数,就相当于欠完备字典,类似于PCA降维;
  • 2. 如果 D\bf DD 的列数大于 Y\bf YY 的行数,称之为超完备字典;
  • 3. 如果刚好等于,那么就称之为完备字典;
  • 假设现在有了一个N∗TN*TN∗T的过完备字典 D\bf DD(比如前面所述图像傅里叶变换的所有频率的波),一个要表示的对象 yyy(要还原的图像),求一套系数xxx,使得y=Dxy=\bf Dxy=Dx,这里 yyy 是一个已知的长为 NNN 的列向量,x\bf xx 是一个未知的长为 TTT 的列向量,解方程!这是一个 TTT 个未知数,NNN 个方程的方程组,T>NT>NT>N,所以是有无穷多解的,线性代数中这样的方程很熟悉了。 上面我就随便举了个 N=5,T=8N=5, T=8N=5,T=8 的例子,用来随便感受下。
    [12345]=[1234567801000100001000010001000000001000]×[x1x2x3x4x5x6x7x8]\left[ \begin{array}{l}{1} \\ {2} \\ {3} \\ {4} \\ {5}\end{array}\right]=\left[ \begin{array}{llllllll}{1} & {2} & {3} & {4} & {5} & {6} & {7} & {8} \\ {0} & {1} & {0} & {0} & {0} & {1} & {0} & {0} \\ {0} & {0} & {1} & {0} & {0} & {0} & {0} & {1} \\ {0} & {0} & {0} & {1} & {0} & {0} & {0} & {0} \\ {0} & {0} & {0} & {0} & {1} & {0} & {0} & {0}\end{array}\right]×\left[ \begin{array}{c}{x_1} \\ {x_2} \\ {x_3} \\ {x_4} \\ {x_5} \\ {x_6} \\ {x_7} \\ {x_8}\end{array}\right]⎣⎢⎢⎢⎢⎡​12345​⎦⎥⎥⎥⎥⎤​=⎣⎢⎢⎢⎢⎡​10000​21000​30100​40010​50001​61000​70000​80100​⎦⎥⎥⎥⎥⎤​×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡​x1​x2​x3​x4​x5​x6​x7​x8​​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤​
  • 这里可以引出一个名词,ill-posed problem(不适定问题),即有多个满足条件的解,无法判断哪个解更加合适,这是更“落地”的应用场景,inverse problem(逆问题),比如图像去噪,从噪声图中提取干净图。于是需要做一个约束。
  • 加限制条件,要求 x\bf xx 尽可能稀疏,怎么“稀疏”呢?就是 x\bf xx 的 000 尽可能多,即 norm(x>0)norm(x> 0)norm(x>0)(零范数:非0元素个数)尽可能小。这样就有唯一解了吗?也还不是,如何能“约束”出各位合适的解,如何解,正是稀疏表示所研究的重点问题。比如后来有证明DDD满足一定条件情况下xxx满足 norm(x,1)norm(x,1)norm(x,1)即可还原原始数据等,这有不少大神开启这个领域的故事这里就不讲了。

二、K-SVD字典学习算法概述

  • 给定训练数据 Y\bf YY,Y\bf YY 的每一列表示一个样本,我们的目标是求解字典 D\bf DD 的每一列(原子)。

2.1、随机初始化字典D

  • 从样本集 Y\bf YY 中随机挑选 kkk 个样本,作为 D\bf DD 的原子;并且初始化编码矩阵 X\bf XX 为 000 矩阵。

2.2、固定字典,求取每个样本的稀疏编码

  • 编码过程采用如下公式:
    D,X=arg⁡min⁡D,X{∥X∥0}st.∥Y−DX∥2≤ε(5)\begin{array}{l}{\mathbf D, \mathbf X=\underset{ \mathbf D, \mathbf X}{\arg \min }\left\{\| \mathbf X\|_{0}\right\}} \\ {\text {st.} \quad\| \mathbf Y- \mathbf D \mathbf X\|^{2} \leq \varepsilon}\end{array}\tag{5}D,X=D,Xargmin​{∥X∥0​}st.∥Y−DX∥2≤ε​(5)
  • εεε 是重构误差所允许的最大值。假设我们的单个样本是向量 y\bf yy,为了简单起见我们就假设原子只有这4个,也就是字典D=[α1、α2、α3、α4]\bf D=[\alpha_1、\alpha_2、\alpha_3、\alpha_4]D=[α1​、α2​、α3​、α4​],且 D\bf DD 是已经知道的;我们的目标是计算 y\bf yy 的编码 x\bf xx,使得 x\bf xx 尽量的稀疏。
  • (1)、首先从α1、α2、α3、α4\alpha_1、\alpha_2、\alpha_3、\alpha_4α1​、α2​、α3​、α4​中找出与向量 y\bf yy 最近的那个向量,也就是分别计算点乘:α1∗y、α2∗y、α3∗y、α4∗y\bf α_1*y、α_2*y、α_3*y、α_4*yα1​∗y、α2​∗y、α3​∗y、α4​∗y 然后求取最大值对应的原子ααα。
  • (2)、假设 α2∗y\bf α_2*yα2​∗y 最大,那么我们就用 α2α_2α2​,作为我们的第一个原子,然后我们的初次编码向量就为:x1=(0,b,0,0)x_1=(0,b,0,0)x1​=(0,b,0,0)b是一个未知参数。
  • (3)、求解系数b:y−b∗α2=0\mathbf y-b*α_2=0y−b∗α2​=0 方程只有一个未知参数bbb,是一个高度超静定方程,求解最小二乘问题。
  • (4)、然后我们用x1x_1x1​与α2α_2α2​相乘重构出数据,然后计算残差向量:y’=y−b∗α2\mathbf y’=\mathbf y-b*\mathbf α_2y’=y−b∗α2​ 如果残差向量y’满足重构误差阈值范围ε,那么就结束,否则就进入下一步;
  • (5)、计算剩余的字典α1、α3、α4α_1、α_3、α_4α1​、α3​、α4​与残差向量y’\bf y’y’的最近的向量,也就是计算
    α1∗y’、α3∗y’、α4∗y’\bf α_1*y’、α_3*y’、α_4*y’α1​∗y’、α3​∗y’、α4​∗y’然后求取最大值对应的向量ααα,假设α3∗y’α_3*\mathbf y’α3​∗y’为最大值,那么就令新的编码向量为:x2=(0,b,c,0)x_2=(0,b,c,0)x2​=(0,b,c,0) b、cb、cb、c是未知参数。
  • (6)、求解系数b、c,b、c,b、c,于是我们可以列出方程:
    y−b∗α2−c∗α3=0\mathbf y-b*α_2-c*α_3=0y−b∗α2​−c∗α3​=0方程中有两个未知参数b、cb、cb、c,我们可以进行求解最小二乘方程,求得b、cb、cb、c。
  • (7)、更新残差向量 y’\mathbf y’y’:y’=y−b∗α2−c∗α3\mathbf y’=\mathbf y-b*\mathbf α_2-c*\mathbf α_3y’=y−b∗α2​−c∗α3​
  • 如果 y’\mathbf y’y’ 的模长满足阈值范围,那么就结束,否则就继续循环,就这样一直循环下去。

2.3、逐列更新字典、并更新对应的非零编码

  • 通过上面那一步,我们已经知道样本的编码。接着我们的目标是更新字典、同时还要更新编码。K-svd采用逐列更新的方法更新字典,就是当更新第kkk列原子的时候,其它的原子固定不变。假设我们当前要更新第kkk个原子αkαkαk,令编码矩阵XXX对应的第kkk行为xkxkxk,则目标函数为:
    ∥Y−DX∥2=∥Y−∑j=1Kαj⋅xj∥2=∥(Y−∑j=kαj⋅xj)−αk⋅xk∥2=∥Ek−αk⋅xk∥2\|\mathbf Y-\mathbf D \mathbf X\|^{2}=\left\|\mathbf Y-\sum_{j=1}^{\mathrm{K}} \alpha_{j} \cdot \mathbf x_{j}\right\|^{2}=\left\|\left(\mathbf Y-\sum_{j=k} \alpha_{j} \cdot \mathbf x_{j}\right)-\alpha_{k} \cdot \mathbf x_{k}\right\|^{2}=\left\|\mathbf E_{k}-\alpha_{k} \cdot \mathbf x_{k}\right\|^{2}∥Y−DX∥2=∥∥∥∥∥​Y−j=1∑K​αj​⋅xj​∥∥∥∥∥​2=∥∥∥∥∥∥​⎝⎛​Y−j=k∑​αj​⋅xj​⎠⎞​−αk​⋅xk​∥∥∥∥∥∥​2=∥Ek​−αk​⋅xk​∥2
  • 上面的方程,我们需要注意的是 xk\mathbf x_kxk​ 不是把 X\mathbf XX 一整行都拿出来更新(因为 xk\mathbf x_kxk​ 中有的是零、有的是非零元素,如果全部抽取出来,那么后面计算的时候xk就不再保持以前的稀疏性了),所以我们只能抽取出非零的元素形成新的非零向量,然后 Ek\mathbf E_kEk​ 只保留 xk\mathbf x_kxk​ 对应的非零元素项。
  • 上面的方程,我们可能可以通过求解最小二乘的方法,求解 αkα_kαk​,不过这样有存在一个问题,我们求解的 αkα_kαk​不是一个单位向量,因此我们需要采用svd分解,才能得到单位向量 αkα_kαk​。进过svd分解后,我们以最大奇异值所对应的正交单位向量,作为新的 αkα_kαk​,同时我们还需要把系数编码 xk\mathbf x_kxk​ 中的非零元素也给更新了(根据svd分解)。
    然后算法就在1和2之间一直迭代更新,直到收敛。

参考了作者:

  • https://blog.csdn.net/abc13526222160/article/details/87936459
  • https://blog.csdn.net/hjimce/article/details/50810129

『ML笔记』深入浅出字典学习2(Dictionary Learning)相关推荐

  1. 『ML笔记』深入浅出字典学习1(Dictionary Learning)

    目录 一.预备知识 二.字典学习以及稀疏表示的概要 2.1.我们为什么需要字典学习? 2.2.我们为什么需要稀疏表示? 三.下一节 参考文献 一.预备知识 稀疏向量:假设向量中的元素绝大部分为零元素, ...

  2. 字典学习(Dictionary Learning)

    字典学习(Dictionary Learning) SparseCoder和DictionaryLearning的关系是什么? sklearn.decomposition: Matrix Decomp ...

  3. 【零散知识】字典学习(Dictionary Learning)

    前言: { 之前的神经网络实践还卡在硬件上,不过目前已经打算先使用云设备,下次应该就会继续进行多目标识别的调试.这次就先写一点零散知识. 在专利[1]中我遇到了新的观点--字典学习(Dictionar ...

  4. 『ML笔记』字典学习3(Dictionary Learning,KSVD)

    文章目录 一.字典学习数学模型 1.1.数学描述 1.2.求解问题 1.3.字典学习算法实现 字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客: 奇异值 ...

  5. 稀疏编码(sparse code)与字典学习(dictionary learning)

    Dictionary Learning Tools for Matlab. 1. 简介 字典 D∈RN×KD\in \mathbb R^{N\times K}(其中 K>NK>N),共有 ...

  6. 在线字典学习(Online dictionary learning for sparse coding)-机器学习

    稀疏编码-将数据向量建模为基向量的线性组合,大量地应用于机器学习.神经科学.信号处理及统计学.这篇文章主要学习基向量也就是字典使之适应特定数据,在声音.图像处理领域信号重构与分类是一种近来被证明非常有 ...

  7. SCDL--稀疏编码(sparse code)与字典学习(dictionary learning)

    转载自未雨愁眸  https://www.cnblogs.com/mtcnn/p/9421836.html 1. 简介 字典 D∈RN×K(其中 K>N),共有 k 个原子,x∈RN×1 在字典 ...

  8. 字典学习(Dictionary Learning, KSVD)详解

    注:字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客:<SVD(奇异值分解)小结 >. 1.字典学习思想 字典学习的思想应该源来实际生活中的 ...

  9. 『ML笔记』HOG特征提取原理详解+代码

    HOG特征提取原理详解+代码! 文章目录 一. HOG特征介绍 二. HOG算法具体流程+代码 2.1. 图像灰度化和gamma矫正 2.2. 计算图像像素梯度图 2.3. 在8×8的网格中计算梯度直 ...

最新文章

  1. PhpMyAdmin的简单安装和一个mysql到Redis迁移的简单例子
  2. uuid hashcode_Java UUID hashCode()方法与示例
  3. ios中蓝牙自动连接出现硬件提示框的问题
  4. 日期上午下午怎么用date存_Java12都要出来了,你还在使用Date操作日期吗?
  5. 如何借助log4j把日志写入数据库中
  6. Linux shell__文件操作
  7. PTA 程序设计天梯赛(1~180题)
  8. 语言栏多出EN、JP等键盘布局的解决方案
  9. 《剑指offer》-二叉树的下一个节点
  10. Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Archit
  11. Texpad for Mac v1.9.6 中文版 专业的LaTeX编辑器
  12. 关于极光推送通知栏无法正确显示应用图标
  13. 2020商业风口复盘:巨变下的重构与新生
  14. 机器学习中常见的几种归一化方法以及原因
  15. 怎么正确使用代理IP
  16. ug后处理如何加密_UG后处理修改方法
  17. 22种设计模式——原型模型
  18. Mysql 的自增主键达到最大值,怎么办
  19. html流星雨页面,HTML5炫酷流星雨特效
  20. mono android单选按钮,CLEngine

热门文章

  1. ORACLE集群管理-19c RAC ipv6+IPV4双栈配置实战
  2. 【Dash搭建可视化网站】项目12:全球恐怖主义数据大屏制作步骤详解
  3. 虚拟机扩容——LVM分区
  4. 2021-10-27 利用Excel生成数据图
  5. 智能电视学习软件哪家强?这三款超实用,值得推荐
  6. Linux调试之(二)gdb+vmlinux
  7. mac怎么在关闭盖子后同时断开蓝牙连接,关闭蓝牙
  8. OpenCV 生成水墨质感的图片 黑暗之魂三 只狼:影逝二度
  9. 编程参考 - C语言中将字符串转换为整数
  10. 30个前端开发小技巧