📄 ty2.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 + -