1.提出问题:什么是稀疏表示
假设我们用一个MN的矩阵表示数据集Y,每一行代表一个样本,每一列代表样本的一个属性,一般而言,该矩阵是稠密的,即大多数元素不为0。
稀疏表示的含义是,寻找一个系数矩阵X(K
N)以及一个字典矩阵D(MK),使得DX尽可能的还原Y,且X尽可能的稀疏。X便是Y的稀疏表示。

算法思想

算法求解思路为交替迭代的进行稀疏编码和字典更新两个步骤. K-SVD在构建字典步骤中,K-SVD不仅仅将原子依次更新,对于原子对应的稀疏矩阵中行向量也依次进行了修正. 不像MOP,K-SVD不需要对矩阵求逆,而是利用SVD数学分析方法得到了一个新的原子和修正的系数向量.

固定系数矩阵X和字典矩阵D,字典的第k个原子为dk,同时dk对应的稀固定系数矩阵X和字典矩阵D,字典的第k个原子为d_k,同时d_k对应的稀固定系数矩阵X和字典矩阵D,字典的第k个原子为dk​,同时dk​对应的稀
疏矩阵为X中的第k个行向量xTk.假设当前更新进行到原子dk,样本矩阵和疏矩阵为X中的第k个行向量x^k_T. 假设当前更新进行到原子d_k,样本矩阵和疏矩阵为X中的第k个行向量xTk​.假设当前更新进行到原子dk​,样本矩阵和字典逼近的误差为:

在得到当前误差矩阵Ek后,需要调整dk和XTk,使其乘积与Ek的误差尽可能的小.在得到当前误差矩阵E_k后,需要调整d_k和X^k_T,使其乘积与E_k的误差尽可能的小.在得到当前误差矩阵Ek​后,需要调整dk​和XTk​,使其乘积与Ek​的误差尽可能的小.
如果直接对dk和XTk进行更新,可能导致xTk不稀疏.所以可以先把原有向量xTk中零如果直接对d_k和X^k_T进行更新,可能导致x^k_T不稀疏. 所以可以先把原有向量x^k_T中零如果直接对dk​和XTk​进行更新,可能导致xTk​不稀疏.所以可以先把原有向量xTk​中零
元素去除,保留非零项,构成向量xRk,然后从误差矩阵Ek中取出相应的列向量,元素去除,保留非零项,构成向量x^k_R,然后从误差矩阵E_k中取出相应的列向量,元素去除,保留非零项,构成向量xRk​,然后从误差矩阵Ek​中取出相应的列向量,
构成矩阵EkR.对EkR进行SVD(SingularValueDecomposition)分解,有EkR=构成矩阵E^R_k. 对E^R_k进行SVD(Singular Value Decomposition)分解,有E^R_k=构成矩阵EkR​.对EkR​进行SVD(SingularValueDecomposition)分解,有EkR​=
UΔVT,由U的第一列更新dk,由V的第一列乘以Δ(1,1)所得结果更新xRk.UΔV^T,由U的第一列更新d_k,由V的第一列乘以Δ(1,1)所得结果更新x^k_R.UΔVT,由U的第一列更新dk​,由V的第一列乘以Δ(1,1)所得结果更新xRk​.

代码

import numpy as np
import matplotlib.pyplot as plt
from numpy import *
import scipy.io as sio
import random
from sklearn import linear_model
import scipy.misc
from PIL import Image
def esErrDic(data,recons):m,n=data.shapeesErr=0for i in range(m):for j in range(n):esErr+=(data[i][j]-recons[i][j])**2return esErr/(m*n)
class KSVD(object):def __init__(self, n_components, max_iter=100, tol=1e-6,n_nonzero_coefs=None):"""稀疏模型Y = DX,Y为样本矩阵,使用KSVD动态更新字典矩阵D和稀疏矩阵X:param n_components: 字典所含原子个数(字典的列数):param max_iter: 最大迭代次数:param tol: 稀疏表示结果的容差:param n_nonzero_coefs: 稀疏度"""self.dictionary = Noneself.sparsecode = None self.max_iter = max_iter self.tol = tol self.n_components = n_components self.n_nonzero_coefs = n_nonzero_coefsdef _initialize(self, y):"""初始化字典矩阵"""u, s, v = np.linalg.svd(y)self.dictionary = u[:, :self.n_components]def _update_dict(self, y, d, x):"""使用KSVD更新字典的过程"""for i in range(self.n_components):index = np.nonzero(x[i, :])[0]#选出Xk中非零的元素下标if len(index) == 0:continued[:, i] = 0r = (y - np.dot(d, x))[:, index] u, s, v = np.linalg.svd(r, full_matrices=False) d[:, i] = u[:, 0].T x[i, index] = s[0] * v[0, :]return d, xdef fit(self, y):"""KSVD迭代过程"""self._initialize(y)for i in range(self.max_iter):x = linear_model.orthogonal_mp(self.dictionary, y, n_nonzero_coefs=self.n_nonzero_coefs)e = np.linalg.norm(y - np.dot(self.dictionary, x)) if e < self.tol:breakself._update_dict(y, self.dictionary, x)self.sparsecode = linear_model.orthogonal_mp(self.dictionary, y, n_nonzero_coefs=self.n_nonzero_coefs) return self.dictionary, self.sparsecode
if __name__ == '__main__':file='G:/lecture of grade one/pattern recognition/trial_two/train_data2_807802844.mat'Img=loadData(file)#字典学习部分代码,其中KSVD的参数就是原子个数,可修改ksvd = KSVD(100)dictionary, sparsecode = ksvd.fit(Img['Data'])recons=dictionary.dot(sparsecode)err=esErrDic(Img['Data'],recons)'''#测试KSVD代码的调试代码,选择一张图片,用自己编写的KSVD对其进行字典学习image =Image.open('/home/swh/Downloads/scene.jpeg')image = np.array(image)image=image[:,:,0]im_ascent = image.astype('float32')#im_ascent = scipy.misc.ascent().astype(np.float)ksvd = KSVD(30) dictionary, sparsecode = ksvd.fit(im_ascent) plt.figure() plt.subplot(1, 2, 1) plt.imshow(im_ascent) plt.subplot(1, 2, 2) recon=dictionary.dot(sparsecode)plt.imshow(recon) plt.show()'''

