迭代硬阈值类(IHT)算法总结


斜风细雨作小寒,淡烟疏柳媚晴滩。入淮清洛渐漫漫。

雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。

---- 苏轼

更多精彩内容请关注微信公众号 “优化与算法

迭代硬阈值(Iterative Hard Thresholding)算法是求解基于 \({\ell _0}\) 范数非凸优化问题的重要方法之一,在稀疏估计和压缩感知重构等领域应用较多。IHT最初由Blumensath, Thomas等人提出,后来许多学者在IHT算法的基础上不断发展出一些改进算法,如正规化迭代硬阈值算法(Normalized Iterative Hard Thresholding, NIHT)、共轭梯度硬阈值迭代算法(Conjugate Gradient Iterative Hard Thresholding, CGIHT)、基于回溯的硬阈值迭代算法(Backtracking based Iterative Hard Thresholding)等,以及后来与贪婪算法结合产生的一些算法,如硬阈值追踪算法(Hard Thresholding Pursuit, HTP)就是结合子空间追踪算法(SP)和IHT算法的优势得到的。

笔者在此将上述这些算法原理做简要分析,并附上算法和测试代码供参考。

1. 迭代硬阈值算法

1.1 IHT算法描述

以稀疏近似问题为例,介绍IHT算法。对于以下优化问题:

\[\mathop {\min }\limits_{\bf{x}} \left\| {{\bf{y}} - {\bf{Ax}}} \right\|_2^2{\rm{ }} ~~~~~~s.t.~~~~~{\rm{ }}{\left\| {\bf{x}} \right\|_0} \le S~~~~~~~~~~~~(1)
\]

其中 \({\bf{y}} \in {{\bf{R}}^M}\), \({\bf{A}} \in {{\bf{R}}^{M \times N}}\),且 \(M < N\), \({\left\| {\bf{x}} \right\|_0}\) 为 \(\bf{x}\) 的 \({\ell _0}\) 范数,表示 \(\bf{x}\) 中非零元素的个数。由于 \(M < N\), 显然(1)式是一个欠定问题,加上 \({\ell _0}\) 约束,式(1)同时是个组合优化问题,无法在多项式时间复杂度内求解。

为了求解优化问题(1),Blumensath 等人提出了著名的 IHT 算法,其迭代格式为:

\[{{\bf{x}}_{k + 1}} = {H_k}({{\bf{x}}_k} + {{\bf{A}}^{\mathop{\rm T}\nolimits} }({\bf{y}} - {\bf{A}}{{\bf{x}}_k}))~~~~~~~~~~~~~~~~(2)
\]

其中 \({H_S}( \cdot )\) 表示取 \(\cdot\) 中最大的 \(S\) 个非零元素。

式(2)看起来并不复杂,直观上来看就是对(1)式用常数步长的梯度下降法来求解,其中在每次迭代中对更新的结果进行一次硬阈值操作。为什么硬阈值操作+梯度下降可以求解(1)式的 \({\ell _0}\) 范数优化问题呢?文献[1]中作者利用Majorization-Minimization优化框架推导出了(2)式所示迭代公式,并证明了IHT算法在 \({\left\| {\bf{A}} \right\|_2} < 1\) 时,算法能收敛到局部最小值。以下对IHT算法的原理做简要分析。

1.2 Majorization-Minimization优化框架

首先简单介绍一下MM优化框架,实际上MM优化框架是处理非凸优化问题中常见的一种方法,其形式简单,思想优雅。后期关于MM思想再以专题形式进行详细的总结和讨论。

(1) 式的目标函数为

\[{F}({\bf{x}}) = \left\| {{\bf{y}} - {\bf{Ax}}} \right\|_2^2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~(3)
\]

(1) 无法得到一个闭式解,只能用迭代方法来求得一个近似解。

MM优化思想:当目标函数 \(F({\bf{x}})\) 比较难优化时,通常可以选择更容易优化的替代目标函数 \(G({\bf{x}})\),当 \(G({\bf{x}})\) 满足一定的条件时,\(G({\bf{x}})\) 的最优解能够无限逼近原目标函数 \(F({\bf{x}})\) 的最优解。这样的 \(G({\bf{x}})\) 需要满足3个条件:

  1. 容易优化
  2. 对所有 \(\bf{x}\),\(G({\bf{x}}) \ge F({\bf{x_{k}}})\)
  3. \({G_k}({{\bf{x}}_k}) = F({{\bf{x}}_k})\)

