%% This function is modified from Matlab Package: L1-Homotopy
% BPDN_homotopy_function.m
%
% Solves the following basis pursuit denoising (BPDN) problem
% min_x \lambda ||x||_1 + 1/2*||y-Ax||_2^2
%
% Inputs:
% A - m x n measurement matrix
% y - measurement vector
% lambda - final value of regularization parameter
% maxiter - maximum number of homotopy iterations
%
% Outputs:
% x_out - output for BPDN
% total_iter - number of homotopy iterations taken by the solver
%
% Written by: Salman Asif, Georgia Tech
% Email: sasif@ece.gatech.edu
%
%-------------------------------------------+
% Copyright (c) 2007. Muhammad Salman Asif
%-------------------------------------------+
function [x_out, e_out, total_iter] = SolveHomotopy_CBM_std(A, y, varargin)
global N n gamma_x z_x xk_temp del_x_vec pk_temp dk epsilon isNonnegative
t0 = tic ;
lambda = 1e-6;
maxiter = 100;
isNonnegative = false;
verbose = false;
xk_1 = [];
tolerance = 1e-4 ;
STOPPING_TIME = -2;
STOPPING_GROUND_TRUTH = -1;
STOPPING_DUALITY_GAP = 1;
STOPPING_SPARSE_SUPPORT = 2;
STOPPING_OBJECTIVE_VALUE = 3;
STOPPING_SUBGRADIENT = 4;
STOPPING_DEFAULT = STOPPING_OBJECTIVE_VALUE;
stoppingCriterion = STOPPING_DEFAULT;
% Parse the optional inputs.
if (mod(length(varargin), 2) ~= 0 ),
error(['Extra Parameters passed to the function ''' mfilename ''' must be passed in pairs.']);
end
parameterCount = length(varargin)/2;
for parameterIndex = 1:parameterCount,
parameterName = varargin{parameterIndex*2 - 1};
parameterValue = varargin{parameterIndex*2};
switch lower(parameterName)
case 'stoppingcriterion'
stoppingCriterion = parameterValue;
case 'initialization'
xk_1 = parameterValue;
if ~all(size(xk_1)==[n,1])
error('The dimension of the initial x0 does not match.');
end
case 'groundtruth'
xG = parameterValue;
case 'lambda'
lambda = parameterValue;
case 'maxiteration'
maxiter = parameterValue;
case 'isnonnegative'
isNonnegative = parameterValue;
case 'tolerance'
tolerance = parameterValue;
case 'verbose'
verbose = parameterValue;
case 'maxtime'
maxTime = parameterValue;
otherwise
error(['The parameter ''' parameterName ''' is not recognized by the function ''' mfilename '''.']);
end
end
clear varargin
[K, n] = size(A);
B = [A eye(K)];
At = A';
Bt = B';
N = K + n;
timeSteps = nan(1,maxiter) ;
% Initialization of primal and dual sign and support
z_x = zeros(N,1);
gamma_x = []; % Primal support
% Initial step
Primal_constrk = -[At*y; y];
if isNonnegative
[c i] = min(Primal_constrk);
c = max(-c, 0);
else
[c i] = max(abs(Primal_constrk));
end
epsilon = c;
nz_x = zeros(N,1);
if isempty(xk_1)
xk_1 = zeros(N,1);
gamma_xk = i;
else
gamma_xk = find(abs(xk_1)>eps*10);
nz_x(gamma_xk) = 1;
end
f = epsilon*norm(xk_1,1) + 1/2*norm(y - A*xk_1(1:n) - xk_1(n+1:end))^2;
z_x(gamma_xk) = -sign(Primal_constrk(gamma_xk));
%Primal_constrk(gamma_xk) = sign(Primal_constrk(gamma_xk))*epsilon;
z_xk = z_x;
% loop parameters
iter = 0;
out_x = [];
old_delta = 0;
count_delta_stop = 0;
gamma_xkx = gamma_xk(gamma_xk<=n);
gamma_xke = gamma_xk(gamma_xk>n)-n;
AtgxAgx = [At(gamma_xkx,:)*A(:,gamma_xkx) At(gamma_xkx,gamma_xke); A(gamma_xke,gamma_xkx) eye(length(gamma_xke))];
iAtgxAgx = inv(AtgxAgx);
while iter < maxiter
iter = iter+1;
gamma_x = gamma_xk;
gamma_xx = gamma_x(gamma_x<=n);
gamma_xe = gamma_x(gamma_x>n)-n;
z_x = z_xk;
x_k = xk_1;
%%%%%%%%%%%%%%%%%%%%%
%%%% update on x %%%%
%%%%%%%%%%%%%%%%%%%%%
% Update direction
del_x = iAtgxAgx*z_x(gamma_x);
del_x_vec = zeros(N,1);
del_x_vec(gamma_x) = del_x;
Asupported = B(:,gamma_x);
Agdelx = Asupported*del_x;
dk = [At*Agdelx; Agdelx];
%%% CONTROL THE MACHINE PRECISION ERROR AT EVERY OPERATION: LIKE BELOW.
pk_temp = Primal_constrk;
gammaL_temp = find(abs(abs(Primal_constrk)-epsilon)<min(epsilon,2*eps));
pk_temp(gammaL_temp) = sign(Primal_constrk(gammaL_temp))*epsilon;
xk_temp = x_k;
xk_temp(abs(x_k)<2*eps) = 0;
%%%---
% Compute the step size
[i_delta, delta, out_x] = update_primal(out_x);
if old_delta < 4*eps && delta < 4*eps
count_delta_stop = count_delta_stop + 1;
if count_delta_stop >= 500
if verbose
disp('stuck in some corner');
end
break;
end
else
count_delta_stop = 0;
end
old_delta = delta;
xk_1 = x_k+delta*del_x_vec;
Primal_constrk = Primal_constrk+delta*dk;
epsilon_old = epsilon;
epsilon = epsilon-delta;
if epsilon <= lambda;
% xk_1 = x_k + (epsilon_old-lambda)*del_x_vec;
% disp('Reach prescribed lambda in SolveHomotopy_CBM.');
break;
end
timeSteps(iter) = toc(t0) ;
% if mod(iter, 100) == 0
% disp([ 'epsilon = ' num2str(epsilon) ', time =' num2str(timeSteps(iter))]);
% end
% compute stopping criteria and test for termination
keep_going = true;
if delta~=0
switch stoppingCriterion
case STOPPING_GROUND_TRUTH
keep_going = norm(xk_1(1:n)-xG)>tolerance;
case STOPPING_SPARSE_SUPPORT
nz_x_prev = nz_x;
nz_x = (abs(xk_1)>eps*10);
num_nz_x = sum(nz_x(:));
num_changes_active = (sum(nz_x(:)~=nz_x_prev(:)));
if num_nz_x >= 1
criterionActiveSet = num_changes_active / num_nz_x;
keep_going = (criterionActiveSet > tolerance);
end
case STOPPING_DUALITY_GAP
error('Duality gap is not a valid stopping criterion for Homotopy.');
case STOPPING_OBJECTIVE_VALUE
% continue if not yeat reached target value tolA
prev_f = f;
f = lambda*norm(xk_1,1) + 1/2*norm(y-Asupported*xk_1(gamma_x))^2;
keep_going = (abs((prev_f-f)/prev_f) > tolerance);
case STOPPING_SUBGRADIENT
keep_going = norm(delta*del_x_vec)>tolerance;
case STOPPING_TIME
keep_going = timeSteps(iter) < maxTime ;
otherwise,
error('Undefined stopping criterion');
end % end of the stopping criteria switch
end
if ~keep_going
%disp('Maximum time reached!');
break;
end
if ~isempty(out_x)
% If an element is removed from gamma_x
len_gamma = length(gamma_x);
outx_index = find(gamma_x==out_x(1));
gamma_x(outx_index) = gamma_x(end);
gamma_x = gamma_x(1:end-1);
gamma_xk = gamma_x;
rowi = outx_index; % ith row of A is swapped with last row (out_x)
colj = outx_index; % jth column of A is swapped with last column (out_lambda)
AtgxAgx_ij = AtgxAgx;
temp_row = AtgxAgx_ij(rowi,:);
AtgxAgx_ij(rowi,:) = AtgxAgx_ij(len_gamma,:);
AtgxAgx_ij(len_gamma,:) = temp_row;
temp_col = AtgxAgx_ij(:,colj);
AtgxAgx_ij(:,colj) = AtgxAgx_ij(:,len_gamma);
AtgxAgx_ij(:,len_gamma) = temp_col;
iAtgxAgx_ij = iAtgxAgx;
temp_row = iAtgxAgx_ij(colj,:);
iAtgxAgx_ij(colj,:) = iAtgxAgx_ij(len_gamma,:);
iAtgxAgx_ij(len_gamma,:) = temp_row;
temp_col = iAtgxAgx_ij(:,rowi);
iAtgxAgx_ij(:,rowi) = iAtgxAgx_ij(:,len_gamma);
iAtgxAgx_ij(:,len_gamma) = temp_col;
AtgxAgx = AtgxAgx_ij(1:l
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于PCA算法的人脸识别(包含人脸库) (407个子文件)
s18_3.bmp 11KB
s34_4.bmp 11KB
s27_8.bmp 11KB
s25_4.bmp 11KB
s11_7.bmp 11KB
s10_6.bmp 11KB
s20_10.bmp 11KB
s28_5.bmp 11KB
s1_7.bmp 11KB
s17_5.bmp 11KB
s1_2.bmp 11KB
s26_3.bmp 11KB
s8_2.bmp 11KB
s25_7.bmp 11KB
s9_8.bmp 11KB
s40_9.bmp 11KB
s5_9.bmp 11KB
s40_10.bmp 11KB
s32_6.bmp 11KB
s6_6.bmp 11KB
s39_6.bmp 11KB
s4_7.bmp 11KB
s18_2.bmp 11KB
s37_8.bmp 11KB
s33_5.bmp 11KB
s6_10.bmp 11KB
s11_3.bmp 11KB
s24_3.bmp 11KB
s8_10.bmp 11KB
s31_7.bmp 11KB
s13_8.bmp 11KB
s14_10.bmp 11KB
s2_7.bmp 11KB
s27_4.bmp 11KB
s22_5.bmp 11KB
s11_1.bmp 11KB
s24_4.bmp 11KB
s26_6.bmp 11KB
s9_6.bmp 11KB
s15_8.bmp 11KB
s11_9.bmp 11KB
s23_2.bmp 11KB
s30_10.bmp 11KB
s28_1.bmp 11KB
s34_9.bmp 11KB
s7_2.bmp 11KB
s7_6.bmp 11KB
s23_9.bmp 11KB
s15_2.bmp 11KB
s19_10.bmp 11KB
s37_1.bmp 11KB
s34_5.bmp 11KB
s10_2.bmp 11KB
s33_6.bmp 11KB
s16_5.bmp 11KB
s29_3.bmp 11KB
s2_3.bmp 11KB
s19_7.bmp 11KB
s6_9.bmp 11KB
s1_5.bmp 11KB
s13_3.bmp 11KB
s39_4.bmp 11KB
s35_10.bmp 11KB
s29_7.bmp 11KB
s3_9.bmp 11KB
s16_2.bmp 11KB
s22_1.bmp 11KB
s8_7.bmp 11KB
s2_1.bmp 11KB
s19_5.bmp 11KB
s40_8.bmp 11KB
s37_10.bmp 11KB
s32_9.bmp 11KB
s18_1.bmp 11KB
s15_4.bmp 11KB
s30_9.bmp 11KB
s12_3.bmp 11KB
s16_4.bmp 11KB
s18_8.bmp 11KB
s27_1.bmp 11KB
s19_4.bmp 11KB
s38_2.bmp 11KB
s22_4.bmp 11KB
s24_10.bmp 11KB
s12_7.bmp 11KB
s11_2.bmp 11KB
s23_7.bmp 11KB
s33_4.bmp 11KB
s38_3.bmp 11KB
s27_6.bmp 11KB
s3_1.bmp 11KB
s31_1.bmp 11KB
s21_7.bmp 11KB
s7_3.bmp 11KB
s40_4.bmp 11KB
s22_9.bmp 11KB
s40_1.bmp 11KB
s31_5.bmp 11KB
s2_9.bmp 11KB
s34_3.bmp 11KB
共 407 条
- 1
- 2
- 3
- 4
- 5
资源评论
- weixin_440652072019-01-12很有学习价值的,感谢.
qq_38035574
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功