%数据初始化
clear all;
clc;
[n1] = xlsread('D://mathwork//作业数据_2018');
%数据预处理
[m,n]=size(n1);
count = 0;
for i=1:m
if isnan(n1(i,7)) || isnan(n1(i,8)) ||isnan(n1(i,9))
fprintf('空数据出现在第%d行\n',i);
count = count + 1;
record(count) = i;
end
end
%删除无效数据行
for k = 1:count
if k == 1
n1(record(k),:) = [];
else
n1(record(k)-k+1,:) = [];
end
end
[S,N]=size(n1);
L = 300;
height = n1(:,4);
weight = n1(:,5);
Uh = uniform(height);
Uw = uniform(weight);
w1 = [0.2 0.2 0.2 0.2 0.2;0.2 0.2 0.2 0.2 0.2 ;0.2 0.2 0.2 0.2 0.2 ;0.2 0.2 0.2 0.2 0.2;0.2 0.2 0.2 0.2 0.2 ];
w2 = [0.2,0.2,0.2,0.2,0.2 ];
critical = 0.04;
error = 0;
for i = 1:L %以样本数据的前L项作为训练集
y = n1(i,2);
i1 = [Uh(i),Uw(i),n1(i,7),n1(i,8),n1(i,9)];
%前向传播
[o1,o2] = forward(i1,w1,w2);
error(i) = ((y - o2)^2) / 2;%样本的误差累加
%在需要时进行后向传播修正权值
if error(i) < critical %当前误差是否小于阈值
if max(error) < critical %是否全部误差都小于阈值
break;
end
else
[w1,w2] = backward(y,i1,o1,o2,w1,w2);%若不满足条件则继续反向传播
end
end
disp(max(error));
%以后(S - L)项作为测试集,导出测试集样本标签并与测试集分类结果做比较
%sn:预测值为0的个数,sp:预测值为1的个数,s0:预测正确的个数
%s1:预测正确的1个个数,s2:预测正确的0的个数
s0 = 0;
sn = 0;
sp = 0;
s1 = 1;
s2 = 0;
for i = (L + 1):S
y2 = n1(i,1);
i1 = [Uh(i),Uw(i),n1(i,7),n1(i,8),n1(i,9)];
[o1,o2] = forward(i1,w1,w2);
pp(i - L,1) = o2; %pp为测试集分类结果
end
for j = 1:(S - L)
ppp(j,1) = n1(j + L,2); %ppp为测试集样本标签
end
for k = 1:(S - L)
if abs(ppp(k,1) - pp(k,1)) < 0.5
s0 = s0 + 1;
if pp(k,1) == 1
sp = sp + 1;
end
if pp(k,1) == 0
sn = sn + 1;
end
if (ppp(k,1)==pp(k,1))&&(pp(k,1)==1)
s1 = s1 + 1;
end
if (ppp(k,1)==pp(k,1))&&(pp(k,1)==0)
s2 = s2 + 1;
end
end
end
acc1 = s0/(S - L);
%bp分类器的acc,auc和roc图像
%SE,SP,ACC和AUC
fprintf('分类正确有%d个\n',s0);
% fprintf('男生预测正确有%d个\n',s1);
% fprintf('女生预测正确有%d个\n',s2);
figure(1)
plotroc(ppp.',pp.');
A = auc(ppp.',pp.');
SE = s1/sp;
SP = s2/sn;
title({'BP分类器的ROC函数图像';['SE =' num2str(SE),' SP =' num2str(SP),' acc=' num2str(acc1),' auc =' num2str(A)]},'fontsize',10);
评论0