自适应模糊神经网络MATLAB代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

function [ c, sigma , W_output ] = SOFNN( X, d, Kd )

%SOFNN Self-Organizing Fuzzy Neural Networks

%Input Parameters

% X(r,n) - rth traning data from nth observation

% d(n) - the desired output of the network (must be a row vector) % Kd(r) - predefined distance threshold for the rth input

%Output Parameters

% c(IndexInputVariable,IndexNeuron)

% sigma(IndexInputVariable,IndexNeuron)

% W_output is a vector

%Setting up Parameters for SOFNN

SigmaZero=4;

delta=0.12;

threshold=0.1354;

k_sigma=1.12;

%For more accurate results uncomment the following

%format long;

%Implementation of a SOFNN model

[size_R,size_N]=size(X);

%size_R - the number of input variables

c=[];

sigma=[];

W_output=[];

u=0; % the number of neurons in the structure

Q=[];

O=[];

Psi=[];

for n=1:size_N

x=X(:,n);

if u==0 % No neuron in the structure?

c=x;

sigma=SigmaZero*ones(size_R,1);

u=1;

Psi=GetMePsi(X,c,sigma);

[Q,O] = UpdateStructure(X,Psi,d);

pT_n=GetMeGreatPsi(x,Psi(n,:))';

else

[Q,O,pT_n] = UpdateStructureRecursively(X,Psi,Q,O,d,n);

end;

KeepSpinning=true;

while KeepSpinning

%Calculate the error and if-part criteria

ae=abs(d(n)-pT_n*O); %approximation error

[phi,~]=GetMePhi(x,c,sigma);

[maxphi,maxindex]=max(phi); % maxindex refers to the neuron's index if ae>delta

if maxphi

%enlarge width

[minsigma,minindex]=min(sigma(:,maxindex));

sigma(minindex,maxindex)=k_sigma*minsigma;

Psi=GetMePsi(X,c,sigma);

[Q,O] = UpdateStructure(X,Psi,d);

pT_n=GetMeGreatPsi(x,Psi(n,:))';

else

%Add a new neuron and update structure

ctemp=[];

sigmatemp=[];

dist=0;

for r=1:size_R

dist=abs(x(r)-c(r,1));

distIndex=1;

for j=2:u

if abs(x(r)-c(r,j))

distIndex=j;

dist=abs(x(r)-c(r,j));

end;

end;

if dist<=Kd(r)

ctemp=[ctemp; c(r,distIndex)];

sigmatemp=[sigmatemp ; sigma(r,distIndex)];

else

ctemp=[ctemp; x(r)];

sigmatemp=[sigmatemp ; dist];

end;

end;

c=[c ctemp];

sigma=[sigma sigmatemp];

Psi=GetMePsi(X,c,sigma);

[Q,O] = UpdateStructure(X,Psi,d);

KeepSpinning=false;

u=u+1;

end;

else

if maxphi

%enlarge width

[minsigma,minindex]=min(sigma(:,maxindex));

sigma(minindex,maxindex)=k_sigma*minsigma;

Psi=GetMePsi(X,c,sigma);

[Q,O] = UpdateStructure(X,Psi,d);

pT_n=GetMeGreatPsi(x,Psi(n,:))';

else

%Do nothing and exit the while

KeepSpinning=false;

end;

end;

end;

end;

W_output=O;

end

function [Q_next, O_next,pT_n] = UpdateStructureRecursively(X,Psi,Q,O,d,n) %O=O(t-1) O_next=O(t)

p_n=GetMeGreatPsi(X(:,n),Psi(n,:));

pT_n=p_n';

ee=abs(d(n)-pT_n*O); %|e(t)|

temp=1+pT_n*Q*p_n;

ae=abs(ee/temp);

if ee>=ae

L=Q*p_n*(temp)^(-1);

Q_next=(eye(length(Q))-L*pT_n)*Q;

O_next=O + L*ee;

else

Q_next=eye(length(Q))*Q;

O_next=O;

end;

end

function [ Q , O ] = UpdateStructure(X,Psi,d)

GreatPsiBig = GetMeGreatPsi(X,Psi);

%M=u*(r+1)

%n - the number of observations

[M,~]=size(GreatPsiBig);

%Others Ways of getting Q=[P^T(t)*P(t)]^-1

相关文档
最新文档