『ML笔记』深入浅出字典学习2(Dictionary Learning)
深入浅出字典学习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=argmin12∥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=argminD,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=argminD,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⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡1000021000301004001050001610007000080100⎦⎥⎥⎥⎥⎤×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡x1x2x3x4x5x6x7x8⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
- 这里可以引出一个名词,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=argminD,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)相关推荐
- 『ML笔记』深入浅出字典学习1(Dictionary Learning)
目录 一.预备知识 二.字典学习以及稀疏表示的概要 2.1.我们为什么需要字典学习? 2.2.我们为什么需要稀疏表示? 三.下一节 参考文献 一.预备知识 稀疏向量:假设向量中的元素绝大部分为零元素, ...
- 字典学习(Dictionary Learning)
字典学习(Dictionary Learning) SparseCoder和DictionaryLearning的关系是什么? sklearn.decomposition: Matrix Decomp ...
- 【零散知识】字典学习(Dictionary Learning)
前言: { 之前的神经网络实践还卡在硬件上,不过目前已经打算先使用云设备,下次应该就会继续进行多目标识别的调试.这次就先写一点零散知识. 在专利[1]中我遇到了新的观点--字典学习(Dictionar ...
- 『ML笔记』字典学习3(Dictionary Learning,KSVD)
文章目录 一.字典学习数学模型 1.1.数学描述 1.2.求解问题 1.3.字典学习算法实现 字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客: 奇异值 ...
- 稀疏编码(sparse code)与字典学习(dictionary learning)
Dictionary Learning Tools for Matlab. 1. 简介 字典 D∈RN×KD\in \mathbb R^{N\times K}(其中 K>NK>N),共有 ...
- 在线字典学习(Online dictionary learning for sparse coding)-机器学习
稀疏编码-将数据向量建模为基向量的线性组合,大量地应用于机器学习.神经科学.信号处理及统计学.这篇文章主要学习基向量也就是字典使之适应特定数据,在声音.图像处理领域信号重构与分类是一种近来被证明非常有 ...
- SCDL--稀疏编码(sparse code)与字典学习(dictionary learning)
转载自未雨愁眸 https://www.cnblogs.com/mtcnn/p/9421836.html 1. 简介 字典 D∈RN×K(其中 K>N),共有 k 个原子,x∈RN×1 在字典 ...
- 字典学习(Dictionary Learning, KSVD)详解
注:字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客:<SVD(奇异值分解)小结 >. 1.字典学习思想 字典学习的思想应该源来实际生活中的 ...
- 『ML笔记』HOG特征提取原理详解+代码
HOG特征提取原理详解+代码! 文章目录 一. HOG特征介绍 二. HOG算法具体流程+代码 2.1. 图像灰度化和gamma矫正 2.2. 计算图像像素梯度图 2.3. 在8×8的网格中计算梯度直 ...
最新文章
- PhpMyAdmin的简单安装和一个mysql到Redis迁移的简单例子
- uuid hashcode_Java UUID hashCode()方法与示例
- ios中蓝牙自动连接出现硬件提示框的问题
- 日期上午下午怎么用date存_Java12都要出来了,你还在使用Date操作日期吗?
- 如何借助log4j把日志写入数据库中
- Linux shell__文件操作
- PTA 程序设计天梯赛(1~180题)
- 语言栏多出EN、JP等键盘布局的解决方案
- 《剑指offer》-二叉树的下一个节点
- Predicting Depth, Surface Normals and Semantic Labels with a Common Multi-Scale Convolutional Archit
- Texpad for Mac v1.9.6 中文版 专业的LaTeX编辑器
- 关于极光推送通知栏无法正确显示应用图标
- 2020商业风口复盘:巨变下的重构与新生
- 机器学习中常见的几种归一化方法以及原因
- 怎么正确使用代理IP
- ug后处理如何加密_UG后处理修改方法
- 22种设计模式——原型模型
- Mysql 的自增主键达到最大值,怎么办
- html流星雨页面,HTML5炫酷流星雨特效
- mono android单选按钮,CLEngine