K-SVD字典学习及其实现(Python)
算法思想
算法求解思路为交替迭代的进⾏稀疏编码和字典更新两个步骤.K-SVD在构建字典步骤中,K-SVD不仅仅将原⼦依次更新,对于原⼦对应的稀疏矩阵
中⾏向量也依次进⾏了修正.不像MOP,K-SVD不需要对矩阵求逆,⽽是利⽤SVD数学分析⽅法得到了⼀个新的原⼦和修正的系数向量.
固定系数矩阵X和字典矩阵D,字典的第k个原⼦为d
k
,同时d
k
对应的稀疏矩阵为X中的第k个⾏向量x
k
T
.假设当前更新进⾏到原⼦d
k
,样本矩阵和字典
逼近的误差为:
‖Y−DX‖
2
F
=‖Y−
K
∑
j=1d
j
x
j
T
‖
2
F
=‖(Y−
∑
j≠kd
j
x
j
T
)−d
k
x
j
T
‖
2
F
=‖E
k
−d
k
x
k
T
‖
2
F
在得到当前误差矩阵E
k
后,需要调整d
k
和X
k
T
,使其乘积与E
k
的误差尽可能的⼩.
如果直接对d
k
和X
k
T
进⾏更新,可能导致x
k
T
不稀疏.所以可以先把原有向量x
k
T
中零元素去除,保留⾮零项,构成向量x
k
R
,然后从误差矩阵E
k
中取出相应
的列向量,构成矩阵E
R
k
.对E
R
k
进⾏(SingularValueDecomposition)分解,有E
R
k
=UΔV
T
,由U的第⼀列更新d
k
,由V的第⼀列乘以Δ(1,1)所得
结果更新x
k
R
.
Python实现
importnumpyasnp
fromsklearnimportlinear_model
frommatplotlibimportpyplotasplt
classKSVD(object):
def__init__(lf,n_components,max_iter=30,tol=1e-6,
n_nonzero_coefs=None):
"""
稀疏模型Y=DX,Y为样本矩阵,使⽤KSVD动态更新字典矩阵D和稀疏矩阵X
:paramn_components:字典所含原⼦个数(字典的列数)
:parammax_iter:最⼤迭代次数
:paramtol:稀疏表⽰结果的容差
:paramn_nonzero_coefs:稀疏度
"""
nary=None
code=None
_iter=max_iter
=tol
lf.n_components=n_components
lf.n_nonzero_coefs=n_nonzero_coefs
def_initialize(lf,y):
"""
初始化字典矩阵
"""
u,s,v=(y)
nary=u[:,:lf.n_components]
def_update_dict(lf,y,d,x):
"""
使⽤KSVD更新字典的过程
"""
foriinrange(lf.n_components):
index=o(x[i,:])[0]
iflen(index)==0:
continue
d[:,i]=0
r=((d,x))[:,index]
u,s,v=(r,full_matrices=Fal)
d[:,i]=u[:,0].T
x[i,index]=s[0]*v[0,:]
returnd,x
deffit(lf,y):
"""
KSVD迭代过程
"""
lf._initialize(y)
foriinrange(_iter):
x=linear_onal_mp(nary,y,n_nonzero_coefs=lf.n_nonzero_coefs)
e=((nary,x))
ife<:
break
lf._update_dict(y,nary,x)
code=linear_onal_mp(nary,y,n_nonzero_coefs=lf.n_nonzero_coefs)
nary,code
if__name__=='__main__':
im_ascent=().astype()
ksvd=KSVD(300)
dictionary,sparcode=(im_ascent)
()
t(1,2,1)
(im_ascent)
t(1,2,2)
((sparcode))
()
运⾏结果:
Processingmath:100%
本文发布于:2022-12-27 02:30:17,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/37553.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |