字典学习也是一种数据降维的方法,这里我用到SVD的知识,对SVD不太理解的地方,可以看看这篇博客: 奇异值分解SVD
一、字典学习数学模型
字典学习的思想应该源来实际生活中的字典的概念。字典是前辈们学习总结的精华,当我们需要学习新的知识的时候,不必与先辈们一样去学习先辈们所有学习过的知识,我们可以参考先辈们给我们总结的字典,通过查阅这些字典,我们可以大致学会到这些知识。
为了将上述过程用准确的数学语言描述出来,我们需要将“总结字典”、“查阅字典”做出一个更为准确的描述。就从我们的常识出发:
- 1.我们通常会要求的我们的字典尽可能全面,也就是说总结出的字典不能漏下关键的知识点。
- 2.查字典的时候,我们想要我们查字典的过程尽可能简洁,迅速,准确。即,查字典要快、准、狠。
- 3.查到的结果,要尽可能地还原出原来知识。当然,如果要完全还原出来,那么这个字典和查字典的方法会变得非常复杂,所以我们只需要尽可能地还原出原知识点即可。
下面,我们要讨论的就是如何将上述问题抽象成一个数学问题,并解决这个问题。
1.1、数学描述
我们将上面的所提到的关键点用几个数学符号表示一下:
- “以前的知识”,更专业一点,我们称之为原始样本,用矩阵Y表示;
- “字典”,我们称之为字典矩阵,用D表示,“字典”中的词条,我们称之为原子(atom),用列向量 dk 表示;
- “查字典的方法”,我们称为稀疏矩阵,用 X;
- “查字典的过程”,我们可以用矩阵的乘法来表示,即 DX。
用数学语言描述,字典学习的主要思想是,利用包含 K 个原子 dk的字典矩阵D∈Rm×K,稀疏线性表示原始样本Y∈Rm×n(其中 n 表示样本数,m 表示样本的属性),即有Y=DX(这只是我们理想的情况),其中X∈RK×n为稀疏矩阵,可以将上述问题用数学语言描述为如下优化问题:
D, Xmin∥Y−DX∥F2,s.t. ∀i, ∥xi∥0≤T0(1-1)
或者
D, Xmini∑∥xi∥0,s.t. D, Xmin∥Y−DX∥F2≤ϵ,(1-2)
上式中 X 为稀疏编码的矩阵, xi (i=1,2,⋯,K),为该矩阵中的行向量,代表字典矩阵的系数。
注意:∥xi∥0表示零阶范数,它表示向量中不为0的数的个数。即是想让其尽可能的稀疏,非0的元素尽可能的少。
1.2、求解问题
式(1-1)的目标函数表示,我们要最小化查完的字典与原始样本的误差,即要尽可能还原出原始样本;它的限的制条件 ∥xi∥0≤T0,,表示查字典的方式要尽可能简单,即X要尽可能稀疏。式(1-2)同理。
式(1-1)或式(1-2)是一个带有约束的优化问题,可以利用拉格朗日乘子法将其转化为无约束优化问题
D, Xmin∥Y−DX∥F2+λ∥xi∥1(1-3)
注意: ∥xi∥0表示零阶范数 我们将∥xi∥0用∥xi∥1代替,主要是∥xi∥1更加便于求解。
这里有两个优化变量D, X,为解决这个优化问题,一般是固定其中一个优化变量,优化另一个变量,如此交替进行。式(1-3)中的稀疏矩阵X可以利用已有经典算法求解,如Lasso(Least Absolute Shrinkage and Selection Operator)、OMP(Orthogonal Matching Pursuit),这里我重点讲述如何更新字典D,对更新X不多做讨论。
假设X是已知的,我们逐列更新字典。下面我们仅更新字典的第k列,记dk 为字典D的第k列向量,记 xTk 为稀疏矩阵X的第 k 行向量,那么对式(1-1),我们有:
∥Y−DX∥F2===∥∥∥∥∥Y−j=1∑KdjxTj∥∥∥∥∥F2∥∥∥∥∥∥⎝⎛Y−j̸=k∑djxTj⎠⎞−dkxTk∥∥∥∥∥∥F2∥∥Ek−dkxTk∥∥F2(1-4)
上式中残差: Ek=Y−j̸=k∑djxTj(1-5)
此时优化问题可描述为: dk, xTkmin∥∥Ek−dkxTk∥∥F2(1-6)
因此我们需要求出最优的 dk, xTk,这是一个最小二乘问题,可以利用最小二乘的方法求解,或者可以利用SVD进行求解,这里利用SVD的方式求解出两个优化变量。
但是,在这里我人需要注意的是,不能直接利用 Ek 进行求解,否则求得的新的 xTk 不稀疏。因此我们需要将 Ek中对应的xTk不为0的位置提取出来,得到新的Ek′,这个过程如图2-1所示,这样描述更加清晰。

如上图,假设我们要更新第0列原子,我们将xTk中为零的位置找出来,然后把Ek对应的位置删除,得到Ek′,此时优化问题可描述为:
dk, xTkmin∥∥∥Ek′−dkx′Tk∥∥∥F2(1-7)
因此我们需要求出最优的 dk, x′Tk:
Ek′=UΣVT(1-8)
取左奇异矩阵U的第1个列向量u1=U(⋅,1)作为dk=u1,即dk,取右奇异矩阵的第1个行向量与第1个奇异值的乘积作为x′Tk,即x′Tk=Σ(1,1)VT(1,⋅)。得到x′Tk后,将其对应地更新到原xTk。
注意:式(1-8)所求得的奇异值矩阵 Σ 中的奇异值应从大到小排列;同样也有x′Tk=Σ(1,1)V(⋅,1)T,这与上面x′kT的求法是相等的。
1.3、字典学习算法实现
利用1.2小节稀疏算法求解得到稀疏矩阵X后,逐列更新字典,有如下算法1.1。
| 算法 |
字典学习(K-SVD) |
| 输入 |
原始样本,字典,稀疏矩阵 |
| 输出 |
字典,稀疏矩阵 |
| 1 初始化 |
从原始样本Y∈Rm×n随机取K个列向量或者取它的左奇异矩阵的前K个列向量 {d1,d2,⋯,dK}作为初始字典的原子,得到字典D(0)∈Rm×K。令j=0, 重复下面步骤1-3,直到达到指定的迭代步数,或收敛到指定的误差: |
| 2 稀疏编码 |
利用字典上一步得到的字典D(j),稀疏编码,得到X(j)∈RK×n。 |
| 3 字典更新 |
逐列更新字典D(j),字典的列dk∈{d1,d2,⋯,dK}
|
| 3.1 |
当更新dk时,计算误差矩阵Ek: Ek=Y−∑j̸=kdjxTj.
|
| 3.2 |
取出稀疏矩阵第k个行向量xTk不为0的索引的集合ωk={i1≤i≤n,xTk(i)̸=0} 还有以下的这个:x′Tk={xTk(i)1≤i≤n, xTk(i)̸=0}
|
| 3.3 |
从Ek取出对应ωk不为0的列,得到Ek′, |
| 3.4 |
对Ek′作奇异值分解Ek=UΣVT;取U的第1列更新字典的第k列,即 dk=U(⋅,1), 令:x′Tk=Σ(1,1)V(⋅,1)T;得到x′Tk后,将其对应地更新到原xTk。 |
| 3.5 |
j=j+1 |
最后感谢作者: