sommap.m

来自「这是一个用matlab写的SOM算法程序,效果不错」· M 代码 · 共 88 行

M
88
字号
function somMap(eta0,var0,itera)
eta0=0.02;
var0=4;
itera=100;
weight=zeros(25,2);
T2=1000;
T1=1000/log(var0);
for i=1:25
    for j=1:2
        weight(i,j)=0;
    end;
end;

P=load('data.txt');
num=length(P);
net = newsom([0 2; 0 1],[5 5]);
%D=distance(25);
D=net.layers{1}.distances;
%D=D';

for it=1:itera
    temp=zeros(1,25);
    for i=1:num
       %取得一个训练样例
        x=P(i,:);         
        for m=1:25
            for n=1:2
               result(n)=x(n)-weight(m,n);
            end;
            temp(m)=norm(result);
        end;             
        [maxT,ix]=min(temp);
        ixm=ceil(ix/5);
        ixn=ix-(ixm-1)*5;       
        varN=var0*exp(-(i-1)/T1);
        etaN=eta0*exp(-(i-1)/T2);  
        dJIX=D(ix,:);  
        
        if it<=itera/2
           for m=1:25
               if dJIX(m)<=2
                   dJIX(m)=0;
               end;
           end;
        else
           for m=1:25
               if dJIX(m)<=1
                   dJIX(m)=0;
               end;
           end;
        end;
       
        for m=1:25
            dJIX(m)=dJIX(m)*dJIX(m);
        end;
        
        hJIxN=exp(-dJIX/(2*varN*varN));          
        for m=1:25                         
            if  hJIxN(m)<0.9
                 hJIxN(m)=0;
            end;                
            weight(m,:)=weight(m,:)+hJIxN(m)*etaN*(x-weight(m,:));
        end;
        
    end;
end;
P=P';
figure
plot(P(1,:),P(2,:),'.b','markersize',5);
hold on;
plotsom(weight,D);
hold off;

function d=distance(l)
d=zeros(25,25);
pos=zeros(25,2);
for i=1:5
    for j=1:5
        pos((i-1)*5+j,:)=[i,j];
    end;
end;
for i=1:25
    temp=pos(i,:);
    for j=1:25
        other=pos(j,:);
        d(i,j)=max(abs(temp-other));
    end;
end;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?