📄 spvsfd.m
字号:
% This code compares SPSA and FDSA for a given no. of loss measurements. Code allows multiple
% replications ("cases") for averaging solutions. Code allows for averaging of SP gradient
% approximations
%
global sigma p noise
p=2;
nSP=2; % No. of loss measurements used in SPSA (per realization)
nFD=100; % No. of loss measurements used in FDSA (per realization)
sigma=1;
loss='losswaste_noise';
loss_nonoise='losswaste';
cases=50;
alpha=1;
gamma =.16666701;
% Gain coefficients unique to SPSA
aSP=.001;
cSP=.0001;
gavg=1;
ASP=20;
% Gain coefficients unique to FDSA
aFD=.4;
cFD=1;
AFD=0;
e=eye(p);
% INITIALIZATION FOR BOTH ALGORITHMS
theta_0=3*ones(p,1);
theta_lo=0*ones(p,1); %lower bounds on theta
theta_hi=5*ones(p,1); %upper bounds on theta
rand('seed',31415927)
randn('seed',511111113)
meanlossSP=0;
meanlossFD=0;
errthetaFD=0;
losssqSP=0; %this and next line initialize variables for calculating standard dev.
%of loss values
losssqFD=0;
ghat=zeros(p,1); %dummy statements for setting dimension
yplus=zeros(1,1);
yminus=zeros(1,1);
t=2.0096; %t-quantile for confidence interval calculation
truetheta=[1,0.666667]';
for i=1:cases
replication=i
% SPSA RUNS
theta=theta_0;
for k=1:nSP/(2*gavg)
ak = aSP/(k+ASP)^alpha;
ck = cSP/k^gamma;
ghat=0;
for j=1:gavg
delta = 2*round(rand(p,1))-1;
thetaplus = theta+ck*delta;
thetaminus = theta-ck*delta;
yplus=feval(loss,thetaplus);
yminus=feval(loss,thetaminus);
ghat=(yplus-yminus)./(2*ck*delta)+ghat;
end
theta=theta-ak*ghat/gavg;
% Two lines below invoke constraints
theta=min(theta,theta_hi);
theta=max(theta,theta_lo);
end
eval=feval(loss_nonoise,theta);
meanlossSP=(i-1)*meanlossSP/i+eval/i;
losssqSP=(i-1)*losssqSP/i+eval^2/i;
%
% FDSA RUNS
%
theta=theta_0;
d(1,i,2)=feval(loss_nonoise,theta);
for k=1:nFD/(2*p)
ak = aFD/(k+AFD)^alpha;
ck = cFD/k^gamma;
for j=1:p
thetaplus = theta+ck*e(:,j);
thetaminus = theta-ck*e(:,j);
yplus=feval(loss,thetaplus);
yminus=feval(loss,thetaminus);
ghat(j)=(yplus - yminus)/(2*ck);
end
theta=theta-ak*ghat;
% Two lines below invoke constraints
theta=min(theta,theta_hi);
theta=max(theta,theta_lo);
d(k+1,i,2)=feval(loss_nonoise,theta); %records true loss value for ith case, kth iteration
end
eval=feval(loss_nonoise,theta);
meanlossFD=(i-1)*meanlossFD/i+eval/i;
losssqFD=(i-1)*losssqFD/i+eval^2/i;
errthetaFD=(i-1)*errthetaFD/i+((theta-truetheta)'*(theta-truetheta))^.5/i;
end
%
% Display of results.
meanlossSP
meanlossFD
if cases > 1
sd_SP=(cases^(-.5))*((cases/(cases-1))^.5)*(losssqSP-meanlossSP^2)^.5
sd_FD=(cases^(-.5))*((cases/(cases-1))^.5)*(losssqFD-meanlossFD^2)^.5
% Confidence intervals
[meanlossSP-t*sd_SP,meanlossSP+t*sd_SP]
[meanlossFD-t*sd_FD,meanlossFD+t*sd_FD]
else
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -