郑华2150230505SOM网络模型Word格式文档下载.docx
《郑华2150230505SOM网络模型Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《郑华2150230505SOM网络模型Word格式文档下载.docx(23页珍藏版)》请在冰点文库上搜索。
图1
上图出自朱安民教授的课件。
输入层节点个数为2,即为每个城市的坐标。
输出层节点个数为城市的个数29。
2.算法步骤;
图2
首先要初始化神经网络的权值,然后将坐标输入到神经网络中去,竞争出来一个优胜点,然后计算出离这个点最近的邻居,然后修改优胜点和他的邻居的
3.运行程序,结果图示。
图3
3.1对101个城市进行处理的结果截图,分别运行3次,结果图是否一样?
为什么?
三次的结果不一样,如下三个图所示,原因是初始状态的选取是随机的,不一定那个点就是优胜点,而且结果也是最优路径的近似值,并不是完全的最优路径,所以结果也是不尽相同的。
但是,每次结果的误差都很小,所以这种算法还是可行的。
图4
图5
图6
3.2对29个城市进行处理的结果截图,分别运行3次,结果图是否一样?
图7
图8
图9
由以上三个图可知结果图是一样的,因为点比较少,用SOM算法算出来的路径就是最优路径,因此结果是一样的。
3.3分析学习率alpha的取值范围[0.001,0.1]对结果的影响;
Alpha=0.001时:
time=8.106187s
图10
Alpha=0.01时:
time=9.079510s
图11
Alpha=0.1时:
time=8.741680s
图12
经过试验分析可以得出:
当alpha=0.01这个量级的时候结果是最准确的,而且用时也不是很多,所以经过验证alpha最好取值为0.03,alpha取值太大或者太小的时候都会产生误差。
3.4分析学习率beta的取值范围[0.001,0.5]对结果的影响;
图13beta=0.001time=10.597906s
beta=0.01time=10.601020s
图14
beta=0.1time=6.787424s
图15
beta=0.5time=6.066585s
图16
由以上四个结果可知:
随着beta的增大,运行时间缩短,但是结果最准确而且速度相对快的点在beta等于0.1的时候,所以我们以后运行程序就把beta设置为0.1。
beta的值如果太小的话就无法趋近并且与表示城市的那些点重合,太大的话路线也会变长。
3.5邻居函数F(percent,G)范围的确定参数percent的取值[0.10.8]对结果的影响;
Percent=0.1time=8.014007
图17
Percent=0.2time=7.614537s
图18
Percent=0.4time=7.389752s
图19
Percent=0.8time=7.173295s
图20
随着percent的增大误差率是随之增大的,因此,percent应该取一个较小的值,但是,随着percent的增大,运行时间是减小的,因此,percent也不能是个太小的值,所以由实验得出,percent取0.2的时候效果最好。
四、总结分析
1.程序运行结果的列表,包括7组不同数据、3次不同的运行次数、不同的参数选择的情况下的路径长度、运行时间、以及最短路径的长度。
2.结果列表的文字说明。
3.实验过程当中遇到的问题、教训的总结。
由实验得出,当alpha=0.03,beta=0.1,percent=0.2的时候,运行效果最佳,运行时间较短而且准确性较高。
alpha=0.03,beta=0.1,percent=0.2
图21
图22
运行时间:
time=7.798191s
五、附录源程序
注意:
包括主要功能的注释说明;
如果是自己编写的请特别注明;
如果是参考网上的,注明源代码出处和修改处。
Main
function[]=Main(data,bestpath)
tic%计时
%data:
训练集,有三列,第一列是行标,第二、三列是坐标;
route;
得到的有序的路径;
bestpath:
为最优路径,每行只有一列,表示城市标号
%参数配置
bug=0;
%调试模式1,运行模式0
norm=0;
%是否对数据归一化,1:
归一化;
0:
不归一化
alpha=0.03;
beta=0.1;
%学习率
beta1=beta;
percent=0.2;
citynum=length(data);
%城市数目
neutralNum=citynum*2;
%输出神经元数目
r=10;
%初始半径
iterNum=1000;
%定义迭代数
data2=data;
%备份
ifnorm==1
%归一化
max1=max(data(:
2));
max2=max(data(:
3));
min1=min(data(:
min2=min(data(:
fori=1:
1:
length(data)
data(i,2)=(data(i,2)-min1)/(max1-min1);
data(i,3)=(data(i,3)-min2)/(max2-min2);
%0到1
end
end
%初始化权重值,W
fori=1:
neutralNum
forj=1:
2
W(i,j)=rand;
%训练
foriter=1:
iterNum
error=0;
%记录精度
forcount=1:
citynum
i=floor(rand*citynum)+1;
%现随机取数据
coord=data(i,2:
3);
%城市的坐标
[winnerIndex,distValSet]=findWinner(coord,W);
%winnerIndex:
找到的优胜者下标;
distValSet;
输入向量与所有的神经元的距离值得集合;
%更新优胜者和邻居的权值
dist1=dist(winnerIndex,j,neutralNum);
%dist(i,j,M)计算s神经元i与优胜神经元j之间的距离,其中M为总的神经元
adjacentFuncVal=adjacentFunction(dist1,r);
%findWinner(A,W)求近邻函数的结果值;
dist;
神经距离优胜神经元的距离;
r;
本次迭代的近邻半径
%更新权值
W(j,1)=W(j,1)+beta*adjacentFuncVal*(coord
(1)-W(j,1));
W(j,2)=W(j,2)+beta*adjacentFuncVal*(coord
(2)-W(j,2));
error=error+distValSet(winnerIndex);
%检查精度,精度满足则退出
iferror<
percent
disp('
break'
);
break;
%参数更新
r=round((r-1)*(1-iter/(iterNum)))+1;
%更新半径
beta=beta-beta1/(iterNum);
%更新学习率
%调试工具
ifbug==1
ifiter>
1
cla
%画图
plot(data(:
2),data(:
3),'
ro'
%axis([0,1,0,1]);
holdon;
[path1,path2]=getPath(data,W);
%获取路径
drawPath(path1);
%绘制路径
pause
(1);
%休眠
%统计结果
[distantOfBestPath,distantOfRusultPath,errorRate,]=compareToBestPath(path2,bestpath,data2);
%与最优路径对比,path2:
路径,格式为路径按照行数排序,第二列是城市编号;
最优路径;
data2:
城市坐标数据
str=sprintf('
%s%d%s%d%s%d%s%d'
'
最优路径长度='
distantOfBestPath,'
;
结果路径长度='
distantOfRusultPath,'
误差率='
errorRate,'
迭代次数='
iter);
title(str);
%axis([-0.2,1.2,-0.2,1.2]);
[path1,path2]=getPath(data,W)%获取路径
[distantOfBestPath,distantOfRusultPath,errorRate,data3]=compareToBestPath(path2,bestpath,data2);
%s%d%s%d%s%d'
errorRate);
%画最优路径
figure;
plot(data3(:
1),data3(:
2),'
ro-'
title('
最优路径'
iter
toc%完毕
findWinner:
function[winnerIndex,distValSet]=findWinner(A,W)
A:
输入的向量W:
所有神经元的权重值的集合
iputDim=length(A);
%iputDim:
输入向量的维度值
neuNum=length(W);
winnerIndex=1;
%计算输入的向量W:
所有神经元的权重之间的距离
neuNum
distant=0;
iputDim
distant=distant+(A(j)-W(i,j))^2;
distValSet(i)=sqrt(distant);
ifi>
ifdistValSet(winnerIndex)>
distValSet(i)
winnerIndex=i;
compareToBestPath:
function[distantOfBestPath,distantOfRusultPath,errorRate,data2]=compareToBestPath(path2,bestpath,data)
data:
城市坐标数据;
最优路径
%的坐标数据
dist1=0;
dist2=0;
data2(1,:
)=data(bestpath(1,1),2:
(length(bestpath)-1)
cityNum1=bestpath(i,1);
cityNum2=bestpath(i+1,1);
cityPos1=data(cityNum1,2:
cityPos2=data(cityNum2,2:
data2(i+1,:
)=data(cityNum2,2:
d=(cityPos1
(1)-cityPos2
(1))^2+(cityPos1
(2)-cityPos2
(2))^2;
d=sqrt(d);
dist1=dist1+d;
cityNum1=bestpath(1,1);
cityNum2=bestpath(length(bestpath),1);
cityPos1=data(cityNum1,2:
cityPos2=data(cityNum2,2:
d=(cityPos1
(1)-cityPos2
(1))^2+(cityPos1
(2)-cityPos2
(2))^2;
d=sqrt(d);
dist1=dist1+d;
distantOfBestPath=dist1;
%最优路径长度
(length(path2)-1)
cityNum1=path2(i,2);
cityNum2=path2(i+1,2);
dist2=dist2+d;
cityNum1=path2(1,2);
cityNum2=path2(length(path2),2);
dist2=dist2+d;
distantOfRusultPath=dist2;
%结果路径长度
errorRate=(distantOfRusultPath-distantOfBestPath)/distantOfBestPath;
%误差率
注:
部分核心代码来源于网络以及参照老师给的代码。
自己增加一些功能,就是输出最优路径长度,及结果路径长度,进行对比。
本次实验,获益匪浅,明白了SOM神经网络算法的本质,感谢老师!
指导教师批阅意见:
√
实验报告内容的确完整性
(20分)
实验步骤的清晰程度
实验数据的准确性
实验结果和分析的正确性
实验态度(实验表现、格式排版、独立完成、按时提交)(20分)
完整
20
较完整
15
不够完整
10
清晰
较清晰
不够清晰
准确
较准确
不够准确
正确
较正确
不够正确
规范
较规范
不够规范
说明:
成绩评定:
指导教师签字:
朱安民
2016年6月16日
备注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。