Parameter estimation

Uncategorized
Mar 20, 2021
S

Please help me, when I use CVX to find theta1, I got accurate estimation, however when I tried to find theta i.e. evolution of theta, the result was incorect. CVX did not work for nonstationary parameter, is it ?

%Code
load('data.mat')
y=data(:,1);
u=data(:,2);
%%%%%%%%%%%%%%%%%%%%%%
Y=y(3:end);
phi_y= [-y(2:end-1)  -y(1:end-2)];
phi_u= [u(2:end-1)  u(1:end-2)];
Phi=[phi_y phi_u];
[N n]=size(Phi);
 cvx_begin
    variable theta1(n)
    minimize( norm((Y-Phi* theta1)))        
    cvx_end  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% building X
X=zeros(N,N* n);
for i=1:N
    X(i,:)=[zeros(1,n*(i-1)) Phi(i,: )  zeros(1,n*N-n*(i-1)-n)];
end 
    cvx_begin
    variable theta(n,N)
    minimize( norm((Y-X*theta(:))))        
    cvx_end   
figure(2)
plot(-squeeze(theta(1,:)),'--','linewidth',2)
M

Not all forum readers have the mind reading powers you perhaps assume we do. I assume CVX solved the problems you provided it. Whether the problems provided to CVX correspond to the statistical problems you wanted to solve is another matter.

I don’t know what you are trying to do. Do you intend for the 2nd version to be stacking a bunch of independent least norm problems together into one problem? I don’t see how that could be so, given that you have the same column vector Y in both versions occurring within a single norm, but in the 1st version there is only a column vector theta1, as opposed to a matrix theta in the 2nd version, “going up against” the column vector Y.

Does the stacking in X make any sense? I’ll let you figure that out. Perhaps you should start off simply, with N = 1. Then try N = 2, and make sure that does what you want before you try the value of N you really want.

S
Replying to #2

Thanks for your reply, I modified the code to

for k=1:N
cvx_begin 
variable theta1(n)
minimize(norm((Y(1:k)-Phi(1:k,:)*theta1))^2)        
cvx_end  
Theta1(k,:)=theta1';
end

I got the requested result, just I would like to have it at once. Could you please give me how the function minimize solves the problem (in general). Thank you again

M

What’s wrong with the code you have? Use the quiet option if you want to suppress the output for each run of CVX.

You could declare theta as an n by N variable, move the for loop into CVX, and separately form the norm term for each value of k (with its corresponding column of theta). Then sum the norm terms and solve with a single minimize (or perhaps use sum_square rather than norm for the individual terms). That may or may not be faster than your existing code, but I doubt it would be much faster, if at all.