神经网络报告_第1页
神经网络报告_第2页
神经网络报告_第3页
神经网络报告_第4页
神经网络报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

)等式(24)称为高增益的能量函数。5.2求解TSP问题5.2.1TSP问题描述 考虑到还要在交大读5年博士,不禁想到从西安出发到中国主要旅游城市的TSP问题,因此要求解西安、北京、大理、成都、重庆、桂林、张家界、九寨沟、杭州九个主要旅游城市的TSP问题,九个城市间的距离由百度地图得到,结果如下图所示:图12九大旅游城市距离图(单位为公里) 为叙述简便,不妨用1到9分别代表西安、北京、大理、成都、重庆、桂林、张家界、九寨沟、杭州。5.2.2用遍历求TSP准确解 对这个问题,总合理路线数为个,完全可以用遍历求解。值得一提的是,对这个问题,最直接的想法是用8重for循环,但这种想法既不容易实现,又非常耗时。比较简单的算法是将所有线路纵向排成行8列的矩阵(起点和终点可以任意设置),例如起点为城市1(西安),则只需求城市2到城市8的全排列即可,这个可以使用交换全排列算法得到,如果是在matlab中且问题的维数小于等于11,可直接调用perms函数得到全排列。 得到全排列以后可直接对每一行求解,如果是在matlab中,可直接通过矩阵并行计算快速得到,根据距离矩阵遍历求解TSP问题的程序见附录6,得到此TSP问题的准确解为[9675348129],最短总距离为8482.7公里,所花时间只有0.1s左右。5.2.3用连续Hopfield网络求TSP近似解 由于时间和难度原因,这个问题我并未自己建立连续Hopfield网络并数值求解常微分方程组,而是整理了下王小川《MATLAB神经网络43个案例分析》的程序,见附录7。由于连续Hopfield网络的初始值是随机产生的,因此每次迭代产生的结果并不相同,甚至有些没收敛到合理路径,为展示效果,设置最大迭代次数为20000,将程序运行8次的结果列表如下:表1连续Hopfield网络8次运行结果序号12345678总长度8781.98684.58684.58781.98684.58902.89223.68571.6 与准确解8482.7公里相比,这8次迭代都得到了较好的结果,这验证了利用连续Hopfield求TSP近似解的有效性。附录7的程序中包括能量函数值的变化序列,通过它可以画出能量函数的变化曲线,结果如下图所示:图12连续Hopfield能量函数变化曲线 从图中可以看出,随着常微分方程组的迭代次数增加,能量函数总体是先下降后趋于稳定的,这验证了5.1中叙述的定理,即连续Hopfield常微分方程组的解对应于能量函数的驻点。6.几点说明(1)由于时间关系及文章的简便性,上文提到的算法诸如多层前向网络、支撑向量机等只是叙述了基本原理和最终结果,中间的推导过程并未给出,这些推导都可以在神经网络的经典教程《神经网络设计》中找到。(2)除了模式识别之外,神经网络的另一大功能是回归拟合,但其实现和模式识别并没有太大区别。比如将神经网络输出层的激活函数变为线性激活函数,用函数参数和值作为训练样本即可进行回归拟合。实际上,回归拟合也可看成特殊的模式识别,每个参数作为一个模式,每个值作为一个类。(3)如果对结果的要求很高的话,仅仅只会简单调用库函数应该是不够的,最好是自己能够根据原理编出程序出来,这样才会对库函数的各种参数有较深刻的认识。7.附录附录1:BP算法字符识别matlab程序%用BP算法进行字符识别tic;clear;clc;%提取字母信息[alphabet,targets]=prprob();alphabet=alphabet';infoLen=size(alphabet,2);%字母特征的维数%%使用交叉确认法确定最佳神经元个数%trainNum=20;%inputTrain=zeros(26*trainNum*2,infoLen);%inputVerify=zeros(26*trainNum*2,infoLen);%outputTrain=zeros(26*trainNum*2,26);%outputVerify=zeros(26*trainNum*2,26);%fori=1:26%inputTrain((i-1)*trainNum*2+1:i*trainNum*2,:)=[repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.1);...%repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.2)];%outputTrain((i-1)*trainNum*2+1:i*trainNum*2,:)=repmat(targets(i,:),trainNum*2,1);%inputVerify((i-1)*trainNum*2+1:i*trainNum*2,:)=[repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.1);...%repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.2)];%outputVerify((i-1)*trainNum*2+1:i*trainNum*2,:)=repmat(targets(i,:),trainNum*2,1);%end%neuronNumArr=[5,10,15,20,30,40];%bestNeuronNum=crossVerify(neuronNumArr,inputTrain,outputTrain,inputVerify,outputVerify);%fprintf('\n最佳神经元个数为:%d\n',bestNeuronNum);%暂时得到的结果为40个%获得训练数据trainNum=10;inputTrain=zeros(26*trainNum*2,infoLen);outputTrain=zeros(26*trainNum*2,26);fori=1:26inputTrain((i-1)*trainNum*2+1:i*trainNum*2,:)=[repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.1);...repmat(alphabet(i,:),trainNum,1)+randn(trainNum,infoLen)*sqrt(0.2)];outputTrain((i-1)*trainNum*2+1:i*trainNum*2,:)=repmat(targets(i,:),trainNum*2,1);end%训练数据归一化[inputn,inputps]=mapminmax(inputTrain');%归一化是针对同一维的数据[outputn,outputps]=mapminmax(outputTrain');%BP神经网络构建neuronNum=40;name='最佳神经元个数';net=newff(inputn,outputn,neuronNum,{'tansig','tansig'},'traingdx');%动量反传和动态自适应学习率的梯度下降训练函数%选取初始权值和阈值coef=0.01;%调整网络初始值的系数net.LW{2,1}=net.LW{2,1}*coef;net.b{2}=net.b{2}*coef;%网络参数配置(迭代次数,学习率,目标)net.trainParam.epochs=1000;net.trainParam.goal=0.00001;net.trainParam.mc=0.8;%BP神经网络训练net=train(net,inputn,outputn);%获得不同方差下的恢复率stdDevia=0:0.05:0.5;testLen=length(stdDevia);recoverRate=zeros(1,testLen);testNum=10;inputTest=zeros(26*testNum,infoLen);outputTest=zeros(26*testNum,26);fork=1:testLenfori=1:26inputTest((i-1)*testNum+1:i*testNum,:)=repmat(alphabet(i,:),testNum,1)+randn(testNum,infoLen)*stdDevia(k);outputTest((i-1)*testNum+1:i*testNum,:)=repmat(targets(i,:),testNum,1);endinputnTest=mapminmax('apply',inputTest',inputps);%预测数据归一化an=sim(net,inputnTest);%BP神经网络预测输出bpOutput=mapminmax('reverse',an,outputps)';%输出结果反归一化[~,indexTest]=max(outputTest,[],2);%计算恢复率[~,indexBp]=max(bpOutput,[],2);recoverRate(k)=length(find(indexTest==indexBp))/(26*testNum);endplot(stdDevia,recoverRate,'-*');%绘制恢复率-方差图像xlabel('标准差');ylabel('恢复率');name=[name,'BP算法恢复率-标准差图像'];title(name);toc;附录2:交叉确认神经元个数matlab程序%使用交叉确认法确定最佳神经元个数functionbestNeuronNum=crossVerify(neuronNumArr,inputTrain,outputTrain,inputVerify,outputVerify)%训练数据归一化[inputn,inputps]=mapminmax(inputTrain');%归一化是针对同一维的数据[outputn,outputps]=mapminmax(outputTrain');%验证数据归一化inputnVerify=mapminmax('apply',inputVerify',inputps);%循环确定最佳神经元个数maxRecoverRate=0;fori=1:length(neuronNumArr)neuronNum=neuronNumArr(i);net=newff(inputn,outputn,neuronNum,{'tansig','tansig'},'traingdx');%动量反传和动态自适应学习率的梯度下降训练函数net.trainParam.epochs=1000;%网络参数配置(迭代次数,学习率,目标)net.trainParam.goal=0.00001;net.trainParam.mc=0.95;net=train(net,inputn,outputn);%BP神经网络训练an=sim(net,inputnVerify);%BP神经网络预测输出bpOutput=mapminmax('reverse',an,outputps);%输出结果反归一化[~,indexVerify]=max(outputVerify,[],2);%计算恢复率[~,indexBp]=max(bpOutput,[],1);indexBp=indexBp';recoverRate=length(find(indexVerify==indexBp))/(length(indexVerify));ifrecoverRate>maxRecoverRatemaxRecoverRate=recoverRate;bestNeuronNum=neuronNum;endfprintf('\n总共%d个完成了%d个\n',length(neuronNumArr),i);endend附录3:libsvm字符识别matlab程序%使用libsvm进行字符识别tic;%提取字母信息[alphabet,targets]=prprob();alphabet=alphabet';infoLen=size(alphabet,2);%字母特征的维数%获得数据和标签dataNum=40;data=zeros(26*dataNum*2,infoLen);label=zeros(26*dataNum*2,1);fori=1:26data((i-1)*dataNum*2+1:i*dataNum*2,:)=[repmat(alphabet(i,:),dataNum,1)+randn(dataNum,infoLen)*sqrt(0.1);...repmat(alphabet(i,:),dataNum,1)+randn(dataNum,infoLen)*sqrt(0.2)];label((i-1)*dataNum*2+1:i*dataNum*2,:)=repmat(i,dataNum*2,1);end%数据归一化[datan,dataps]=mapminmax(data');%归一化是针对同一维的数据%建立libsvm模型model=svmtrain(label,datan','-q');%获得不同方差下的恢复率stdDevia=0:0.05:0.5;testLen=length(stdDevia);recoverRate=zeros(1,testLen);testNum=10;testData=zeros(26*testNum,infoLen);testDataLabel=zeros(26*testNum,1);fork=1:testLenfori=1:26testData((i-1)*testNum+1:i*testNum,:)=repmat(alphabet(i,:),testNum,1)+randn(testNum,infoLen)*stdDevia(k);testDataLabel((i-1)*testNum+1:i*testNum,:)=repmat(i,testNum,1);endtestDatan=mapminmax('apply',testData',dataps)';%预测数据归一化[~,accuracy,~]=svmpredict(testDataLabel,testDatan,model,'-q');recoverRate(k)=accuracy(1);endplot(stdDevia,recoverRate,'-*');%绘制恢复率-方差图像xlabel('标准差');ylabel('恢复率');name='libsvm恢复率-标准差图像';title(name);toc;附录4:离散Hopfield字符识别matlab程序%用离散Hopfiled网络做字符识别clear;clc;tic;%载入数据[alphabet,~]=prprob();infoLen=size(alphabet,1);%字母特征的维数Q=3;A=alphabet(:,1);B=alphabet(:,2);C=alphabet(:,3);I=alphabet(:,9);J=alphabet(:,10);T=alphabet(:,21);data=[I,J,T];data(data==0)=-1;%获得不同方差下的恢复率stdDevia=0:0.05:4;testLen=length(stdDevia);recoverRate=zeros(1,testLen);testNum=90;testData=zeros(infoLen,Q*testNum);testDataLabel=zeros(1,Q*testNum);maxIter=200;%设置迭代停止准则toleration=1;fork=1:testLenfori=1:QtestData(:,(i-1)*testNum+1:i*testNum)=repmat(data(:,i),1,testNum)+randn(infoLen,testNum)*stdDevia(k);testDataLabel(:,(i-1)*testNum+1:i*testNum)=repmat(i,1,testNum);enditer=0;while1==1%Hebb学习算法cache=testData;testData=sign(data*(data'*testData));testData(testData==0)=1;iter=iter+1;iflength(find(cache~=testData))<=toleration||iter>=maxIterbreak;endendifiter==maxIterfprintf('\n迭代已达到最大迭代次数!\n');elsefprintf('\n迭代已接近稳定态,迭代次数为:%d\n',iter);endforpos=1:Q*testNum%计算恢复率maxNum=-inf;fori=1:Q%判断收敛最近的一个点num=length(find(data(:,i)==testData(:,pos)));ifnum>maxNummaxNum=num;index=i;endendifindex==testDataLabel(pos);recoverRate(k)=recoverRate(k)+1;endendrecoverRate(k)=recoverRate(k)/(Q*testNum);endplot(stdDevia,recoverRate,'-*');%绘制恢复率-方差图像xlabel('标准差');ylabel('恢复率');name='离散Hopfiled恢复率-标准差图像';title(name);toc;附录5:离散Hopfield图像恢复matlab程序%利用离散Hopfield网络做图像恢复clear;clc;tic;%载入图像数据imageSet=cell(1,10);imageSet{1}=imread('通讯录图片\李柢颖脸部.jpg');imageSet{2}=imread('通讯录图片\徐文豪脸部.jpg');imageSet{3}=imread('通讯录图片\严沈晗脸部.jpg');imageSet{4}=imread('通讯录图片\朱文哲脸部.jpg');imageSet{5}=imread('通讯录图片\韩霜脸部.jpg');imageSet{6}=imread('通讯录图片\马骆脸部.jpg');imageSet{7}=imread('通讯录图片\苏泽明脸部.jpg');imageSet{8}=imread('通讯录图片\王天伟脸部.jpg');imageSet{9}=imread('通讯录图片\李泽林脸部.jpg');imageSet{10}=imread('通讯录图片\孙瑞林脸部.jpg');imageNum=3;lineNum=size(imageSet{1},1);colNum=size(imageSet{1},2);data=zeros(lineNum*colNum*3,imageNum);infoLen=8;binData=zeros(lineNum*colNum*3*infoLen,imageNum);fori=1:imageNumdata(:,i)=double([reshape(imageSet{i}(:,:,1),lineNum*colNum,1);reshape(imageSet{i}(:,:,2),lineNum*colNum,1);reshape(imageSet{i}(:,:,3),lineNum*colNum,1)]);tmp=dec2bin(data(:,i),8)';%将灰度图像转为二进制存储binData(:,i)=str2num(reshape(tmp(1:infoLen,:),lineNum*colNum*3*infoLen,1));endbinData(binData==0)=-1;%生成加噪数据choice=2;%选择第几张图片Amplitude=200;pollutedData=fix(data(:,choice)+Amplitude*randn(lineNum*colNum*3,1));pollutedData(pollutedData<0)=0;pollutedData(pollutedData>255)=255;tmp=dec2bin(pollutedData,8)';testBinData=str2num(reshape(tmp(1:infoLen,:),lineNum*colNum*3*infoLen,1));testBinData(testBinData==0)=-1;%还原图像maxIter=100;%设置迭代停止准则toleration=0;iter=0;while1==1cache=testBinData;testBinData=sign(binData*(binData'*testBinData));testBinData(testBinData==0)=1;iter=iter+1;iflength(find(cache~=testBinData))<=toleration||iter>=maxIterbreak;endendifiter==maxIterfprintf('\n迭代已达到最大迭代次数!\n');elsefprintf('\n迭代已接近稳定态,迭代次数为:%d\n',iter);end%各图像作比较originImage=imageSet{choice};%原图片pollutedImage=uint8(zeros(lineNum,colNum,3));pollutedImage(:,:,1)=uint8(reshape(pollutedData(1:lineNum*colNum),lineNum,colNum));%加噪图片pollutedImage(:,:,2)=uint8(reshape(pollutedData(lineNum*colNum+1:2*lineNum*colNum),lineNum,colNum));pollutedImage(:,:,3)=uint8(reshape(pollutedData(2*lineNum*colNum+1:3*lineNum*colNum),lineNum,colNum));testBinData(testBinData==-1)=0;tmp=reshape(testBinData,infoLen,lineNum*colNum*3)';testData=zeros(lineNum*colNum*3,1);base=0;fori=1:infoLentestData=testData+tmp(:,i)*2^(8-i);base=base+2^(8-i);endrecoverImage=uint8(zeros(lineNum,colNum,3));recoverImage(:,:,1)=uint8(reshape(testData(1:lineNum*colNum),lineNum,colNum));%恢复图片recoverImage(:,:,2)=uint8(reshape(testData(lineNum*colNum+1:2*lineNum*colNum),lineNum,colNum));recoverImage(:,:,3)=uint8(reshape(testData(2*lineNum*colNum+1:3*lineNum*colNum),lineNum,colNum));subplot(221);imshow(originImage);title('原图像');subplot(222);imshow(pollutedImage);title('加噪图像');subplot(223);imshow(recoverImage);title('还原图像');cutData=bitand(data,base*ones(size(data)));%最佳匹配图像matchError=abs(cutData-repmat(testData,1,imageNum));[~,index]=min(sum(matchError));subplot(224);imshow(imageSet{index});title('最佳匹配图像');toc;附录6:遍历求解TSP的matlab程序%用遍历的方法求解TSP问题%由于调用matlab库函数perms,只适合计算维数小于等于11的问题function[route,minTotalDist]=traversalTsp(distMat)%检验距离矩阵有效性ifsize(distMat,1)~=size(distMat,2)fprintf('\n距离矩阵必须为方阵!\n');elseifsize(distMat,1)>11fprintf('\n由于调用matlab库函数perms,只适合计算维数小于11的问题!\n');endn=size(distMat,1);%生成路径中间n-1个元素的全排列矩阵startpoint=randi(n);%随机设置起点和终点位置,使计算量减少n倍elements=[1:startpoint-1,startpoint+1:n];fullPermutation=perms(elements);%根据全排列矩阵得到总距离向量totalDistVec=distMat(startpoint*ones(size(fullPermutation,1),1)+(fullPermutation(:,1)-1)*n);fori=1:n-2totalDistVec=totalDistVec+distMat(fullPermutation(:,i)+(fullPermutation(:,i+1)-1)*n);endtotalDistVec=totalDistVec+distMat(fullPermutation(:,n-1)+(startpoint*ones(size(fullPermutation,1),1)-1)*n);%返会TSP问题解和最小总距离[minTotalDist,index]=min(totalDistVec);route=[startpoint,fullPermutation(index,:),startpoint];end附录7:连续Hopfield网络求解TSP的matlab程序%用离散Hopfield求解TS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论