?? 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 + -