• 5星
5.97MB weixin_42683394 2021-10-02 16:51:05
• 1KB qq_36596540 2020-04-23 16:06:43
• 76KB weixin_38697940 2021-05-27 01:20:29
• 29KB weixin_38692100 2021-05-28 11:44:10
• ## ksvd:用python编写的ksvd实现-源码 Python

8KB weixin_42116650 2021-05-14 12:52:11
• 4KB rogerjunli 2021-02-10 09:30:18
• 122KB weixin_42666807 2021-10-02 00:40:07
• 8KB weixin_38509504 2021-05-23 21:39:15
• 5.97MB weixin_42696271 2021-09-11 07:04:09
• 592KB weixin_38537777 2021-06-12 00:48:25
• ## KSVD算法详解ppt ksvd

5星
2.18MB qq_25948161 2015-02-10 15:04:56
• 17KB weixin_38665093 2021-05-28 11:41:52
• ## 基于KSVD的数据重构模型 KSVD

2KB weixin_41274367 2020-05-09 12:30:31
• ## 基于KSVD的多描述图像编码 研究论文

2.8MB weixin_38704565 2021-03-15 16:53:26
• ## 基于matlab的KSVD实现 KSVD

1KB u013547778 2015-04-23 15:51:56
• 636KB weixin_38744153 2019-09-12 10:17:37
• 2.1MB qq_33817522 2018-12-24 20:34:52
• 4星
5.97MB bluesmile2012 2014-01-13 16:21:37
• 12KB yhcwjh 2020-06-18 08:59:25
• 649KB weixin_38743968 2019-09-10 16:30:52
• 18KB m0_60703264 2021-08-23 15:00:53
• 5.97MB xheng_12 2019-07-26 10:22:14
• 3KB weixin_41311617 2018-12-04 10:15:06
• 847KB qq_24599599 2018-04-09 21:11:56
• ## KSVD KSVD

K-SVD Rachel Zhang   1. k-SVD introduction 1. K-SVD usage: Design/Learn a dictionary adaptively to betterfit the model and achieve sparse signal representations. 2. Main Problem: ...Y = DX...
K-SVD
Rachel Zhang

1. k-SVD introduction
1.     K-SVD usage:
Design/Learn a dictionary adaptively to betterfit the model and achieve sparse signal representations.
2.     Main Problem:
Y = DX
Where Y∈R(n*N), D∈R(n*K), X∈R(k*N), X is a sparse matrix.
N is # of samples;
n is measurement dimension;
K is the length of a coefficient.

2. Derivation from K-Means
3.       K-Means:
1)       The sparse representationproblem can be viewed as generalization of the VQ objective. K-SVD can be viewed as generalization of K-Means.
2)       K-Means algorithm for vectorquantization:
Dictionary of VQ codewords is typically trained using K-Means algorithm.
When Dictionary D is given, each signal is represented as its closestcodeword (under l2-norm distance). I.e.
Yi = Dxi
Where xi = ej is a vector from the trivial basis,with all zero entries except a one in the j-th position.
3)       VQ的字典训练：
K-Means被视作一个sparse coding的特例，在系数x中只有一个非零元，MSE定义为：

$E= \sum_{i=1}^K {e_i}^2 = \left \| Y-DX \right \|_F^2$

所以VQ的问题是：
$\min_{D,X}\left \{ \left \| Y-DX \right \|_F^2 \right \}\,\,\,\,\, subject \, to\,\,\,\,\, \forall i, x_i = e_k\, for\, some\, k$

4)       K-Means 算法实现的迭代步骤：
1） 求X的系数编码
2） 更新字典

3. K-SVD，generalizing the K-Means
4.       Objective function
$\min_{D,X}\left \{ \left \| Y-DX \right \|_F^2 \right \}\,\,\,\,\, subject \, to\,\,\,\,\, \forall i, \left \| x_i \right \|\leqslant \epsilon$

5.       K-SVD的求解
Iterative solution: 求X的系数编码(MP/OMP/BP/FOCUSS),更新字典(Regression).
K-SVD优化：也是K-SVD与MOD的不同之处，字典的逐列更新：
假设系数X和字典D都是固定的，要更新字典的第k列dk，领稀疏矩阵X中与dk相乘的第k行记做$x_T^k$，则目标函数可以重写为：

