📄 bp_man.m
字号:
w_ji=rand(20,10);%输入层10个,隐层20,输出层3
w_kj=rand(3,20);
theta_j=rand(20,1);
theta_k=rand(3,1);
train_num=2000;
train_file=30;
yita=0.5;
% 训练样本
for num=1:train_num
file_num=1;
e=0;
while file_num<=train_file
for t=1:3
switch t
case 1, string1='E:\lxp课件\神经网络\B\';, y=[1 0 0]';
case 2, string1='E:\lxp课件\神经网络\T\';, y=[0 1 0]';
case 3, string1='E:\lxp课件\神经网络\W\';, y=[0 0 1]';
end
% 读取数据
string2=int2str(file_num);
string=strcat(string1,string2);
fid=fopen(string);
source_data=fscanf(fid,'%4d');
fclose(fid);
% 提取特征作为输入矢量x
data=fft(source_data,1024);
a=abs(data(2:513)); %取fft变换结果的512个值的模
max_a=max(a);
min_a=min(a);
median_a=median(a);%样本中位数,几乎不受个别游离数据影响
mad_a=mad(a);%样本绝对值偏差,受游离数据影响小于样本标准差和方差
for i=1:512 %归一化
a(i)=(a(i)-min_a)/(max_a-min_a);
end
for i=1:8
for j=1:64
t(j,i)=a(j+64*(i-1));
end
end
% max_t=max(t,[],1);
% min_t=min(t,[],1);
mean_t=mean(t,1);
x=[mean_t median_a mad_a]';% 输入层输入10*1
% 正向传播算法
o_i=1./(1+exp(-x)); % 输入层输出10*1
x_j=w_ji*o_i-theta_j; %隐层输入20*1
o_j=1./(1+exp(-x_j)); % 隐层输出20*1
x_k=w_kj*o_j-theta_k; %输出层输入3*1
o_k=1./(1+exp(-x_k)); % 输出层输出3*1
% 反向传播算法
delta_k=(y-o_k).*o_k.*(1-o_k); % 输出层误差3*1
delta_wkj=yita*delta_k*o_j'; % 权值w_kj调整量;学习率0.5
delta_thetak=yita*delta_k;%输出层至隐含层阈值调整量
delta_j=o_j.*(1-o_j).*(w_kj'*delta_k); % 隐层误差20*1
delta_wji=yita*delta_j*o_i'; % 权值w_ji调整量
delta_thetaj=yita*delta_j;%隐含层至输入层阈值调整量
w_ji=delta_wji+w_ji;
w_kj=delta_wkj+w_kj;
theta_k=delta_thetak+theta_k;
theta_j=delta_thetaj+theta_j;
e=e+0.5*sum((y-o_k).^2);
if e<0.01
num=train_num;
end
end
file_num=file_num+1;
end
num=num+1;
end
% load w1;
%识别样本
file_num=train_file+1;
recog_num=0;
while file_num<=52
string1='E:\lxp课件\神经网络\W\';
string2=int2str(file_num);
string=strcat(string1,string2);
fid=fopen(string);
source_data=fscanf(fid,'%d');
fclose(fid);
% 提取特征作为输入矢量x
data=fft(source_data,1024);
a=abs(data(2:513)); %取fft变换结果的512个值的模
max_a=max(a);
min_a=min(a);
median_a=median(a);%样本中位数,几乎不受个别游离数据影响
mad_a=mad(a);%样本绝对值偏差,受游离数据影响小于样本标准差和方差
for i=1:512 %归一化
a(i)=(a(i)-min_a)/(max_a-min_a);
end
for i=1:8
for j=1:64
t(j,i)=a(j+64*(i-1));
end
end
% max_t=max(t,[],1);
% min_t=min(t,[],1);
mean_t=mean(t,1);
x=[mean_t max_a min_a]';% 输入层输入10*1
o_i=1./(1+exp(-x)); % 输入层输出10*1
x_j=w_ji*o_i-theta_j; %隐层输入20*1
o_j=1./(1+exp(-x_j)); % 隐层输出20*1
x_k=w_kj*o_j-theta_k; %输出层输入3*1
o_k=1./(1+exp(-x_k)); % 输出层输出3*1
[y,n]=max(o_k);
if n==3
recog_num=recog_num+1;
end
file_num=file_num+1;
end
rate=recog_num/22*100;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -