由于工作需要,最近刚刚看了一些K-SVD的介绍,这里给自己做一下小节。

K-SVD我们一般是用在字典学习、稀疏编码方面,它可以认为是K-means的一种扩展,http://en.wikipedia.org/wiki/K-means_clustering

我们进行K-SVD的目标是要构造一个过完备的矩阵,然后选择最稀疏的系数解使得矩阵可以对其训练集相似的目标向量进行稀疏表示。

就字典学习来说,我们所设计的字典目标要满足(还有第二种情况我们先不考虑):

其中$Y$是你要表示的信号($n\times N$),$D$是字典,也就是过完备矩阵($n\times K$),$X$为系数矩阵($K\times N$)。这里需要说明的是$X$与$Y$是按列对应,所表示的含义是字典中的条目(每一列)按照$X_i$为系数进行线性组合,就会得到$Y$。而我们的目的是在已知$X$和$Y$的情况下更新字典来满足上述条件。

构造字典的算法分为两步:稀疏表示和字典更新。

稀疏表示:

首先要有一个初始化的字典$D$,然后我们将$DX$看做$D$中的每列与$X$中对应每行的乘积,这样就将$DX$给分片,即$DX=\sum_{i=1}^K{d_i}{x_i^T}$

字典更新:

这里我们的思想是逐次更新字典向量,通过K次迭代完成字典的一次更新。我们在剥离第K个条目之后,上述表达式会产生一个"空洞",而我们要做的就是寻找新的$d_i$和$x_i$来填补这个"空洞"来更加趋于收敛情况,所使用的方法便是SVD

上式中的E是误差矩阵,对E做SVD分解,$E=U\Lambda V^T$,其中U和V的列矢量均是正交基,$\Lambda$是对角矩阵。若$\Lambda$的对角元素从大到小排列,则表示E的能量分量主轴在相应几个正交方向上由大到小分配,如此我们取U的第一个列向量来表示$d_i$,取V的第一个列向量与$\Lambda$的第一个元素的成绩表示$x_i$,这样就完成了字典一个条目的更新。

但是这里我们要注意的是,X是一个稀疏矩阵,我们通过上述方法得到的X有可能不满足稀疏条件,处理方法是我们只计算$x_i$中的非零列,可以理解为我们用$x_i$中非零元素构建一个新的矩阵$\Omega$($N\times M$),M是$x_i$中的非零元素个数,N是字典中每个向量的维数。然后我们上式进行变化:

$$E_k^R=E_k\Omega, x_R^k=x_T^k\Omega$$

然后我们对$E_k^R$进行SVD分解,按照上面思路,得到新的字典条目$d_i$。这里做一下说明,上面乘以新的矩阵$\Omega$其实就是把字典中没有做贡献的向量给移除掉,从而不会造成直接分解之前的向量不稀疏的情况了。

在字典更新时,有可能出现极限情况,即$x_i=0$,如此E收缩后也为0矩阵,即无法进行SVD,解决方法是计算误差矩阵E的每一列的平方,找到平方和最大的列也就是误差最大的列,被表示为最小列填充该字典列,以此最大限度的减小误差,让字典可以继续有效更新。

参考:

http://home.ustc.edu.cn/~zywvvd/files/K-SVD.pdf

http://blog.nrdang.com/?p=35

http://blog.csdn.net/abcjennifer/article/details/8693342

Aharon M, Elad M, Bruckstein A. -svd: An algorithm for designing overcomplete dictionaries for sparse representation[J]. Signal Processing, IEEE Transactions on, 2006, 54(11): 4311-4322.

浅谈K-SVD的更多相关文章

  1. 浅谈k短路算法

    An Old but Classic Problem 给定一个$n$个点,$m$条边的带正权有向图.给定$s$和$t$,询问$s$到$t$的所有权和为正路径中,第$k$短的长度. Notice 定义两 ...

  2. 浅谈Hybrid技术的设计与实现

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发 ...

  3. Spring缓存框架原理浅谈

    运维在上线,无聊写博客.最近看了下Spring的缓存框架,这里写一下 1.Spring 缓存框架 原理浅谈 2.Spring 缓存框架 注解使用说明 3.Spring 缓存配置 + Ehcache(默 ...

  4. 【转】Android Canvas的save(),saveLayer()和restore()浅谈

    Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏: ...

  5. 浅谈算法和数据结构: 七 二叉查找树 八 平衡查找树之2-3树 九 平衡查找树之红黑树 十 平衡查找树之B树

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的 ...

  6. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

  7. 浅谈开源项目Android-Universal-Image-Loader(Part 3.1)

    本文转载于:http://www.cnblogs.com/osmondy/p/3266023.html 浅谈开源项目Android-Universal-Image-Loader(Part 3.1) 最 ...

  8. 浅谈Feature Scaling

    浅谈Feature Scaling 定义:Feature scaling is a method used to standardize the range of independent variab ...

  9. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  10. 浅谈Base64编码

    浅谈Base64编码 我打赌当你见到Base64这个词的时候你会觉得在哪里见过,因为在你能够上网看到这篇文章的时候你已经在后台使用它了.如果您对二进制数有所了解,你就可以开始读它了. 打开一封Emai ...

随机推荐

  1. msmms (一) sms与mms区别

    sms与mms区别 SMS,Short Messaging Service短信业务,可以通过手机等移动设备发送文本型短信.SMS这个术语最早在80年代初期出现,但一直到了90年代初才开始进入商用市场, ...

  2. 关于Java类加载双亲委派机制的思考(附一道面试题)

    预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...

  3. cocos基础教程(5)数据结构介绍之cocos2d::Vector

    cocos2d::Vector cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器.cocos2d::Vector<T>中的元素是按序存取的,它的低层实 ...

  4. Linux瑞士军刀:密码管理Keeweb

    导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...

  5. Linux常用热键(持续更新)

    (这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) --圣诞节怎么过, --略过. 今天装ubuntu的时候把windows覆盖了, 凌乱,TX童 ...

  6. [BZOJ1370][Baltic2003]Gang团伙

    [BZOJ1370][Baltic2003]Gang团伙 试题描述 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,而且满足: 1. 我朋友的朋友是我的朋友: 2. 我敌人的敌人是我的朋友: ...

  7. Coursera台大机器学习课程笔记14 -- Validation

    这节课是接着上节的正则化课程的,目的也是为了防止overfitting. 第一小节讲了模型的选择,前面讲了很多模型,那么如何做出正确的选择呢?我们的目标是选择最小的Eout目标函数.首先应避免视觉化选 ...

  8. VS2010中如何查看DLL的导出接口

    看<VC++动态链接库(DLL)编程深入浅出>时,里面提到使用Visual C++的Depends工具可以查看动态链接库中的导出接口.对于VC6.0,VC所带的Depends软件,在VC6 ...

  9. Linux Tomcat 简介

    如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如P ...

  10. Java--时间处理

    package javatest; import java.text.SimpleDateFormat; import java.util.Date; class timeTest{ public s ...