在满足 \({\left\| {\bf{A}} \right\|_2} < 1\) 条件时,目标函数 (4) 可用如下替代目标函数来代替:

\[G({\bf{x}},{\bf{z}}) = \left\| {{\bf{y}} - {\bf{Ax}}} \right\|_2^2 - \left\| {{\bf{Ax}} - {\bf{Az}}} \right\|_2^2 + \left\| {{\bf{x}} - {\bf{z}}} \right\|_2^2~~~~~~~(4)
\]

从 (4) 式可以看出,替代目标函数 \(G({\bf{x}},{\bf{z}})\) 是满足MM优化框架中所列条件的。

对式 (4) 展开并化简:

\[\eqalign{
& G({\bf{x}},{\bf{z}}) = \left\| {{\bf{y}} - {\bf{Ax}}} \right\|_2^2 - \left\| {{\bf{Ax}} - {\bf{Az}}} \right\|_2^2 + \left\| {{\bf{x}} - {\bf{z}}} \right\|_2^2 \cr
& = \left( {\left\| {\bf{y}} \right\|_2^2 - 2{{\bf{x}}^{\mathop{\rm T}\nolimits} }{{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{y}} + \left\| {{\bf{Ax}}} \right\|_2^2} \right) - \left( {\left\| {{\bf{Ax}}} \right\|_2^2 - 2{{\bf{x}}^{\mathop{\rm T}\nolimits} }{{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{Az}} + \left\| {{\bf{Az}}} \right\|_2^2} \right) + \left( {\left\| {\bf{x}} \right\|_2^2 - 2{{\bf{x}}^T}{\bf{z}} + \left\| {\bf{z}} \right\|_2^2} \right) \cr
& = \left[ {\left\| {\bf{x}} \right\|_2^2 - \left( {2{{\bf{x}}^T}{\bf{z}} + 2{{\bf{x}}^T}{{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{y}} - 2{{\bf{x}}^T}{{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{Az}}} \right)} \right] + \left\| {\bf{y}} \right\|_2^2 + \left\| {\bf{z}} \right\|_2^2 + \left\| {{\bf{Az}}} \right\|_2^2 \cr
& = \left[ {\left\| {\bf{x}} \right\|_2^2 - 2{{\bf{x}}^T}\left( {{\bf{z}} + {{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{y}} - {{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{Az}}} \right)} \right] + \left\| {\bf{y}} \right\|_2^2 + \left\| {\bf{z}} \right\|_2^2 + \left\| {{\bf{Az}}} \right\|_2^2 \cr
& = \sum\limits_i {\left[ {{\bf{x}}_i^2 - 2{{\bf{x}}_i}\left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]} + \left\| {\bf{y}} \right\|_2^2 + \left\| {\bf{z}} \right\|_2^2 + \left\| {{\bf{Az}}} \right\|_2^2 \cr} \]

上式的最后三项是与 \(\bf{x}\) 无关的项,对优化结果没有影响,那么使 (5) 式最小化等价于下式最小化:

\[G'({\bf{x}},{\bf{z}}) = \sum\limits_i {\left[ {{\bf{x}}_i^2 - 2{{\bf{x}}_i}\left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]} ~~~~~~~~~~~~~~~~~~~~(5)
\]

对 (5) 式进行配方,可以得到:

\[\eqalign{
& G'({\bf{x}},{\bf{z}}) = \sum\limits_i {\left[ {{\bf{x}}_i^2 - 2{{\bf{x}}_i}\left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]} \cr
& = \sum\limits_i {\left[ {{\bf{x}}_i^2 - 2{{\bf{x}}_i}\left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right) + \left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right) - \left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]} \cr
& = \sum\limits_i {\left\{ {{{\left[ {{\bf{x}}_i^2 - \left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]}^2} - {{\left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)}^2}} \right\}} \cr} \]

令 \({{\bf{x}}^*} = {{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} \left( {{\bf{y}} - {\bf{Az}}} \right)\),得:

\[\sum\limits_i {\left[ {{\bf{x}}_i^2 - \left( {{{\bf{z}}_i} + {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{y}} - {\bf{A}}_i^{\mathop{\rm T}\nolimits} {\bf{Az}}} \right)} \right]} = \sum\limits_i {\left\{ {{{\left[ {{{\bf{x}}_i} - {{\bf{x}}^*}} \right]}^2} - {{\left( {{{\bf{x}}^*}} \right)}^2}} \right\}}
\]

即当 \({{{\bf{x}}_i} = {{\bf{x}}^*}}\) 时, \(G'({\bf{x}},{\bf{z}})\) 取得最小值,且最小值等于 \(\sum\limits_i - {\left( {{{\bf{x}}^*}} \right)^2}\) 。

结合式 (1) 中的 \({\ell _0}\) 范数约束项,最小化 \(G'({\bf{x}},{\bf{z}})\) 变成如何使得在 \(\bf{x}\) 中非零元素个数小于 \(S\) 的情况下,最小化 \(\sum\limits_i - {\left( {{{\bf{x}}^*}} \right)^2}\)。很容易想到,只需要保留 \(\bf{x}\) 中前 \(S\) 个最大项即可,这可以通过硬阈值函数来进行操作。

1.3 硬阈值函数

硬阈值函数如下所示:

\[{H_S}({{\bf{x}}_i}) = \left\{ {\matrix{
{0{\rm{~~~~~if~~~}}\left| {{{\bf{x}}_i}} \right| < T} \cr
{{{\bf{x}}_i}{\rm{~~~if~~~}}\left| {{{\bf{x}}_i}} \right| \ge T} \cr
} } \right.\]

其中 \(T\) 为 \(abs\left[ {{{\bf{x}}_k} + {{\bf{A}}^{\mathop{\rm T}\nolimits} }({\bf{y}} - {\bf{A}}{{\bf{x}}_k})} \right]\) 按从大到小排列第 \(S\) 个值的大小。

硬阈值函数如下图所示,这跟前面介绍的软阈值函数类似。

1.4 IHT算法程序

  1. function [hat_x] = cs_iht(y,A,K,itermax,error)
  2. % Email: zhangyanfeng527@gmail.com
  3. % Reference: Blumensath T, Davies M E. Iterative hard thresholding for compressed sensing[J].
  4. % Applied & Computational Harmonic Analysis, 2009, 27(3):265-274.
  5. % y: measurement (observe) vector
  6. % A: measurement (sensing) matrix
  7. % k: sparsity level
  8. % 注意,IHT算法需要norm(A)<1,否则结果很不稳定,甚至不收敛。
  9. u = 1 ; % 默认步长等于1,也可以自己选择
  10. x0 = zeros(size(A,2),1) ; % initialization with the size of original
  11. for times = 1 : itermax
  12. x_increase = A' * (y - A * x0);
  13. hat_x = x0 + u * x_increase ;
  14. [~,pos] = sort(abs(hat_x),'descend');
  15. hat_x(pos(K + 1 : end)) = 0 ; % thresholding, keeping the larges s elements
  16. if norm(y - A * hat_x) < error || norm(x0-hat_x)/norm(hat_x) < error
  17. break ;
  18. else
  19. x0 = hat_x ; % update
  20. end
  21. end

2. NIHT算法

由于IHT算法需要满足 \({\left\| {\bf{A}} \right\|_2} < 1\),因此算法对 ${\left| {\bf{A}} \right|_2} $ 的缩放很敏感,当不满足此条件时,迭代过程会严重动荡甚至不收敛。此外,IHT算法固定步长为1,无法更好的利用自适应步长加速算法的收敛,而通过调节步长来实现算法收敛加速显然不现实。

基于以上原因,Blumensath, Thomas 等人接下来又提出了正规化硬阈值迭代算法,NIHT算法的优势是利用李普希兹连续条件来规范化步长,使算法不受矩阵 \(\bf{A}\) 缩放的影响。同时采用一维线搜索,推导出自适应步长公式,使迭代次数大幅减少。这种方式以少量可不计的计算量增加换来了算法收敛速度的大幅提升。

NIHT算法具体的原理在此不细述,感兴趣的朋友可以参考文献[2],此处供上原文中的算法伪代码:

NIHT算法程序如下:

  1. function [x_p] = cs_niht(y,A,Kitermax,error,par_c)
  2. % Email: zhangyanfeng527@gmail.com
  3. % Reference: Blumensath T, Davies M E. Normalized Iterative Hard Thresholding: Guaranteed Stability and Performance[J].
  4. % IEEE Journal of Selected Topics in Signal Processing, 2010, 4(2):298-309.
  5. % y: measurement (observe) vector
  6. % A: measurement (sensing) matrix
  7. % k: sparsity level
  8. % itermax: max iteration
  9. % error: error threshold
  10. % par_c: 0 < par_c < 1
  11. % NIHT算法的好处是使用自适应的步长,不再像IHT那样要求norm(A)<1
  12. x0 = zeros(size(A,2),1); % initialization with the size of original
  13. g0 = A' * y ;
  14. u = norm(g0) / norm(A * g0) ;
  15. x1 = x0 + u * g0 ;
  16. [~,pos1] = sort(abs(x1),'descend') ;
  17. x1(pos1(K + 1:end)) = 0 ;
  18. gamma0 = find(x1) ;
  19. for times = 1 : itermax
  20. g1 = A' * (y - A * x1) ; % calculate gradient
  21. u = norm(g1(gamma0)) / norm(A(:,gamma0) * g1(gamma0)) ; % calculate step size
  22. x_p = x1 + u * g1 ;
  23. [~,pos1] = sort(abs(x_p),'descend') ;
  24. x_p(pos1(K + 1 : end)) = 0 ;
  25. gamma1 = find(x_p) ; % support set
  26. W = ( norm ( x_p - x1 ) )^2 / ( norm(A * (x_p - x1)) )^2 ;
  27. if isequal(gamma0,gamma1) == 1
  28. elseif isequal(gamma0,gamma1) == 0
  29. % normalized step size
  30. if u <= 1 * W
  31. elseif u > 1 * W
  32. while(u > 1 * W )
  33. u = par_c * u ;
  34. end
  35. x_p = x1 + u * g1 ;
  36. [~,pos1] = sort(abs(x_p),'descend') ;
  37. x_p(pos1(K + 1 : end)) = 0 ;
  38. gamma1 = find(x_p) ;
  39. end
  40. end
  41. if norm(y - A * x_p) < error
  42. break;
  43. else
  44. x1 = x_p ; % update
  45. gamma0 = gamma1 ;
  46. end
  47. end

3. CGIHT算法

尽管NIHT算法在IHT算法的基础上改进了不少地方,但是总的来说,IHT算法和NIHT算法都是基于梯度的算法,只利用了梯度域的信息,而梯度下降法本身收敛速度受限。为了进一步提高IHT算法的收敛速度,Blanchard, Jeffrey D等人提出使用共轭梯度来代替IHT算法中的梯度,并证明了CGIHT算法的收敛速度比IHT算法快。具体可以描述为,IHT算法和NIHT算法是基于梯度的算法,其收敛速度与

\[{{K - 1} \over {K + 1}}
\]

有关,而CGIHT算法使用共轭梯度,其收敛速度与

\[{{\sqrt K - 1} \over {\sqrt K + 1}}
\]

有关。其中 \(K\) 是矩阵 \({{{\bf{A}}^{\mathop{\rm T}\nolimits} }{\bf{A}}}\) 的条件数。很显然后者小于前者,因此其收敛速度更快。

CGIHT算法的原理比较简单,这里不再详细介绍,下面是原文中CGIHT算法的伪代码:

CGIHT算法程序如下:

  1. function [x_p] = cs_cgiht(y,A,s,itermax,error)
  2. % Emial: zhangyanfeng527@gmail.com
  3. % Reference: Blanchard J D, Tanner J, Wei K. CGIHT: conjugate gradient iterative hard thresholding
  4. % for compressed sensing and matrix completion[J].
  5. % Information & Inference A Journal of the Ima, 2015(4).
  6. % y: measurement (observe) vector
  7. % A: measurement (sensing) matrix
  8. % s: sparsity level
  9. % itermax: max iteration
  10. % error: error threshold
  11. x_0 = .2 * ones(size(A,2),1); % initialization with the size of original
  12. g0 = A' * ( y - A * x_0) ;
  13. [~,pos0] = sort(abs(g0),'descend') ;
  14. g0(pos0(s+1:end)) = 0 ;
  15. d0 = g0 ;
  16. u = (norm(g0) / norm(A * d0))^2 ;
  17. x_1 = x_0 + u * d0 ;
  18. [~,pos1] = sort(abs(x_1),'descend');
  19. x_1(pos1(s + 1 : end)) = 0 ;
  20. gamma1 = find(x_1) ;
  21. %% restart CGIHT algorithm
  22. % tao = gamma1 ;
  23. % for times = 1 : itermax
  24. % g1 = A' * ( y - A * x_1) ;
  25. % if isequal(gamma0,tao) == 1
  26. % u = (g1(gamma1)' * g1(gamma1)) / (g1(gamma1)' * A(:,gamma1)' * A(:,gamma1) * g1(gamma1)) ;
  27. % x_p = x_1 + u * g1 ;
  28. % else
  29. % belta = (norm(g1) / (norm(g0)))^2;
  30. % d1 = g1 + belta * d0 ;
  31. % u = (d1(gamma1)' * g1(gamma1)) / (d1(gamma1)' * A(:,gamma1)' * A(:,gamma1) * d1(gamma1)) ;
  32. % x_p = x_1 + u * d1 ;
  33. % end
  34. % [~,index] = sort(abs(x_p),'descend');
  35. % x_p(index(s + 1 : end)) = 0 ;
  36. % if norm(x_p - x_1)/norm(x_p)< error || norm(y - A * x_p)<error
  37. % break;
  38. % else
  39. % gamma0 = gamma1 ;
  40. % gamma1 = index ;
  41. % x_1 = x_p ;
  42. % end
  43. % end
  44. %% CGIHT algorithm
  45. for times = 1 : itermax
  46. g1 = A' * ( y - A * x_1) ;
  47. belta = (norm(g1) / (norm(g0)))^2 ;
  48. d1 = g1 + belta * d0 ;
  49. u = (d1(gamma1)' * g1(gamma1)) / (d1(gamma1)' * A(:,gamma1)' * A(:,gamma1) * d1(gamma1)) ;
  50. x_p = x_1 + u * d1 ;
  51. [~,index] = sort(abs(x_p),'descend') ;
  52. x_p(index(s + 1 : end)) = 0 ;
  53. if norm(x_p - x_1)/norm(x_p)< error || norm(y - A * x_p)<error
  54. break;
  55. else
  56. x_1 = x_p ;
  57. g0 = g1 ;
  58. d0 = d1 ;
  59. end
  60. end
  61. end

4. HTP 算法

硬阈值追踪算法(Hard Thresholding Pursuit HTP)是由SIMON FOUCART提出来的,该算法结合了子空间追踪算法(Subspace Pursuit SP)算法和IHT算法的优势,一方面具备更强的理论保证,另一方面也表现出良好的实证效果。

与IHT算法不同的是,HTP算法在每次迭代中采用了SP算法中用最小二乘更新稀疏系数的方法,最小二乘是一种无偏估计方法,这使得更新结果更加精确,从而可以减少迭代次数。

与SP算法不同的是,SP算法在每次迭代中是采用测量矩阵与残差的内积(即\({{{\bf{A}}^T}({\bf{y}} - {\bf{Ax}})}\))的大小来挑选最大的 \(S\) 个支撑位置,而HTP算法则是像IHT算法一样采用 \({{\bf{x}}{\rm{ + }}{{\bf{A}}^T}({\bf{y}} - {\bf{Ax}})}\) 来挑选支撑,后者无疑比前者包含更多的信息,因此相对于SP算法,HTP算法能更快的找到支撑位置,从而减少迭代次数。

总的说来,HTP算法是结合了IHT算法和SP算法的优势,因此其表现也更好。HTP算法原理较为简单,在此不详细介绍,对SP算法的介绍在后续贪婪类算法中一并总结。

下面是HTP算法的伪代码:

HTP算法的程序如下:

  1. function [hat_x] = cs_htp(y,A,K,itermax,error)
  2. % Emial: zhangyanfeng527@gmail.com
  3. % Reference: Foucart S. HARD THRESHOLDING PURSUIT: AN ALGORITHM FOR COMPRESSIVE SENSING[J].
  4. % Siam Journal on Numerical Analysis, 2011, 49(6):2543-2563.
  5. % y: measurement (observe) vector
  6. % A: measurement (sensing) matrix
  7. % k: sparsity level
  8. x0 = .2 * ones(size(A,2),1) ; % initialization with the size of original
  9. u = 1 ; % stpesize=1
  10. for times = 1 : itermax
  11. x_increase = A' * (y - A * x0);
  12. hat_x = x0 + u * x_increase ;
  13. [~,pos] = sort(abs(hat_x),'descend');
  14. gamma = pos(1:K) ;
  15. z = A(:,gamma) \ y ;
  16. hat_x = zeros(size(A,2),1) ;
  17. hat_x(gamma) = z ;
  18. if norm(y - A * hat_x) < error || norm(hat_x-x0)/norm(hat_x) < error
  19. break;
  20. else
  21. x0 = hat_x ;
  22. end
  23. end
  24. end

5. 仿真

以下对上述四种算法进行重构效果比较,测试程序如下:

  1. %% CS reconstruction test
  2. % Emial: zhangyanfeng527@gmail.com
  3. clear
  4. clc
  5. close all
  6. M = 64 ; %观测值个数
  7. N = 256 ; %信号x的长度
  8. K = 10 ; %信号x的稀疏度
  9. Index_K = randperm(N) ;
  10. x = zeros(N,1) ;
  11. x(Index_K(1:K)) = 5 * randn(K,1); % xK稀疏的,且位置是随机的
  12. Psi = eye(N); % x本身是稀疏的,定义稀疏矩阵为单位阵x=Psi*theta
  13. Phi = randn(M,N); %测量矩阵为高斯矩阵
  14. Phi = orth(Phi')';
  15. A = Phi * Psi; %传感矩阵
  16. % sigma = 0.005;
  17. % e = sigma*randn(M,1);
  18. % y = Phi * x + e;%得到观测向量y
  19. y = Phi * x ; %得到观测向量y
  20. %% 恢复重构信号x
  21. tic
  22. theta = cs_iht(y,A,K);
  23. x_r = Psi * theta;% x=Psi * theta
  24. toc
  25. %% 绘图
  26. figure;
  27. plot(x_r,'k.-');%绘出x的恢复信号
  28. hold on;
  29. plot(x,'r');%绘出原信号x
  30. hold off;
  31. legend('Recovery','Original')
  32. fprintf('\n恢复残差:');
  33. norm(x_r-x)%恢复残差

上述测试脚本只提供了简单的实验设置,对算法重构成功率、算法迭代次数与误差的关系(收敛速度)、重构时间、鲁棒性等测试可以自由发挥。

参考文献

[1] Blumensath, Thomas, and Mike E. Davies. "Iterative hard thresholding for compressed sensing." Applied and computational harmonic analysis 27.3 (2009): 265-274.

[2] Blumensath, Thomas, and Mike E. Davies. "Normalized iterative hard thresholding: Guaranteed stability and performance." IEEE Journal of selected topics in signal processing 4.2 (2010): 298-309.

[3] Blanchard, Jeffrey D., Jared Tanner, and Ke Wei. "CGIHT: conjugate gradient iterative hard thresholding for compressed sensing and matrix completion." Information and Inference: A Journal of the IMA 4.4 (2015): 289-327.

[4] Foucart, Simon. "Hard thresholding pursuit: an algorithm for compressive sensing." SIAM Journal on Numerical Analysis 49.6 (2011): 2543-2563.

更多精彩内容请关注微信公众号 “优化与算法

迭代硬阈值类算法总结||IHT/NIHT/CGIHT/HTP的更多相关文章

  1. 浅谈压缩感知(二十九):压缩感知算法之迭代硬阈值(IHT)

    主要内容: 1.IHT的算法流程 2.IHT的MATLAB实现 3.二维信号的实验与结果 4.加速的IHT算法实验与结果 一.IHT的算法流程 文献:T. Blumensath and M. Davi ...

  2. 详解聚类算法Kmeans的两大优化——mini-batch和Kmeans++

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第13篇文章,我们来看下Kmeans算法的优化. 在上一篇文章当中我们一起学习了Kmeans这个聚类算法,在算法的最后我 ...

  3. 压缩感知重构算法之IHT算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  4. flink PageRank详解(批量迭代的页面排名算法的基本实现)

    1.PageRank算法原理   2.基本数据准备 /** * numPages缺省15个测试页面 * * EDGES表示从一个pageId指向相连的另外一个pageId */ public clas ...

  5. 支持向量机(SVM)之硬阈值

    支持向量机 ( support vector machine, SVM ) 是使用超平面来对给定的 p 维向量进行分类的非概率二元线性分类器. 一.超平面 ( hyperplane ) 在一个p维的输 ...

  6. ICP(迭代最近点)算法

    图像配准是图像处理研究领域中的一个典型问题和技术难点,其目的在于比较或融合针对同一对象在不同条件下获取的图像,例如图像会来自不同的采集设备,取自不同的时间,不同的拍摄视角等等,有时也需要用到针对不同对 ...

  7. 吴裕雄 python 机器学习——半监督学习标准迭代式标记传播算法LabelPropagation模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import metrics from sklearn import d ...

  8. 迭代阈值收缩算法ISTA,背后的思想与具体推到过程

  9. 任意半径局部直方图类算法在PC中快速实现的框架。

    在图像处理中,局部算法一般来说,在很大程度上会获得比全局算法更为好的效果,因为他考虑到了图像领域像素的信息,而很多局部算法可以借助于直方图获得加速.同时,一些常规的算法,比如中值滤波.最大值滤波.最小 ...

随机推荐

  1. 如何在SAP Cloud Platform ABAP编程环境里创建一个employee

    用ABAP Development Tool登录SAP Cloud Platform ABAP编程环境后,对ABAP项目点击右键,选择属性,从而找到该环境的web访问的url: https://325 ...

  2. C#验证邮箱,电话,手机,数字,英文,日期,身份证,邮编,网址,IP类等常用函数封装

    #region 验证邮箱验证邮箱 /**//// <summary> /// 验证邮箱 /// </summary> /// <param name="sour ...

  3. c# Unicode

  4. js基础知识4

    原文链接:https://book.apeland.cn/details/361/#3.getElementsByClassName()方法 DOM介绍 1.文档:DOM中的”D” ​ DOM是”Do ...

  5. Vue项目中自动将px转换为rem

    一.配置与安装步骤: 1.在 Vue 项目的 src 文件夹下创建一个 config 文件夹: 2.在 config 文件夹中创建 rem.js: 3.将以下代码复制到 rem.js 中: // 基准 ...

  6. 使用CIFAR-10样本数据集测试卷积神经网络(ConvolutionalNeuralNetwork,CNN)

    第一次将例程跑起来了,有些兴趣. 参考的是如下URL: http://www.yidianzixun.com/article/0KNz7OX1 本来是比较Keras和Tensorflow的,我现在的水 ...

  7. JavaScript 进阶问题列表

    https://github.com/lydiahallie/javascript-questions/blob/master/zh-CN/README-zh_CN.md 很考基本功

  8. Oracle 中的 TO_DATE 和 TO_CHAR 函数 日期处理

    Oracle 中的 TO_DATE 和 TO_CHAR 函数 oracle 中 TO_DATE 函数的时间格式,以 :: 为例 格式 说明 显示值 备注 Year(年): yy two digits( ...

  9. HTTP头部

    10-URI的基本格式以及与URL的区别 HTTP连接的常见流程 从TCP编程上看HTTP请求处理 长连接与短连接 补充一下代理的知识 什么是正向代理,什么是反向代理? 想在外部公网访问公司内部局域网 ...

  10. Tensorflow细节-P196-输入数据处理框架

    要点 1.filename_queue = tf.train.string_input_producer(files, shuffle=False)表示创建一个队列来维护列表 2.min_after_ ...