SOM 自组织特征映射神经网络
生物学研究表明,在人脑的感觉通道上,神经元的组织原理是有序排列的。当外界的特定时空信息输入时,大脑皮层的特定区域兴奋,而且类似的外界信息在对应的区域是连续映像的。生物视网膜中有许多特定的细胞对特定的图形比较敏感,当视网膜中有若干个接收单元同时受特定模式刺激时,就使大脑皮层中的特定神经元开始兴奋,输入模式接近,与之对应的兴奋神经元也接近;在听觉通道上,神经元在结构排列上与频率的关系十分密切,对于某个频率,特定的神经元具有最大的响应,位置相邻的神经元具有相近的频率特征,而远离的神经元具有的频率特征差别也较大。大脑皮层中神经元的这种响应特点不是先天安排好的,而是通过后天的学习自组织形成的。
据此芬兰Helsinki大学的Kohonen T.教授提出了一种自组织特征映射网络(Self-organizing feature Map,SOM),又称Kohonen网络[1-5]。Kohonen认为,一个神经网络接受外界输入模式时,将会分为不同的对应区域,各区域对输入模式有不同的响应特征,而这个过程是自动完成的。SOM网络正是根据这一看法提出的,其特点与人脑的自组织特性相类似。
一、竞争学习算法基础:
1、自组织神经网络结构
(1)定义
自组织神经网络是无导师学习网络。它通过自动寻找样本中的内在规律和本质属性,自组织、自适应地改变网络参数与结构。
(2)结构
层次型结构,具有竞争层。典型结构:输入层+竞争层。如图1所示。
a. 输入层:接受外界信息,将输入模式向竞争层传递,起“观察”作用。
b.竞争层:负责对输入模式进行“分析比较”,寻找规律,并归类。
二、自组织神经网络的原理
1.分类与输入模式的相似性
分类是在类别知识等导师信号的指导下,将待识别的输入模式分配到各自的模式类中,无导师指导的分类称为聚类,聚类的目的是将相似的模式样本划归一类,而将不相似的分离开来,实现模式样本的类内相似性和类间分离性。由于无导师学习的训练样本中不含期望输出,因此对于某一输入模式样本应属于哪一类并没有任何先验知识。对于一组输入模式,只能根据它们之间的相似程度来分为若干类,因此,相似性是输入模式的聚类依据。
2、相似性测量
神经网络的输入模式向量的相似性测量可用向量之间的距离来衡量。常用的方法有欧氏距离法和余弦法两种。
(1)欧式距离法
设X,Xi为两行向量,其间的欧式距离
d越小,X与Xi越接近,两者越相似,当d=0时,X=Xi 以d=T(常数)为判据,可对输入向量模式进行聚类分析:由于d12d23d31均小于T,d45d56d46均小于T,而d1i>T (i=4,5,6);d2i>T(i=4,5,6),d3i>T(i=4,5,6),
故将输入模式 Xi按如下分类:
(2)余弦法:
设X,Xi为两向量,其间的夹角余弦
cosΨ=
举例:
鹫尾属植物数据集含有三类样本,前 50 个样本为一类,中间 50 个样本为一类,后 50 个样本为一类。每个样本有四维特征。用SOM对这些样本分类。
1)、数据处理
训练集:取每个样本的前25个作为训练数据集,总共有75个数据;
测试集:每个样本的后25个构成测试数据集。总共75个数据。
2)、结构
输入层:每个样本有四维特征,所以输入层有4个神经元。
输出层:输入层神经元经过一个四维的权连接分别至三个输出神经元。
3)、参数的初始化
a.神经元节点总数:3*1
b.神经元权值初始化:[0,1]之间的随机数
c. 学习率:0.6;
迭代次数7000;
邻域初始值:2
d、邻域函数:
e、权值调整公式:
4)代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | %som实现 %2016-11-12 %by wangbaojia % som原理及参数说明 % 1.竞争:匹配最佳神经元---------->计算每个样本和初始神经网络的距离,距离最近神经元作为获胜神经元 % % 2.合作:在权值更新过程中,不仅获胜神经元的权 %值向量得到更新,而且其近邻神经元的权值向量也按照某个“近邻函数”进行更新。这样在开 %始时移动量很大,权值向量大致地可按它们的最终位置来排序; %获胜神经元决定兴奋神经元的拓扑邻域的空间位置,从而提供了相邻神经元合作的基础 % 拓扑邻域:规则多边形一般都可以作为邻域形状,常用的主要有正方形或六边形,正方形更为普遍 % %权重向量的调整就发生在获胜神经元的邻域内。在训练的刚开始阶段,这个邻域比较大, %随着训练的进行,这个邻域开始不断减小 % % 3.自适应:权值更新过程 % 算法: % 1.初始化 % 1)迭代次数:时间步长iter % 2)输出结点权值向量初始值,向量各元素可选区间(0,1)上的随机值,这里选择正方形邻域 % 3)学习率初始值 % 4)邻域半径的设置应尽量包含较多的邻神经元,整个输出平面的一半 % 2.求竞争获胜神经元;欧拉距离函数求解 % 3.权值更新: % 获胜节点和邻域范围内神经元集合的m个节点更新权值,j=1:m; % wj(t+1)=wj(t)+learnfun(t)*neighborfun(t)*(x-wj); % 4.更新学习率,更新邻域函数 % neighborfun(t)=neighbor0*exp(-dij/t1); t1=iter/log(neighbor0) % learnfun(t)=learn0*exp(-t/t2); t2=iter % 5.当特征映射不再发生明显变化时或达到最大网络训练次数时退出,否则转入第2步 %载入数据,data数据每一行为一个用空格区分的多维数据样本 tic ; %样本数据的位置 file_path='E:\machine learning\神经网络第二次作业\SOM\'; path = strcat (file_path, 'data.txt' ); %加载所有数据 full_data= load ( path ); %数据处理:训练集和测试集各占一半 data= zeros (75,4); %训练数据集 test_data= zeros (75,4); %测试数据集 n=0;m=0; for j =1:6 if rem ( j ,2)==1 data(25*n+1:25*(n+1),:)=full_data(25*( j -1)+1:25* j ,:); n=n+1; else test_data(25*m+1:25*(m+1),:)=full_data(25*( j -1)+1:25* j ,:); m=m+1; end end [data_row,data_clown]= size (data); %自组织映射网络m*n m=3; n=1; %神经元节点总数som_sum som_sum=m*n; %权值初始化,随机初始化 w = rand (som_sum, data_clown); %初始化学习率 learn0 = 0.6; learn_rate = learn0; %学习率参数 learn_para=1000; %设置迭代次数 iter =700; %神经元位置 [I,J] = ind2sub ([m, n], 1:som_sum); %邻域初始化 neighbor0 =2; neighbor_redius = neighbor0; %邻域参数 neighbor_para = 1000/ log (neighbor0); %迭代次数 for t=1:iter % 样本点遍历 for j =1:data_row %获取样本点值 data_x = data( j ,:); %找到获胜神经元 [win_row, win_som_index]= min (dist(data_x,w')); %获胜神经元的拓扑位置 [win_som_row,win_som_cloumn] = ind2sub ([m, n],win_som_index); win_som=[win_som_row,win_som_cloumn]; %计算其他神经元和获胜神经元的距离,邻域函数 %distance_som = sum(( ([I( : ), J( : )] - repmat(win_som, som_sum,1)) .^2) ,2); distance_som = exp ( sum (( ([I( : ), J( : )] - repmat (win_som, som_sum,1)) .^2) ,2)/(-2*neighbor_redius*neighbor_redius)) ; %权值更新 for i = 1:som_sum % if distance_som(i)<neighbor_redius*neighbor_redius w( i ,:) = w( i ,:) + learn_rate.*distance_som( i ).*( data_x - w( i ,:)); end end %更新学习率 learn_rate = learn0 * exp (-t/learn_para); %更新邻域半径 neighbor_redius = neighbor0* exp (-t/neighbor_para); end %data数据在神经元的映射 %神经元数组som_num存储图像编号 som_num= cell (1, size (w,1)); for i =1: size (w,1) som_num{1, i }=[]; end %每个神经元节点对应的data样本编号 for num=1:data_row [som_row,clown]= min ( sum (( (w - repmat (test_data(num,:), som_sum,1)) .^2) ,2)); som_num{1,clown}= [som_num{1,clown},num]; end %存储神经元数组,.mat格式 path1= strcat (file_path, 'som_num.mat' ); save (path1, 'som_num' ); toc ; |
实验结果:
分为三类:
第一类:51 54 55 56 57 58 61 62 63 65 66 67 69 70 71 73 74
第二类: 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 52 53 59 60 64 68 72 75
第三类:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
分类正确率:89.33%
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下