K-SVD字典学习算法相关推荐

  1. ILS-LDA基于迭代最小二乘的字典学习算法的学习

    1 最近一直在拜读斯坦万格大学的Karl Skretting教授的文章.字典学习算法中响当当的一些算法都出自K.S.团队,例如MOD.其字典学习算法家族中的另一份成员便是iterative least ...

  2. 视觉机器学习20讲-MATLAB源码示例(14)-字典学习算法

    视觉机器学习20讲-MATLAB源码示例(14)-字典学习算法 1. 字典学习算法 2. Matlab仿真 3. 仿真结果 4. 小结 1. 字典学习算法 字典学习(Dictionary Learni ...

  3. 字典学习算法K-SVD详解

    字典学习算法K-SVD详解 在博客见到一个大牛写的,很清楚!记得点赞哈哈哈! 转载:https://www.cnblogs.com/endlesscoding/p/10090866.html

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

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

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

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

  6. 机器学习(十三)k-svd字典学习

    k-svd字典学习 原文地址:http://blog.csdn.net/hjimce/article/details/50810129 作者:hjimce 一.字典学习 字典学习也可简单称之为稀疏编码 ...

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

    深入浅出字典学习2(Dictionary Learning) 文章目录 一.理解K-SVD字典学习 二.K-SVD字典学习算法概述 2.1.随机初始化字典D 2.2.固定字典,求取每个样本的稀疏编码 ...

  8. 深度学习(三十)贪婪深度字典学习

    贪婪深度字典学习 原文地址:http://blog.csdn.net/hjimce/article/details/50876891 作者:hjimce 一.相关理论 近几年深度学习声名鹊起,一个又一 ...

  9. 泛化误差深入理解计算机系统,泛化误差界指导的鉴别字典学习

    摘要: 在提高字典鉴别能力的过程中,最大间隔字典学习忽视了利用重新获得的数据构建分类器的泛化性能,不仅与最大间隔原理有关,还与包含数据的最小包含球(MEB)半径有关.针对这一事实,提出泛化误差界指导的 ...

最新文章

  1. 一篇值得收藏的正则表达式文章
  2. 【基于libRTMP的流媒体直播之 AAC、H264 推送】
  3. Cassandra 数据分区
  4. 文思海辉口碑很差_文思海辉·金融打造全自动、100%话务覆盖的智能质检系统
  5. python list查找元素下标_Python 查找list中的某个元素的所有的下标方法
  6. html如何控制弹窗位置,控制弹窗展示顺序
  7. php怎么跳转别的手机浏览器,JavaScript_JS脚本根据手机浏览器类型跳转WAP手机网站(两种方式),随着移动互联网的不断普及, - phpStudy...
  8. kmp 模式匹配算法学习笔记
  9. 七种主流平面板式介绍
  10. 一个程序员眼中的项目经理
  11. 机器学习文本特征提取
  12. 毕业之后, 这些年薪50万+的90后程序员都经历了什么?
  13. c#实现Udp通信(四)--UPD大数据量接收(异步接收)
  14. 云计算工程师面试题集锦,云计算面试题及答案
  15. win7+VS2015+OpenCV3.20的搭建
  16. 滚动轴承故障特征频率计算公式
  17. 云手机哪个好用最流畅?红手指、双子星、雷电云手机性价比推荐排行
  18. 阿龙的学习笔记---CMake指定C++版本
  19. JavaScript mongodb(数据库)复杂值
  20. 商品新零售行业——客户价值分析驾驶舱(附详细操作)

热门文章

  1. 全国计算机考试一级在线模拟,2017全国计算机一级考试模拟
  2. vue 文件及描述信息一起上传_vue+element 实现选取文件,提交上传全部表单信息(同步)...
  3. [itext] java生成pdf
  4. java中访问控制修饰符什么含义_关于Java中访问控制修饰符的来由及浅解
  5. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
  6. Mosquitto感知客户端上下线的方法
  7. glob在php中的意思,PHP函数glob介绍
  8. 小程序禁止左右拖动_网课视频快进小技巧
  9. 3件Unreal Engine 3不得不说的故事
  10. 为基于spring-boot的应用添加根据运行时操作系统环境来提示用户选择active profile的功能...