📄 bam.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 + -