求助!!!有监督的SOM的程序的问题
求助!有监督的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组合,代表类别。
希望各位大侠帮帮忙,谢谢啦!!!!!~
|