做网站需要的参考文献,wordpress主题图片替换,网站建设公司哪家好 该如何选择,山东省品牌专业群建设网站与上篇文章不同#xff0c;仔细读了上篇文章的小伙伴应该知道#xff0c;BP神经网络是有一个学习率的#xff0c;而这个学习率很大程度上决定着神经网络的效果。这里采用自适应学习率#xff0c;实现纯手写BP神经网络。 编程时#xff0c;激活函数选择Sigmoid函数#xf… 与上篇文章不同仔细读了上篇文章的小伙伴应该知道BP神经网络是有一个学习率的而这个学习率很大程度上决定着神经网络的效果。这里采用自适应学习率实现纯手写BP神经网络。 编程时激活函数选择Sigmoid函数使用者也可以根据需要自行更改 以经典的红酒数据分类为例红酒数据大小为178*14最后一列为标签列。随机取数据的百分之70作为训练集百分之30作为测试集。 红酒数据的获取可以参考常用UCI数据集链接放在文末其中的Wine.mat即为红酒数据。 废话不多说接下来直接上代码 首先是主程序代码 close all
warning off
%% 数据读取
clc
clear
load Wine
%% 数据载入
dataWine;
datadata(randperm(size(data,1)),:); %此行代码用于打乱原始样本使训练集测试集随机被抽取有助于更新预测结果。
inputdata(:,1:end-1);
output1 data(:,end);
%把输出从1维变成3维
for i1:size(data,1)switch output1(i)case 1output(i,:)[1 0 0];case 2output(i,:)[0 1 0];case 3output(i,:)[0 0 1];end
end%% 选取训练数据和测试数据
mfix(size(data,1)*0.7); %训练的样本数目
input_traininput(1:m,:);
output_trainoutput(1:m,:);
input_testinput(m1:end,:);
output_testoutput(m1:end,:);
%% 数据归一化
[inputn,inputps]mapminmax(input_train,0,1);
% [outputn,outputps]mapminmax(output_train);
inputn_testmapminmax(apply,input_test,inputps);
%网络结构
innumsize(input,2);
midnum20;
outnumsize(output,2);
%权值阈值初始化
w1rand(midnum,innum);
b1rand(midnum,1);
w2rand(midnum,outnum);
b2rand(outnum,1);
w2_1w2;w2_2w2_1;
w1_1w1;w1_2w1_1;
b1_1b1;b1_2b1_1;
b2_1b2;b2_2b2_1;
xite0.0002;
xite2 0.001;Izeros(1,midnum);
Ioutzeros(1,midnum);
FIzeros(1,midnum);
dw1zeros(innum,midnum);
db1zeros(1,midnum);
loopNumber 2000;
fprintf(自适应学习率training is begining……\n);
tic
for ii1:loopNumberSSE(ii)0; %训练误差for i1:1:size(inputn,2)%选择本次训练数据xinputn(:,i);
% 隐含层输出for j1:1:midnumI(j)inputn(:,i)*w1(j,:)b1(j);Iout(j)1/(1exp(-I(j)));end%输出层输出ynw2*Ioutb2;%预测误差eoutput_train(:,i)-yn;SSE(ii)SSE(ii)1/2*sum(e.^2);%计算w2.b2调整量dw2e*Iout;db2e;%计算w1 b1调整量for j1:1:midnumS1/(1exp(-I(j)));FI(j)S*(1-S);endfor k1:1:innumfor j1:1:midnumhh 0;for ij 1:size(e,1)hh hh e(ij)*w2(j,ij);enddw1(k,j)FI(j)*x(k)*hh;db1(j)FI(j)*hh;endend%权值阈值更新ff(ii) xite2-ii*(xite2-xite)/loopNumber; %自适应学习率核心公式w1w1_1ff(ii)*dw1;b1b1_1ff(ii)*db1;w2w2_1ff(ii)*dw2;b2b2_1ff(ii)*db2;w1_2w1_1;w1_1w1;w2_2w2_1;w2_1w2;b1_2b1_1;b1_1b1;b2_2b2_1;b2_1b2; endSSE(ii) SSE(ii)/size(inputn,2);if mod(ii,500) 0disp([训练过程,num2str(ii), /, num2str(loopNumber),误差为,num2str(SSE(ii))])end
end
disp( [训练时间: ,num2str(toc) ] );%% 将优化的权值阈值带入用测试集求解
for i1:1:size(inputn_test,2)for j1:1:midnumI(j)inputn_test(:,i)*w1(j,:)b1(j);Iout(j)1/(1exp(-I(j)));end%输出层输出ynw2*Ioutb2;an0(:,i) yn;
endpredict_labelzeros(1,size(an0,2));
for i1:size(an0,2)predict_label(i)find(an0(:,i)max(an0(:,i)));
end
outputtzeros(1,size(output_test,2));
for i1:size(output_test,2)outputt(i)find(output_test(:,i)max(output_test(:,i)));
end
fprintf(test is over and plot begining……\n);
accuracysum(outputtpredict_label)/length(predict_label); %计算预测的确率
disp([准确率,num2str(accuracy*100),%]) % 作图
figure
stem(1:length(predict_label),predict_label,b^)
hold on
stem(1:length(predict_label),outputt,r*)
legend(预测类别,真实类别,NorthWest)
title({BP神经网络的预测效果,[测试集正确率 ,num2str(accuracy*100), %]})
xlabel(预测样本编号)
ylabel(分类结果)
set(gca,fontsize,10)
%输出准确率
disp(---------------------------测试准确率-------------------------)disp([准确率,num2str(accuracy*100),%])
% 画方框图
confMat confusionmat(outputt,predict_label); %output_test是真实值标签
figure;
set(gcf,unit,centimeters,position,[15 5 20 15])
yanseplot(confMat.);
xlabel(Predicted label)
ylabel(Real label)
set(gca,fontsize,10)
hold off%% 对训练集进行测试for i1:1:size(inputn,2)for j1:1:midnumI(j)inputn(:,i)*w1_1(j,:)b1_1(j);Iout(j)1/(1exp(-I(j)));end%输出层输出ynw2_1*Ioutb2_1;an1(:,i) yn;
endpredict_label2zeros(1,size(an1,2));
for i1:size(an1,2)predict_label2(i)find(an1(:,i)max(an1(:,i)));
end
outputt2zeros(1,size(output_train,2));
for i1:size(output_train,2)outputt2(i)find(output_train(:,i)max(output_train(:,i)));
end
fprintf(test is over and plot begining……\n);
accuracysum(outputt2predict_label2)/length(predict_label2); %计算预测的确率% 作图
figure
stem(1:length(predict_label2),predict_label2,b^)
hold on
stem(1:length(predict_label2),outputt2,r*)
legend(预测类别,真实类别,NorthWest)
title({BP神经网络的预测效果,[训练集正确率 ,num2str(accuracy*100), %]})
xlabel(预测样本编号)
ylabel(分类结果)
set(gca,fontsize,12)
%输出准确率
disp(---------------------------训练集准确率-------------------------)disp([训练集准确率,num2str(accuracy*100),%])
% 画方框图
confMat confusionmat(outputt2,predict_label2); %output_test是真实值标签
figure;
set(gcf,unit,centimeters,position,[15 5 13 9])
yanseplot(confMat.);
xlabel(Predicted label)
ylabel(Real label)
hold offfigure
plot(SSE)
title(误差曲线)
ylabel(误差)
xlabel(迭代次数)figure
plot(ff)
title(自适应学习率变化曲线)
ylabel(学习速度)
xlabel(迭代次数) 下面直接上结果图。 首先是训练集的测试结果图 测试集的训练结果图 同样再附一张训练集的热力图。热力图的效果和第一张图是一致的在类别情况较多时多采用热力图 可以看到手写的附加动量因子的BP神经网络matlab代码可以实现对红酒数据的精准识别测试集的识别率高达98.14%。 由于BP神经网络的偶然性建议大家多运行几次除此之外隐含层节点个数自适应学习率的上下限值都是可以自行调整的。大家根据自己的项目随意调整即可。 UCI常用数据集链接 https://pan.baidu.com/s/10gYszv5_BCfr43RMLOVXVQ?pwd8888