📄 lm_ts.m
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% For training Takagi-Sugeno fuzzy systems using the% Levenberg-Marquardt method%% By: Kevin Passino% Version: 2/16/99%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%clear% Specify the maximum number of iterations:Nlm=15;% First, generate the training data, G% For the M=121 casex=-6:0.1:6;M=length(x)for i=1:M, z(i)=0.15*(rand-0.5)*2; % Define the auxiliary variable G(i)=exp(-50*(x(i)-1)^2)-0.5*exp(-100*(x(i)-1.2)^2)+atan(2*x(i))+2.15+... 0.2*exp(-10*(x(i)+1)^2)-0.25*exp(-20*(x(i)+1.5)^2)+0.1*exp(-10*(x(i)+2)^2)-0.2*exp(-10*(x(i)+3)^2); if x(i) >= 0 G(i)=G(i)+0.1*(x(i)-2)^2-0.4; end Gz(i)=G(i)+1*z(i); % Adds in the influence of the auxiliary variable (or can multiply by 0)end% Next, we provide another option for specifying the data set for M=13%clear x G z Gz%x=-6:1:6;%M=length(x)%for i=1:M,% z(i)=0.15*(rand-0.5)*2; % Define the auxiliary variable% G(i)=exp(-50*(x(i)-1)^2)-0.5*exp(-100*(x(i)-1.2)^2)+atan(2*x(i))+2.15+...% 0.2*exp(-10*(x(i)+1)^2)-0.25*exp(-20*(x(i)+1.5)^2)+0.1*exp(-10*(x(i)+2)^2)-0.2*exp(-10*(x(i)+3)^2);% if x(i) >= 0% G(i)=G(i)+0.1*(x(i)-2)^2-0.4;% end% Gz(i)=G(i)+1*z(i); % Adds in the influence of the auxiliary variable (or can multiply by 0)%end% Next, we need to initialize the appoximatorc(1,:,1)=-5:1:5; % The first 1 is the index for the first input (n=1 case) % and the second one is for the time index R=length(squeeze(c(1,:,1)))sigma(1,:,1)=0.5*ones(1,R);%sigma(1,:,1)=0.2*ones(1,R); % Another way to initialize%sigma(1,:,1)=1*ones(1,R); % Another way to initialize% We initialize all the parameters that enter linearly to be zerothetalin(:,1)=0*ones(2*R,1);% With this the a_i,0 parameters are first in the thetalin vector,% followed by the a_i,1 parameters, from i=1,2,...,R (thetalin% is the vector of parameters that enter linearly)% Next, form the whole parameter vector istheta(:,1)=[c(1,:,1)'; sigma(1,:,1)'; thetalin(:,1)];p=length(theta(:,1)); % Set the number of parameters for this case% Next, pick the parameter for the update method (remember you want lambda% bigger to make the updates *smaller*)lambda=0.5;Lambda=lambda*eye(p);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Next, we start the main loop:for j=1:Nlm j % Print to the screen the interation number % First, check if parameters are in range, and fix if not:for jj=1:R if sigma(1,jj,j)<0.1 sigma(1,jj,j)=0.1; end if sigma(1,jj,j)>1 sigma(1,jj,j)=1; end if c(1,jj,j)>6 c(1,jj,j)=6; end if c(1,jj,j)<-6 c(1,jj,j)=-6; endend% Next, we need to form the vector (epsilon) and matrix (del_epsilon) that are used in the% Levenberg-Marquardt update formula. for i=1:M % Define the phi vector, for each data pair in Gz for jj=1:R mu(jj,i,j)=exp(-0.5*((x(i)-c(1,jj,j))/sigma(1,jj,j))^2); end denominator(i)=sum(mu(:,i,j)); xi(:,i,j)=mu(:,i,j)*(1/denominator(i)); phi(:,i,j)=[xi(:,i,j)', x(i)*xi(:,i,j)']'; Fts(i)=thetalin(:,j)'*phi(:,i,j); epsilon(i,j)=Gz(i)-Fts(i); for jj=1:R g(jj,i,j)=thetalin(jj,j)+thetalin(jj+R,j)*x(i); % First, compute it for the centers, then the spreads, then the consequent parameters temp=(g(jj,i,j)-Fts(i))/denominator(i); del_epsilon(jj,i,j)=-temp*mu(jj,i,j)*(x(i)-c(1,jj,j))*(1/(sigma(1,jj,j)^2)); del_epsilon(jj+R,i,j)=-temp*mu(jj,i,j)*((x(i)-c(1,jj,j))^2)*(1/(sigma(1,jj,j)^3)); del_epsilon(jj+2*R,i,j)=-xi(jj,i,j); % For the a_i,0 del_epsilon(jj+3*R,i,j)=-x(i)*xi(jj,i,j); % For the a_i,1 endend % Next, we seek to generate the next estimate of the parameter vector theta for % the Levenberg-Marquardt update formula:theta(:,j+1)=theta(:,j)-... inv(del_epsilon(:,:,j)*del_epsilon(:,:,j)'+Lambda)*del_epsilon(:,:,j)*epsilon(:,j);% Load the components into the relevant vectors:c(1,:,j+1)=theta(1:R,j+1)';sigma(1,:,j+1)=theta((R+1):(2*R),j+1)';thetalin(:,j+1)=theta((2*R+1):(4*R),j+1);%end % End of main loop for Levenberg-Marquardt update formula%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Next, compute the approximator values (i.e., at a test set)% Define the points at which it will be testedxt=-6:0.01:6; Mt=length(xt);% First, define the phi vector, for each data pair in Gz% (note that j+1 is the last time at which we have generated a theta% and we use it here - first, we have to compute phi)for i=1:Mt for jj=1:R mut(jj,i)=exp(-0.5*((xt(i)-c(1,jj,j+1))/sigma(1,jj,j+1))^2); end denominatort(i)=sum(mut(:,i)); xit(:,i)=mut(:,i)*(1/denominatort(i)); phit(:,i)=[xit(:,i)', xt(i)*xit(:,i)']'; Fts(i)=thetalin(:,j+1)'*phit(:,i); % Just call the jth one the last oneend% Next, plot the basis functions, data and the approximator to compare%figure(1)figure(j)clfplot(x,Gz,'ko',xt,xit,'k--',xt,Fts,'k-')xlabel('x')T=num2str(j);T=strcat('Basis functions, data, and approximator mapping, j=',T);ylabel(T)title('Takagi-Sugeno fuzzy system, 11 rules')gridaxis([min(x) max(x) 0 max(G)])% Could omit the "end" on the main loop and add the following to see the mapping % shape at each iteration (in this case change figure(1) above to figure(j) if you want)pause % Can add this if you want to view the mappings at each iteration while % the program is runningend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of program%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -