⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bam.m

📁 利用hopfield网络进行判断和分类的奇偶分类算法
💻 M
字号:
clear all;
close all;
%%%%%%%%标准样本矢量储存到两个矩阵中%%%%%%%%
A=zeros(15,4);
B=zeros(10,4);
A(:,1)=[1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1]';
A(:,2)=[1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1]';
A(:,3)=[1,1,1,-1,-1,-1,1,1,1,-1,-1,-1,1,1,1]';
A(:,4)=[1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1]';
B(:,1)=[1,1,1,1,-1,-1,-1,-1,1,1]';
B(:,2)=[1,1,1,-1,-1,-1,1,1,1,-1]';
B(:,3)=[1,1,-1,-1,1,1,-1,-1,1,1]';
B(:,4)=[1,-1,1,-1,1,-1,1,-1,1,-1]';
%%%%%%%%利用Hebb规则计算网络的连接权矩阵%%%%%%%%
W=zeros(15,10);
for s=1:4
    W=W+A(:,s)*B(:,s)';
end
disp('连接权矩阵W=');
disp(W);
%%分别计算四对矢量对应稳定状态的能量值%%
E=zeros(1,4);
for s=1:4
    E(1,s)=-A(:,s)'*W*B(:,s);
end
disp('四对矢量对应稳定状态的能量值分别为:');
disp(E);
%%验证网络的联想能力%%
i=fix(rand(1)*4)+1;
disp(['取B第',num2str(i),'组输入']);
AI=sign(W*B(:,i));
if AI==A(:,i)
    disp('由B到A联想成功');
end
j=1;%fix(rand(1)*4)+1;
disp(['取A第',num2str(j),'组输入']);
BI=sign(W'*A(:,j));
if BI==B(:,j)
    disp('由A到B联想成功');
end
%%验证网络的抗噪能力%%
index=randerr(1,15,2);
index=1-2*index;
Al=A(:,j).*index';
t=0;                 %循环次数初始化。
flag=-1;              %标志量用于控制循环,若循环时间太长或联想成功,则退出循环
while flag<0
    t=t+1;
    Bl=sign(W'*Al);
    Al=sign(W*Bl);
    if B(:,j)==Bl
        flag=1;
    end
    if t>200
        disp('循环时间太长,退出循环,加噪后由A到B联想失败');
        flag=1;
    end
end
if t<=200
    disp(['加噪后由A到B联想成功,循环次数为:',num2str(t)]);
end
%验证A矢量1~4位取反时的抗噪能力以及联想正确率%
k=fix(rand(1)*4)+1;
num=10000;
for m=1:4;                   
  numr=0;%记录联想正确的数值
  numw=0;%记录联想错误的数值
    for p=1:num
   index1=randerr(1,15,m);
   index1=1-2*index1;
   Alk=A(:,k).*index1';
   q=0;                %循环次数初始化。
   flagn=-1;           %标志量用于控制循环,若循环时间太长或联想成功,则退出循环
   while flagn<0
       q=q+1;
       Blk=sign(W'*Alk);
       Alk=sign(W*Blk);
       if B(:,k)==Blk
        flagn=1;
       end
       if q>200
        flagn=0;
       end
   end 
    if flagn==1
       numr=numr+1;
    else
       numw=numw+1;
    end
end
r_per=numr/num;
disp(['对A',num2str(k),'选取',num2str(m),'位进行加噪时正确率为:',num2str(r_per)]);
end
%%4个不同A矢量的1~3位取反时的联想正确率%%
for n=1:4
    for m=1:3;                   %m数值取1~4
  num_r=0;%记录联想正确的数值
  num_w=0;%记录联想错误的数值
    for p=1:num
   index2=randerr(1,15,m);
   index2=1-2*index2;
   Aln=A(:,n).*index2';
   r=0;                %循环次数初始化。
   flagm=-1;           %标志量用于控制循环,若循环时间太长或联想成功,则退出循环
   while flagm<0
       r=r+1;
       Bln=sign(W'*Aln);
       Aln=sign(W*Bln);
       if B(:,n)==Bln
        flagm=1;
       end
       if r>200
        flagm=0;
       end
    end 
    if flagm==1
       num_r=num_r+1;
    else
       num_w=num_w+1;
    end
    end
    t_per=num_r/num;
    disp(['A',num2str(n),'矢量取',num2str(m),'位进行加噪时正确率为:',num2str(t_per)]);
    end
end

⌨️ 快捷键说明

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