⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ty2.m

📁 神经网络matlab源程序
💻 M
字号:
function tuoyuan1()allsamples=[];                         %所有训练图像for i=1:6    for j=1:7a=imread(strcat('C:\Documents and Settings\Rohoan\桌面',num2str(i),'\',num2str(j),'.jpg'));imshow(a);b=a(1:51*59); b=double(b);      allsamples=[allsamples; b];                                       %allsamples是一个M * N 矩阵allsamples中每一行数据代表一张图片,其中M=42  endendsamplemean=mean(allsamples);            % 平均图片,1 × Nfor i=1:42 xmean(i,:)=allsamples(i,:)-samplemean;                        % xmean是一个M × N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”去均值end;sigma=xmean*xmean';                     % M * M 阶矩阵[v d]=eig(sigma);                       % 计算矩阵的特征值和特征向量d1=diag(d);[d2 index]=sort(d1);                    %以升序排序              %降序排列特征值 eigenvalues = flipud(sort(diag(D)));cols=size(v,2);% 特征向量矩阵的列数for i=1:cols    vsort(:,i) = v(:, index(cols-i+1) ); % vsort 是一个M*cols(cols一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量    dsort(i)=d1( index(cols-i+1) );      % dsort 保存的是按降序排列的特征值,是一维行向量end                                       %完成降序排列%以下选择95%的能量dsum = sum(dsort);    dsum_extract=0;    p = 0;    while( dsum_extract/dsum < 0.95)        p=p+1;        dsum_extract=sum(dsort(1:p));    endi=1;% (训练阶段)计算特征脸形成的坐标系while (i<=p && dsort(i)>0)    base(:,i) = dsort(i)^(-1/2)' * xmean' * vsort(:,i);   % base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见《基于PCA的人脸识别算法研究》p31    i=i+1;end% add by wolfsky 就是下面两行代码,将训练样本对坐标系上进行投影,得到一个 M*p 阶矩阵allcoorAllcoor=allsamples * base;%初始化神经网络T00=[1;0;0;0;0;0];T01=[1;0;0;0;0;0];T02=[1;0;0;0;0;0];T03=[1;0;0;0;0;0];T04=[1;0;0;0;0;0];T05=[1;0;0;0;0;0];T06=[1;0;0;0;0;0];   T10=[0;1;0;0;0;0];T11=[0;1;0;0;0;0];T12=[0;1;0;0;0;0];T13=[0;1;0;0;0;0];T14=[0;1;0;0;0;0];T15=[0;1;0;0;0;0];T16=[0;1;0;0;0;0];  T20=[0;0;1;0;0;0];T21=[0;0;1;0;0;0];T22=[0;0;1;0;0;0];T23=[0;0;1;0;0;0];T24=[0;0;1;0;0;0];T25=[0;0;1;0;0;0];T26=[0;0;1;0;0;0];T30=[0;0;0;1;0;0];T31=[0;0;0;1;0;0];T32=[0;0;0;1;0;0];T33=[0;0;0;1;0;0];T34=[0;0;0;1;0;0];T35=[0;0;0;1;0;0];T36=[0;0;0;1;0;0];T40=[0;0;0;0;1;0];T41=[0;0;0;0;1;0];T42=[0;0;0;0;1;0];T43=[0;0;0;0;1;0];T44=[0;0;0;0;1;0];T45=[0;0;0;0;1;0];T46=[0;0;0;0;1;0];T50=[0;0;0;0;0;1];T51=[0;0;0;0;0;1];T52=[0;0;0;0;0;1];T53=[0;0;0;0;0;1];T54=[0;0;0;0;0;1];T55=[0;0;0;0;0;1];T56=[0;0;0;0;0;1];T=[T00 T01 T02 T03 T04 T10 T11 T12 T13 T14 T20 T21 T22 T23 T24 T30 T31 T32 T33 T34 T40 T41 T42 T43 T44 T50 T51 T52 T53 T54 ];%生成目标矩阵T;Allcoor1=Allcoor';WW=0;%测试的改动把p该为每个人前5副图for i=1:29-1p=[p;0];endP=[];for i=0:5    for j=1:5        p=Allcoor1(:,i*5+j);        P=[P;p'];% Allcoor1为输入图像向量;    endendP=P';%归一化数据[Pn,minp,maxp,Tn,mint,maxt]=premnmx(P,T);[Pn]=tramnmx(P,minp,maxp);SamNum = 30; % 总样本数InDim = 29; % 样本输入维数ClusterNum = 6; % 隐节点数,即聚类样本数Maxepoch=50;MaxEpoch = 1000; % 最大训练次数E0 = 0.05; % 目标误差% 根据目标函数获得样本输入输出SamIn = Pn;SamOut = T;% TestSamIn = % TestSamOut = % 中心的第一次求%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Center=[];for i=0:5    for j=1:29        s=0;        for k=1:5        s=s+Pn(j,5*i+k);        end         s=s/5;        Center(i+1,j)=s;    endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%设置训练中心次数%%%%%%%%%%%%%%%%%%%%%%%%%%%%1111111111111111111111111111111for k=1:MaxepochAllDist=[];for i=0:5for j=1:30ww=dist(Center(i+1,:),Pn(:,j));AllDist(i+1,j)=ww;endend%第一步粗糙判断%找出每个对象到各个中心的最小值for i=1:30    D(i)=min(AllDist(:,i));end%找出非0最小值Di=repmat(D',1,6);Dt=Di';Ds=AllDist-Dt;To=[];po=[];    for i=1:6  %po是0标量    po=[po;0];    endfor i=1:30    if Ds(:,i)==po;        continue;    end    [Y I]=min(Ds(:,i));    while Y==0        if I==1            Y=min(Ds(2:6,i));        else if I==6            Y=min(Ds(1:5,i));            else        xt=min(Ds(1:I-1,i));        yt=min(Ds(I+1:6,i));        if xt<yt            Y=xt;        else Y=yt;        end            end        end    end            To(i)=Y;end end%这里的end结束中心求取TT=To(1);%第一步t0的判断值得出,下面第2步求出上下近似集分类cnum=1;dnum=1;AA=[];c=[];d=[];%隶数度的判断[Y DI]=size(Pn);low=[0;];upp=[0;];for i=1:28low=[low;0];upp=[upp;0];endllow=[];uupp=[];for i=0:5    ul=0;%这两个是定义的上下集数量    ll=0;    for j=1:5    if To(i*5+j)<=TT;        upp=upp+Pn(:,i*5+j);        ul=ul+1;    else        low=low+Pn(:,i*5+j);        ll=ll+1;    end    end    if ll==0    wlow=1;    wupp=0;    else     wupp=1/(ul/ll+1);    wlow=1-wupp;    end    if (ul-ll==0)        for m=1:DI    Center(i+1,m)=wlow*low(m)/ul;        end    else if ul==0            for m=1:29                Center(i+1,m)=wupp*upp(m)/abs(ul-ll);            end        else        for m=1:29    Center(i+1,m)=wlow*low(m)/ul+wupp*upp(m)/abs(ul-ll);        endendendend  %结束中心训练%11111111111111111111111111111111111111111111111111111111111111111111111111%SamIn = Pn;SamOut = T;SamNum= 30; % 训练样本数TargetSamNum = size(T); % 测试样本数InDim = 29; % 样本输入维数UnitNum = 6; % 隐节点数W = 0.1*rand(6,6)-0.1;lrCent = 0.01; % 隐节点数据中心学习系数lrSP = 0.001; % 隐节点扩展常数学习系数lrW = 0.001; % 隐节点输出权值学习系数ErrHistory = [];for i=1:6    SP(i)=max(AllDist(i,:));endSPMat = 30*repmat(SP',1,30);%%%%%%%%%%%%%%%%%%%%%%%%%aq=0.44;%奶奶的改正矩阵for i=1:6    aqm(i)=radbas(-aq)+1;endaqmm=repmat(aqm',1,30);for i=1:6    aqi(i)=radbas(-aq);endaqii=repmat(aqi',1,30);%%%%%%%%%%%%%%%%%%%%%%%%for epoch = 1:MaxEpochyOut = radbas(-AllDist./SPMat);UnitOut=(aqii)./(aqmm+yOut);% UnitOut=[];% for i=1:6;% b = radbas(AllDist(i)./SPMat);% UnitOut=[UnitOut:b'];% endNetOut = W*UnitOut;Error = SamOut-NetOut;%停止学习判断SSE = sumsqr(Error)-25WW=WW+1% 记录每次权值调整后的训练误差ErrHistory = [ErrHistory SSE];if SSE<E0, break, endfor j= 1:6for i = 1:6CentGrad = (SamIn-repmat(Center(i,:)',1,SamNum))*(Error(i,:).*UnitOut(i,:)*W(j,i)/(SP(i)^2))';SPGrad = AllDist(i, :).^2*(Error(i,:).*UnitOut(i,:)*W(i,j)/(SP(i)^3))';WGrad = Error(i,:)*UnitOut(i,:)';Center(i,:) = Center(i,:) + (lrCent*CentGrad)';SP(i) = SP(i) + lrSP*SPGrad;W(j,i) = W(j,i) + lrW*WGrad;endendend% %计算各隐节点的输出权值% yOut = radbas(-AllDist./SPMat);% UnitOut=(aqii)./(aqmm+yOut);% % Distance = dist(Centers',SamIn); % 计算各样本输入离各数据中心的距离% % HiddenUnitOut = radbas(Distance./SpreadsMat); % 计算隐节点输出阵% W2Ex = SamOut*pinv(UnitOut); % 求广义输出权值% W2 = W2Ex(:,1:ClusterNum); % 输出权值%           %last endplot([1:MaxEpoch],SSE,'r-*');    % 测试for i=1:29-1p=[p;0];endPPP=[];for i=0:5    for j=6:7        p=Allcoor1(:,i*5+j);        PPP=[PPP;p'];% Allcoor1为输入图像向量;    endendPPP=PPP';TestIn=[];t=[];for i=1:29-1t=[t;0];endfor i=0:5    for j=6:7        t=Allcoor1(:,i*5+j);        TestIn=[TestIn;p'];% Allcoor1为输入图像向量;    endendTestIn=TestIn';%归一化数据[PPn,minp,maxp,TestOut,mint,maxt]=premnmx(PPP,TT);[PPn]=tramnmx(PPP,minp,maxp);TestOut=[T05 T06 T15 T16 T25 T26 T35 T36 T45 T46 T55 T56];osum=0;AllDist=[];for i=0:5for j=1:12ww=dist(Center(i+1,:),PPn(:,j));AllDist(i+1,j)=ww;endendaq=0.44;%奶奶的改正矩阵for i=1:6    aqm(i)=radbas(-aq)+1;endaqmm=repmat(aqm',1,12);for i=1:6    aqi(i)=radbas(-aq);endaqii=repmat(aqi',1,12);SPMat = 30*repmat(SP',1,12);xOut = radbas(-AllDist./SPMat);UnitOut=(aqii)./(aqmm+xOut);NetOut = W*UnitOut;Error = TestOut-NetOut;for i=1:12    ss=sumsqr(Error(:,i))-25;    if ss>E0        osum=osun+1;    endendzql=osum/12% UnitOut=[];% for i=1:6;% b = radbas(AllDist(i)./SPMat);% UnitOut=[UnitOut:b'];% end% NetOut = W*UnitOut;% Error = SamOut-NetOut;% TestDistance = dist(Centers',TestSamIn);% TestSpreadsMat = repmat(Spreads,1,TestSamNum);% TestHiddenUnitOut = radbas(TestDistance./TestSpreadsMat);% TestNNOut = W2*TestHiddenUnitOut+B2;% plot(TestSamIn,TestNNOut,'k-')% W2% B2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -