从0开始编写BP,自适应学习率的BP神经网络,不使用MATLAB工具箱,纯手写matlab代码,以BP分类为例...

与上篇文章不同,仔细读了上篇文章的小伙伴应该知道,BP神经网络是有一个学习率的,而这个学习率很大程度上决定着神经网络的效果。这里采用自适应学习率,实现纯手写BP神经网络。

编程时,激活函数选择Sigmoid函数,使用者也可以根据需要自行更改!

以经典的红酒数据分类为例,红酒数据大小为178*14,最后一列为标签列。随机取数据的百分之70作为训练集,百分之30作为测试集。

红酒数据的获取可以参考常用UCI数据集,链接放在文末,其中的Wine.mat即为红酒数据。

废话不多说,接下来直接上代码!

首先是主程序代码:

close all
warning off
%% 数据读取
clc
clear
load Wine
%% 数据载入
data=Wine;
data=data(randperm(size(data,1)),:);    %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
input=data(:,1:end-1);
output1 =data(:,end);
%把输出从1维变成3维
for i=1: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%% 选取训练数据和测试数据
m=fix(size(data,1)*0.7);    %训练的样本数目
input_train=input(1:m,:)';
output_train=output(1:m,:)';
input_test=input(m+1:end,:)';
output_test=output(m+1:end,:)';
%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
% [outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%网络结构
innum=size(input,2);
midnum=20;
outnum=size(output,2);
%权值阈值初始化
w1=rand(midnum,innum);
b1=rand(midnum,1);
w2=rand(midnum,outnum);
b2=rand(outnum,1);
w2_1=w2;w2_2=w2_1;
w1_1=w1;w1_2=w1_1;
b1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;
xite=0.0002;
xite2 =  0.001;I=zeros(1,midnum);
Iout=zeros(1,midnum);
FI=zeros(1,midnum);
dw1=zeros(innum,midnum);
db1=zeros(1,midnum);
loopNumber = 2000;
fprintf('自适应学习率,training is begining……\n');
tic
for ii=1:loopNumberSSE(ii)=0; %训练误差for i=1:1:size(inputn,2)%选择本次训练数据x=inputn(:,i);
%      隐含层输出for j=1:1:midnumI(j)=inputn(:,i)'*w1(j,:)'+b1(j);Iout(j)=1/(1+exp(-I(j)));end%输出层输出yn=w2'*Iout'+b2;%预测误差e=output_train(:,i)-yn;SSE(ii)=SSE(ii)+1/2*sum(e.^2);%计算w2.b2调整量dw2=e*Iout;db2=e';%计算w1 b1调整量for j=1:1:midnumS=1/(1+exp(-I(j)));FI(j)=S*(1-S);endfor k=1:1:innumfor j=1: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; %自适应学习率核心公式w1=w1_1+ff(ii)*dw1';b1=b1_1+ff(ii)*db1';w2=w2_1+ff(ii)*dw2';b2=b2_1+ff(ii)*db2';w1_2=w1_1;w1_1=w1;w2_2=w2_1;w2_1=w2;b1_2=b1_1;b1_1=b1;b2_2=b2_1;b2_1=b2;  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 i=1:1:size(inputn_test,2)for j=1:1:midnumI(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);Iout(j)=1/(1+exp(-I(j)));end%输出层输出yn=w2'*Iout'+b2;an0(:,i) = yn;
endpredict_label=zeros(1,size(an0,2));
for i=1:size(an0,2)predict_label(i)=find(an0(:,i)==max(an0(:,i)));
end
outputt=zeros(1,size(output_test,2));
for i=1:size(output_test,2)outputt(i)=find(output_test(:,i)==max(output_test(:,i)));
end
fprintf('test is over and plot begining……\n');
accuracy=sum(outputt==predict_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 i=1:1:size(inputn,2)for j=1:1:midnumI(j)=inputn(:,i)'*w1_1(j,:)'+b1_1(j);Iout(j)=1/(1+exp(-I(j)));end%输出层输出yn=w2_1'*Iout'+b2_1;an1(:,i) = yn;
endpredict_label2=zeros(1,size(an1,2));
for i=1:size(an1,2)predict_label2(i)=find(an1(:,i)==max(an1(:,i)));
end
outputt2=zeros(1,size(output_train,2));
for i=1:size(output_train,2)outputt2(i)=find(output_train(:,i)==max(output_train(:,i)));
end
fprintf('test is over and plot begining……\n');
accuracy=sum(outputt2==predict_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('迭代次数')

下面直接上结果图。

首先是训练集的测试结果图:

b09520da17a8763cc1f5c64abb419b6e.png

测试集的训练结果图:

8b330984365ccfaeecaa48eb8cef24b9.png

同样,再附一张训练集的热力图。(热力图的效果和第一张图是一致的,在类别情况较多时,多采用热力图)

dc5c6ad0b396d4ffff4a11120d0408fc.png

可以看到,手写的附加动量因子的BP神经网络matlab代码,可以实现对红酒数据的精准识别,测试集的识别率高达98.14%。

由于BP神经网络的偶然性,建议大家多运行几次,除此之外,隐含层节点个数,自适应学习率的上下限值,都是可以自行调整的。大家根据自己的项目随意调整即可。

UCI常用数据集链接

https://pan.baidu.com/s/10gYszv5_BCfr43RMLOVXVQ?pwd=8888

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/139170.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

倍福tnzip,tszip,tpzip文件的打开方式

文章目录 一. tnzip的打开方式二. tszip打开方法三. tpzip打开方法 一. tnzip的打开方式 打开项目:选择菜单栏 FILE,点击 Open Solution from Archive…,在弹出的 对话框中选择保存好的文件,单击打开。选择展开此项目的路径&…

MATLAB中sos2tf函数用法

目录 语法 说明 示例 二阶节系统的传递函数表示 sos2tf函数的功能是将数字滤波器的二阶节(section)数据转换为传递函数形式。 语法 [b,a] sos2tf(sos) [b,a] sos2tf(sos,g) 说明 [b, a] sos2tf(sos) 返回由 sos 描述的离散时间系统的传递函数系…

网络通信协议-HTTP、WebSocket、MQTT的比较与应用

在今天的数字化世界中,各种通信协议起着关键的作用,以确保信息的传递和交换。HTTP、WebSocket 和 MQTT 是三种常用的网络通信协议,它们各自适用于不同的应用场景。本文将比较这三种协议,并探讨它们的主要应用领域。 HTTP&#xff…

ARM +FPGA GPIB IP核实现

目前在数据发生其技术上居领先的是美国的 Tektronix 公司和 Agilent 公司。 Agilent 公司的台式脉冲 / 数据发生器家族的最高时钟频率达 3GHz (定 时发生器),数据发生器 E81200 在通道数为 8CH 时数据速率为 660Mb/s, 即可以产…

一、初识 Elasticsearch:概念,安装,设置分词器

文章目录 01、初识 Elasticsearch正向索引和倒排索引索引MySQL与ES的概念映射安装ES分词器分词器的设置 01、初识 Elasticsearch 本次ES基于:7.12.1 版本 学习资源为:https://www.bilibili.com/video/BV1Gh411j7d6 什么是ES(Elasticsearch&…

GitHub Action 通过SSH 自动部署到云服务器上

准备 正式开始之前,你需要掌握 GitHub Action 的基础语法: workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。name: 工作流的名称。on: 指定次工作流的触发器。push 表示只要有人将更改推…

【数据结构】栈

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 栈-Stack 1. 什么是栈2. 栈的使用3.…

JAVA基础(JAVA SE)学习笔记(二)变量与运算符

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 第一阶段:Java基本语法 1. Java 语言概述 JAVA基础(JAVA SE)学习…

黑豹程序员-架构师学习路线图-百科:Maven

文章目录 1、什么是maven官网下载地址 2、发展历史3、Maven的伟大发明 1、什么是maven Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and…

ROS opencv 人脸识别

人脸识别需要在输入的图像中确定人脸(如果存在)的位置、大小和姿态,往往用于生物特征识别、视频监听、人机交互等应用中。2001年,Viola和Jones提出了基于Haar特征的级联分类器对象检测算法,并在2002年由Lienhart和Mayd…

使用 MRVA CodeQL 对开源项目进行大规模漏洞挖掘

1.什么是 MRVA? CodeQL相关的资料目前已经非常多了,但是大部分都集中在介绍ql语法以及基本使用上,更多关注的是对单个项目进行分析。那么如何批量进行漏洞挖掘呢?这里介绍下MRVA。 MRVA是multi-repository variant analysis 的缩写。其实是…

华为云云耀云服务器L实例评测|windows系统3389防爆破之安全加固教程

为什么要选择华为云云耀云服务器L实例: 华为云在全国范围内建立了多个数据中心,这些数据中心之间相互冗余,以确保高可靠性和可用性,用户可以选择最适合的区域来部署应用程序,以实现更好的性能和延迟。 相对于传统的物…