上式中，DX被分解为K个秩为1的矩阵的和，假设其中K-1项都是固定的，剩下的1列就是要处理更新的第k个。矩阵Ek表示去掉原子dk的成分在所有N个样本中造成的误差。

6.       提取稀疏项
如果在5.中这一步就用SVD更新dk和$x_T^k$，SVD能找到距离Ek最近的秩为1的矩阵，但这样得到的系数$x_T^k$不稀疏，换句话说，$x_T^k$与更新dk前$x_T^k$的非零元所处位置和value不一样。那怎么办呢？直观地想，只保留系数中的非零值，再进行SVD分解就不会出现这种现象了。所以对Ek和$x_T^k$做变换，$x_T^k$中只保留x中非零位置的，Ek只保留dk和$x_T^k$中非零位置乘积后的那些项。形成$E_R^k$，将$E_R^k$做SVD分解，更新dk。

7.       总结
K-SVD总可以保证误差单调下降或不变，但需要合理设置字典大小和稀疏度。
在我的实验中，随着字典的增大，K-SVD有整体效果提升的趋势，但不一定随着稀疏度的增大使得整体误差下降。

8.       Reference:
1)       K-SVD: An algorithm fordesigning overcomplete dictionaries for sparse representation (IEEE Trans. OnSignal Processing 2006)
2)       From sparse solutions of systemsof equations to sparse modeling of signals and images (SIAM Review 2009 240')

关于Machine Learning更多的学习资料与相关讨论将继续更新，敬请关注本博客和新浪微博Rachel____Zhang.


展开全文
cyh153296 2018-07-19 11:16:57
• 1000KB m0_61181362 2021-09-23 23:28:26
• 4星
13KB lhbmfh 2014-07-27 19:42:50
• ## 字典学习（KSVD）详解 KSVD 字典学习 算法 机器学习

SVD 在理解KSVD之前，首先需要了解的是SVD（奇异值分解）。学习过矩阵理论的同学对SVD肯定是不陌生的。 在了解奇异值分解之前，需要了解一下特征值分解。所谓特征值分解，是为了提取出一个矩阵的特征。特征值，特征...
关于字典学习
对于一个事物，我们如何表征它呢？很明显，这个事物是有特征的，或者说，这个事物它是由许多个不同的特征经过一定的组合而形成的。字典学习的目标是提取实物的最本质特征。用字典来表征该事物的特征。（用尽可能少的资源表示尽可能多的知识，这种表示还能带来一个附加的好处，即计算速度快） 当提取出了事物的特征，这就相当于一种降维。 对于如何理解字典学习，我想到这样一个例子，比如一堆三维向量，找寻它们的特征，实际上，我们可以用三维直角坐标系（x，y，z三个单位向量）来表征它们，这三个向量通过组合可以表示所有的三维向量，它们就是我们的字典，再搭配上每个三维向量的x，y，z组合方式（稀疏编码），也就可以还原成那一堆三维向量了。
SVD
在理解KSVD之前，首先需要了解的是SVD（奇异值分解）。学习过矩阵理论的同学对SVD肯定是不陌生的。 在了解奇异值分解之前，需要了解一下特征值分解。所谓特征值分解，是为了提取出一个矩阵的特征。特征值，特征向量。这都是我们老生常谈的问题了。这里对于一个方阵

A

A

，我们又这样的定义：

A

x

=

λ

x

Ax=\lambda x

,其中

λ

\lambda

是

A

A

的特征值，

x

x

就是我们

A

A

的对应

λ

\lambda

的特征向量。当矩阵可以相似对角化时，矩阵

A

A

便可以被分解为：

A

=

Q

Λ

Q

−

1

A=Q\Lambda Q^{-1}

其中

Q

Q

是矩阵

A

A

的特征向量组成的矩阵，

Λ

\Lambda

是一个对角阵，其对角线上的元素是

A

A

的特征值。 一个矩阵其实就是一个线性变换，当我们将矩阵成以向量之后，其实就是对这个向量进行了线性变换。对应我们的特征值分解，分解的

Λ

\Lambda

矩阵是一个对角阵，我们将其中的特征值从大到小排列，这些特征值对应的特征向量就是描述这个矩阵从主要到次要的变化方向。通过特征值分解得到前N个特征向量，那么就对应了这个矩阵最主要的N个变化方向。利用这前N个变化方向，我们就可以近似矩阵，也就是提取这个矩阵的特征。总的来说，特征向量表示特征，特征值表示特征的重要程度，可以把它在应用中当做权重。这种分解方法很好，但是也有特别明显的局限性，那就是它只适合方阵。 所以下面就要引出更适合一般矩阵的分解方式。也就是奇异值分解方法。我们在课上学过，这里我们设矩阵

A

A

是

m

∗

n

m*n

的。奇异值分解形式为：

A

=

U

Σ

V

T

A=U\Sigma V^{T}

其中

U

U

是一个

m

∗

m

m*m

的酉矩阵，其里面的向量是相互正交的，我们称它们为做左奇异向量；

Σ

\Sigma

是一个

m

∗

n

m*n

的矩阵，只有对角线上的元素非零，这些值就是我们的奇异值，

V

T

V^{T}

是一个

n

∗

n

n*n

的矩阵，和一样，它也是酉矩阵，里面的向量也是互相正交的，称为右奇异向量。我们将矩阵

A

A

的转置乘上它自己，便会得到一个方阵，用这个方阵来求特征值：

A

T

A

v

i

=

λ

i

v

i

A^{T}Av_{i}=\lambda_{i}v_{i}

这里的

v

i

v_{i}

就是右奇异向量，

σ

i

=

λ

i

\sigma_{i}=\sqrt{\lambda_{i}}

u

i

=

A

v

i

σ

i

u_{i}=\frac{Av_{i}}{\sigma_{i}}

同理

v

i

v_{i}

是我们的左奇异向量。我们这里的

σ

\sigma

就是奇异值。在矩阵中，我们让它以从小到大的顺序排列。在大多数情况下，我们会得到很好的结果，就是少部分的奇异值的和占了全部奇异值的和的大多数，那么我们就可以用前

t

t

个奇异值来近似的描述矩阵。 对于一个矩阵，我们可以选取

U

U

的前

t

t

列，

Σ

\Sigma

的前

t

t

个奇异值，

V

T

V_{T}

的前

t

t

行，它们分别相乘累加的结果就可以近似表示我们的

A

A

矩 阵，这不仅是一种近似，也相当于一种降维。
字典学习
字典学习主要是将原始样本

Y

Y

给分解中字典矩阵

D

D

和稀疏码矩阵

X

X

，这里的稀疏码

X

X

自然是十分稀疏，数据量比较少。字典

D

D

里便存储了原始样本

Y

Y

中的特征，而稀疏码则是用表示原始样本使用特征来组合成自己的方式。 理想情况是

Y

m

∗

n

=

D

m

∗

s

∗

X

s

∗

n

Y_{m*n}=D_{m*s}*X_{s*n}

当

s

s

远小于

m

m

与

n

n

时，

D

D

和

X

X

的维度会远低于原来的

Y

Y

。当我们把矩阵

X

s

∗

n

X_{s*n}

的看做列向量形式

(

x

1

,

x

2

.

.

.

x

n

)

(x_{1},x_{2}...x_{n})

，然后

Y

=

D

∗

(

x

1

,

x

2

.

.

.

x

n

)

=

D

∗

x

1

，

D

∗

x

2

，

.

.

.

，

D

∗

x

n

Y=D*(x_{1},x_{2}...x_{n})=D*x_{1}，D*x_{2}，...，D*x_{n}

这里

D

∗

x

i

D*x_{i}

就是Y中的第

i

i

列向量，我们可以用一个示意图来理解。  （图片来源Network Sparse Representation: Decomposition, Dimensionality-Reduction and Reconstruction）
求解过程
为了得到

D

D

和

X

X

，这里需要进行求解。这里提出一个优化问题：

m

i

n

D

,

X

∥

Y

−

D

X

∥

F

2

,

s

.

t

.

∀

i

,

∥

x

i

∥

0

≤

ε

min_{D,X}\left\|Y-DX\right\|^{2} _{F} ,s.t. \forall i, \left\|x_{i}\right\|_{0} \leq \varepsilon

该优化问题就是在约束条件

x

i

x_{i}

的零范数尽量小的情况下，原矩阵与分解的字典矩阵和稀疏码矩阵乘积的差值的矩阵二范数最小，此时的的字典矩阵

D

D

和稀疏码矩阵

X

X

是多少。
说白了就是，稀疏码矩阵比较稀疏的情况下，追求

Y

Y

和

D

X

DX

差值最小(可以以通过

D

X

DX

来还原出

Y

Y

)，求

D

D

和

X

X

。（这里可以把目标函数和约束函数调换位置求解，本质上没有什么区别，只是这一种更容易理解） 然后就是如何求解这个优化问题了，这里的求解思路是对字典矩阵的每一列和稀疏码矩阵的每一行来进行更新，多次迭代，从而最终实现

D

D

与

X

X

的求解。
这里假设是在迭代过程中的某一步，字典矩阵和稀疏矩阵都是有的，只是还不是最终结果。那么此时假设要更新的是字典的第i列和稀疏矩阵的第i行。优化目标公式是上面提到过的

m

i

n

D

,

X

∥

Y

−

D

X

∥

F

min_{D,X}\left\|Y-DX\right\| _{F}

这里需要对该公式进行变形，首先将

D

X

DX

写成列向量乘以行向量形式（为什么这样写呢，因为我们这里要更新的就是字典的第i列和稀疏矩阵的第i行）。从而，优化目标公式变成了

m

i

n

D

,

X

∥

Y

−

∑

j

=

1

s

d

j

x

j

∥

F

min_{D,X}\left\|Y-\sum ^{s}_{j=1}d_{j}x_{j}\right\| _{F}

然后将要更新的

d

i

,

x

i

d_{i},x_{i}

抽取出来，公式变成了

m

i

n

D

,

X

∥

Y

−

∑

j

=

1

,

j

≠

i

s

d

j

x

j

−

d

i

x

i

∥

F

min_{D,X}\left\|Y-\sum ^{s}_{j=1,j\neq i}d_{j}x_{j}-d_{i}x_{i}\right\| _{F}

此时将前面两项合并，则就得到了这样一个式子

m

i

n

D

,

X

∥

E

i

−

d

i

x

i

∥

F

min_{D,X}\left\|E_{i}-d_{i}x_{i}\right\| _{F}

此时优化问题就变成了这个。来分析一下这个式子，首先

E

i

E_{i}

是一个矩阵，

d

i

,

x

i

d_{i},x_{i}

也是一个矩阵，它们是同维度的；然后

E

i

E_{i}

是和

d

i

,

x

i

d_{i},x_{i}

毫不相关的，因为它并没有计算有关

i

i

的值。 这里我们可以这样理解：

D

X

DX

是字典矩阵乘以稀疏码矩阵，就是我们恢复的结果，那么

Y

−

D

X

Y-DX

就是原始矩阵与我们恢复矩阵的误差。而这个误差项再减去

d

i

,

x

i

d_{i},x_{i}

就是不考虑字典矩阵第

i

i

行和稀疏码矩阵第

i

i

行的误差。当执行更新字典矩阵第

i

i

行和稀疏码矩阵第

i

i

行时，更新的标准是，用新的

d

i

,

x

i

d_{i},x_{i}

去弥补其他行列造成的误差。（有点贪心的感觉）
这里的

E

i

E_{i}

是很好算的，直接

Y

−

∑

j

=

1

,

j

≠

i

s

d

j

x

j

Y-\sum ^{s}_{j=1,j\neq i}d_{j}x_{j}

即可求得。不过这里还没这么简单，用于我们要进行多次迭代，有一个问题出现了，你如何保证稀疏码第

i

i

行很稀疏呢（很多0呢），当你更新了字典矩阵第

i

i

行和稀疏码矩阵第

i

i

行，然后继续往后更新，进入下一次大的迭代，然后再来更新稀疏码矩阵第

i

i

行，此时的

E

i

E_{i}

都不一样了，此时，你完全无法控制第

i

i

行的稀疏情况，有可能会更稀疏，有可能会不变，有可能会更稠密，这是完全不可控的。 所以在这里，要进行一个操作，就是根据之前的

x

i

x_{i}

的情况，将

x

i

x_{i}

中非零元素提取出来形成新的行向量

x

i

′

{x_{i}'}

，然后将

x

i

x_{i}

非零元素与

E

i

E_{i}

对应的列提取出来形成新的误差矩阵

E

i

′

{E_{i}}'

，显然，

E

i

′

{E_{i}}'

的维度和

d

i

x

i

′

d_{i}{x_{i}'}

的维度还是一致的。这里给出一个示意图：  （图片来源于https://www.cnblogs.com/endlesscoding/p/10090866.html，其中

E

k

E_{k}

就是本文中的

E

i

E_{i}

，）
（这里我写的不是很清楚，即使看了示意图可能也不是很理解，也有小伙伴问这里，为什么要将Xi中的非零元素提取出来形成行的Xi’，并构建新的Ei’呢？所以我在文章末尾进行了补充，该补充内容建议在阅读完全文之后对此处抱有疑惑再阅读，当然，如果理解了也可以不读）
然后我们的优化目标公式就变成了

m

i

n

D

,

X

∥

E

i

′

−

d

i

x

i

′

∥

F

2

min_{D,X}\left\|{E_{i}}'-d_{i}{x_{i}}'\right\|^{2} _{F}

对这个式子进行求解。 这个步骤的意义在于什么呢？在更新稀疏码第

i

i

行时，选择继承之前该行稀疏码的稀疏性，本次更新我们只更新这个稀疏码的非零元素。这样就保证了一个什么问题呢，就是之前是零的元素在更新之后一定还是零，之前非零的元素呢，这就不好说，可能继续非零，也可能为零，这要取决于计算结果。 总之，这里提取非零元素与非零列，就保证了稀疏码只会朝着不变或者更稀疏的方向发展，而不会更稠密。然而，这也是有问题的，你只更新非零元素，虽然提取除了

E

i

′

{E_{i}}'

，但它和

E

i

E_{i}

，是不一样的，无论你最后求得的

d

i

x

i

′

d_{i}{x_{i}}'

有多么解决

E

i

;

′

{E_{i}};'

，它和

E

i

E_{i}

的误差始终存在，无法解决。这就是保证了稀疏性，而损失了准确性，只能寄希望靠更多的迭代次数去弥补。
之后就是来求解

m

i

n

D

,

X

∥

E

i

′

−

d

i

x

i

′

∥

F

2

min_{D,X}\left\|{E_{i}}'-d_{i}{x_{i}}'\right\|^{2} _{F}

这是一个最小二乘问题，也就是你只能找

d

i

,

x

i

′

d_{i},{x_{i}}'

去逼近

E

i

′

{E_{i}}'

，而无法直接求出其结果。这里就采用SVD（奇异值分解，前面讲的终于派上用场了）来求解。 求解的步骤就是将

E

i

′

{E_{i}}'

进行奇异值分解，得到

E

i

′

=

U

Σ

V

T

{E_{i}}'=U\Sigma V^{T}

然后取

U

U

的第一列作为新的

d

i

d_{i}

，而

Σ

V

T

\Sigma V^{T}

乘积结果的第一行作为新的

x

i

′

{x_{i}}'

（其实就是

Σ

\Sigma

的主对角线第一个元素乘以

V

T

V^{T}

的i第一行（这里

Σ

\Sigma

中的奇异值按从大到小顺序来排列））。 至于为什么这样取呢？这在矩阵理论中是叫做秩一逼近。对于

E

i

′

=

U

Σ

V

T

{E_{i}}'=U\Sigma V^{T}

，我们可以将其表示如下

E

i

′

=

U

Σ

V

T

=

σ

1

u

1

v

1

T

+

.

.

.

+

σ

k

u

k

v

k

T

{E_{i}}'=U\Sigma V^{T}=\sigma_{1}u_{1}v_{1}^{T}+...+\sigma_{k}u_{k}v_{k}^{T}

即分解成k个小矩阵，它们分别是

U

U

的第

i

i

行和

Σ

\Sigma

的第

i

i

个奇异值和

V

T

V^{T}

的第

i

i

个列向量的成绩，它们是同维度的矩阵。 同时因为奇异值分解的性质，

u

1

,

u

2

.

.

.

u

m

u_{1},u_{2}...u_{m}

是相互正交的，同样，

v

1

,

v

2

.

.

.

v

n

v_{1},v_{2}...v_{n}

是相互正交的，所以我们在计算

E

i

{E_{i}}

的

F

F

范数的平方时，便会有这样一个结果

∥

E

i

′

∥

F

2

=

σ

1

2

∥

u

1

v

1

T

∥

+

.

.

.

σ

k

2

∥

u

k

v

k

T

∥

=

σ

1

2

+

.

.

.

σ

k

2

\left\|{E_{i}}' \right\|^{2}_{F} =\sigma^{2}_{1}\left\|u_{1}v^{T}_{1}\right\|+...\sigma^{2}_{k}\left\|u_{k}v^{T}_{k}\right\|=\sigma^{2}_{1}+...\sigma^{2}_{k}

可以得到这样一个结果，因为

Σ

\Sigma

中的奇异值是从大到小排列，而

σ

1

2

\sigma^{2}_{1}

占据了

∥

E

i

′

∥

F

2

\left\|{E_{i}}' \right\|^{2}_{F}

的大部分能量，所以用第一个小矩阵来近似原矩阵会让误差尽可能小，这样也能达到比较好的逼近效果。同时，这个小矩阵已经为我们分解好了

u

k

v

k

T

u_{k}v^{T}_{k}

，所以我们选择这样的方式来进行求解。
至此，以上便是求解的全部过程。
不过还存在一个问题，就是我们假设更新时建立在字典和稀疏码已经存在情况下，那么第一次迭代时字典怎么办呢。我们可以采用对原始矩阵直接进行奇异值分解，取左歧义矩阵的前

k

k

列作为字典，而稀疏码甚至可以选择全是1的矩阵，一开始误差较大，反正迭代次数够的话也是可以解决的。
补充
这里接着上面解释为什么要将Xi中的非零元素提取出来形成行的Xi’，并构建新的Ei’来进行求解的问题。 答曰： 这里是假设是某一次迭代更新字典的某一列和稀疏码某一行时，你现在的稀疏码假设是[0,0,1,0,1,1]，现在你要对残差Ei来进行奇异值分解，用最大能量来逼近对吧，但如果你直接对Ei进行分解，你怎么保证你的稀疏码更稀疏呢，无法保证，你可能会得到[1,2,3,1,1,1]这样的稀疏码，这种稀疏码比之前的还更离谱，一点都不稀疏，我们进行字典学习的目的有二，一是为了使分解的结果逼近原始样本，二是让稀疏码尽量稀疏，显然现在的更新无法满足我们的目的。所以我们采取这样方式，对于稀疏码[0,0,1,0,1,1]，为了保证之后更新的稀疏码往更稀疏的方向走，我们把其中非零元素提取出来[0,0,1,0,1,1]就提取出[1,1,1]，也就是第2,4,5列，对应的Ei也提取出2,4,5列形成Ei’，那么此时再奇异值分解，得到的新稀疏码假设是[a,b,c]，那么我们来更新稀疏码，就是[0,0,a,0,b,c]，（原来的0不动，只更新非零元素），那么无论a,b,c为何值，我们的这行稀疏码的稀疏程度都不会越更新越差，只会往稀疏性越好或不变的方向走。
参考资料
本文是我阅读了部分博客之后写的，其中KSVD的核心就在于它的对每行每列进行更新的方式上，求解其实并不是重点。 本文主要参考了 https://www.cnblogs.com/endlesscoding/p/10090866.html https://blog.csdn.net/jzz3933/article/details/90599816
展开全文
qq_34687559 2020-07-14 17:17:07
• 5.6MB weixin_42696271 2021-09-11 04:13:45

...