How to get the optimization of the object function with steepest descent method?
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
suppose that:
%
E1=exp(-(x1-mul1)^2/(2*sigma1^2));
E2=exp(-(x2-mul2)^2/(2*sigma2^2));
……
En=exp(-(xn-muln)^2/(2*sigman^2));
Object function :f=E1*E2*…*En;
input={x1,x2,…,xn}=[1,2,3,4,5];
Initial value of parameter mul and sigma as following:
ml={mul1,mul2,…,muln}=[2,3,4,5,6];
sa={sigma1,sigma2,…,sigman}=[1,2,3,4,5];
There is the code i have written, existing some problem during running,looking forward your help!
%
clear all;
ml=[2,3,4,5,6];%initial value of mul
sa=[1,2,3,4,5];%initial value of sigma
input=[1,2,3,4,5];
[m,N]=size(input);
var=[];
mul=[];
sigma=[];
lambda=[]; %step size of the object function
mul=sym(mul);
sigma=sym(sigma);
lambda=sym(lambda);
for i=1:N
mul(i)=['mul',num2str(i)];
sigma(i)=['sigma',num2str(i)];
lambda(i)=['lambda',num2str(i)];
end
var=transpose([mul,sigma]);
epoch=10; %the number of iteration
mem=[];
mem=exp(-(input-mul).^2./(2*sigma.^2))
temp=prod(mem) % object function
esp=0.001;
mulgrad=[];
sigmagrad=[];
for i=1:epoch
for j=1:N
mulgrad(i)=diff(temp,(mul(i))) %derivative of mul
mulgrad(i)=subs(mulgrad(i),mul(i),ml(i))
sigmagrad(i)=diff(temp,sigma(i))
sigmagrad(i)=subs(sigmagrad(i),sigma(i),sa(i))
end
norm=sum(sqrt(mulgrad^2+sigmagrad^2))/N;
if norm<0.001
printf('result= %g',temp);
break;
end
mul=mul+lambda.*mulgrad
sigma=sigma+lambda.*sigmagrads
mem=exp(-(input-mul).^2./(2*sigma.^2))
temp=prod(mem)
for j=1:epoch
d(j)=diff(temp,lambda(i))
end
% how to get the step size ?we need update N step-size simultaneously,it
% is different for me.
lambdaNew=solve(d,'lambda')
mul=mul+lambdaNew.*mul1
sigma=sigma+lambdaNew.*sigma1
mem=exp(-(input-mul).^2./(2*sigma.^2))
temp=prod(mem)
end
end
0 Kommentare
Antworten (0)
Siehe auch
Kategorien
Mehr zu Operating on Diagonal Matrices finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!