Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
初级会员
注册日期: 2009-06-10
年龄: 40
帖子: 4
声望力: 0 ![]() |
![]()
求助!有监督的SOM的程序的问题
请各位大侠帮帮忙,我现在想要建立一个有监督的SOM神经网络,它的结构我是这样建立的:输入层输入的样本的维数为5,竞争层的神经元数为10个,结构是2X10,输出层有两个神经元,相邻的各层神经元均相连,相邻神经元的权值都按照原SOM的权值调整公式进行调整~ 哪位大侠能帮我编一下程序,谢谢啦!!!~ 我自己编了一个,可是结果不理想,请大家帮忙看一下: clc clear all P=load('TrainSample.txt'); % 读入样本数据 [m n]=size(P); % 输入样本矩阵的大小 % 初始化 Itera=100; Learn_Rate=zeros(Itera,1); Learn_Rate(1)=0.9; Compet_Neuron=10; Neighbor_Distance=1; Neighbor_Weight=zeros(Compet_Neuron,4); % 初始化为全零的数组,每行代表每个竞争层神经元四邻域内的神经元的权值 for i=1:m Weight_Input_Compet{i}=rand(Compet_Neuron,n); % 定义m个权值矩阵 Weight_Compet_Output{i}=zeros(Compet_Neuron,2); end Label=zeros(m,1); % 开始训练 for i1=1:Itera X=P(i1,:)'; % 输入样本 X(1:3)=(X(1:3)-min(X(1:3)))/(max(X(1:3))-min(X(1:3))); % 将样本向量归一化 % 计算输入样本与权值Weight_Input_Compet的欧氏距离,欧氏距离最小的神经元为获胜神经元 for i2=1:Compet_Neuron Distance(i2)=norm(X-Weight_Input_Compet{i1}(i2,:)'); end for i3=1:Compet_Neuron if(Distance(i3)==min(Distance(1:Compet_Neuron))) Win_Neuron=i3; end end % 更新 Weight_Input_Compet{Win_Neuron}(Win_Neuron,1:n)=Weight_Input_Compet{Win_Neuron}(Win_Neuron,1:n)+Learn_Rate(i1)*(X'-Weight_Input_Compet{Win_Neuron}(Win_Neuron,1:n)); % 更新输入层到竞争层的权值Weigh_Input_Compet Weight_Compet_Output{Win_Neuron}(Win_Neuron,1:2)=Weight_Compet_Output{Win_Neuron}(Win_Neuron,1:2)+Learn_Rate(i1)*(X(4:5)'-Weight_Compet_Output{Win_Neuron}(Win_Neuron,1:2)); % 更新竞争层到输出层的权值Weigh_Compet_Output if(Learn_Rate>=0.01) Learn_Rate(i1)=Learn_Rate(1)*(1-i1/Itera); % 更新学习率 end % Weight_Compet_Output{Win_Neuron} end Weight_Input_Compet{1:m} Weight_Compet_Output{1:m} 输入层的样本的形式是这样的:[x,y,g,c1,c2],其中:x,y为图像中个像素点的坐标值,g为对应像素点的梯度值,c1,c2为0或1的组合,表示的是该样本代表的类别;输出层是这样的:[c1,c2]为0、1组合,代表类别。 希望各位大侠帮帮忙,谢谢啦!!!!!~ |
![]() |
![]() |