从头开始编写BP,不使用MATLAB工具箱,纯手写matlab代码,以BP分类为例,MATLAB代码免费获取...

news2025/2/25 11:35:33

本期文章教大家纯代码搭建BP神经网络,适合大家深入理解BP神经网络,非常适合新手学习!

现在直接用手写BP代码的很少,一般都是用的MATLAB自带BP函数。然而如果你会自行编写BP神经网络,将会深入理解BP神经网络的结构与原理。

话不多说,本篇文章以BP分类为例(也可以做预测),纯手写BP神经网络。

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

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

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

首先是主程序代码:

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 1
            output(i,:)=[1 0 0];
        case 2
            output(i,:)=[0 1 0];
        case 3
            output(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=rands(midnum,innum);
b1=rands(midnum,1);
w2=rands(midnum,outnum);
b2=rands(outnum,1);
xite =  0.001;  %学习率
loopNumber = 2000;  %训练次数
fprintf('BP training is begining……\n');
tic
for ii=1:loopNumber
  E(ii)=0; %训练误差
   for i=1:1:size(inputn,2)
    %选择本次训练数据
     x=inputn(:,i);
%      隐含层输出
    for j=1:1:midnum
          I(j)=inputn(:,i)'*w1(j,:)'+b1(j);
          Iout(j)=1/(1+exp(-I(j)));   %sigmoid函数,此处可以根据需要直接自行更改
    end
    %输出层输出
    yn=w2'*Iout'+b2;
    %预测误差
    e=output_train(:,i)-yn;
    E(ii)=E(ii)+1/2*sum(abs(e).^2);
    %计算w2.b2调整量
    dw2=e*Iout;
    db2=e';
    %计算w1 b1调整量
    for j=1:1:midnum
      S=1/(1+exp(-I(j)));
      FI(j)=S*(1-S);
    end
    for k=1:1:innum
      for j=1:1:midnum
          hh = 0;
          for ij = 1:size(e,1)
              hh = hh +e(ij)*w2(j,ij);
          end
          dw1(k,j)=FI(j)*x(k)*hh;
          db1(j)=FI(j)*hh;
      end
    end


  %权值阈值更新
    w1=w1+xite*dw1';
    b1=b1+xite*db1';
    w2=w2+xite*dw2';
    b2=b2+xite*db2';
   end
   %结果保存
    w1_1=w1;
    w2_1=w2;
    b1_1=b1;
    b2_1=b2;
    E(ii) = E(ii)/size(inputn,2);
    if mod(ii,500)==0
       disp(['训练过程:',num2str(ii), '/', num2str(loopNumber),'误差为:',num2str(E(ii))])
    end
end


disp( ['训练时间: ',num2str(toc) ] );
%% 将优化的权值阈值带入,用测试集求解
for i=1:1:size(inputn_test,2)
    for j=1:1:midnum
          I(j)=inputn_test(:,i)'*w1(j,:)'+b1(j);
          Iout(j)=1/(1+exp(-I(j)));
    end
    %输出层输出
    yn=w2'*Iout'+b2;
    an0(:,i) = yn;
end


predict_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*')
yticks(1:1:8)
% yticklabels({'正常状态','冷却水流量不足','冷冻水流量不足','制冷剂泄漏','制冷剂过量','滑油过量','冷凝器结垢','制冷剂中混入不凝性气体0'})
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:midnum
          I(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;
end


predict_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 off


figure
plot(E)
title('误差曲线')
ylabel('误差')
xlabel('迭代次数')

运行之后,结果如下。

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

036c3855431bc4e9d30eaece2647e00f.png

测试集的训练结果图:

5444b7170c3519882e9645fa12bbce32.png

训练误差图:

7d43edd7d783eab991fba4eaca67a33d.png

附上一个热力图:(热力图的效果和第一张图是一致的,在类别情况较多时,多采用热力图)

b2567989390dde228c9332265428e95b.png

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

UCI常用数据集链接

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计讯物联水利RTU强力推进小型水库雨水情测报和安全监测系统应用

政策背景 小型水库是城市供水、农业灌溉和防洪排涝的重要基础设施,关系到人民群众的生产生活和社会经济的稳定发展。当前,小型水库监测设施薄弱是水库安全管理的突出短板,因此,水利部自2021年以来推进实施小型水库雨水情测报设施、…

语法分析出错,不是 GROUP BY 表达式

报错 ### Cause: dm.jdbc.driver.DMException: 第 9 行, 第 69 列[30]附近出现错误: 语法分析出错 ; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 9 行, 第 69 列[30]附近出现错误: 语法分析出错at org.springframework.jdbc.support.SQLState…

java入门程序-HelloWorld

1.java程序开发的三个步骤 1.开发java程序,需要三个步骤:编写代码,编译代码(javac),运行代码(java) 注意事项: 1.第一个java程序建议使用记事本书写。 2.建议代码文件名全英文,首字母大写,满…

院内导航系统厂商分析

随着医疗技术的不断发展和医院规模的不断扩大,院内导航系统成为了现代化医院不可或缺的一部分。患者就医时,一个高效便捷的导航系统可以帮助他们快速找到目标科室,同时也能提高医院的整体运营效率。本文将推荐五家在院内导航市场具有竞争力的…

【算法|前缀和系列No.4】leetcode238. 除自身以外数组的乘积

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【leetcode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

EL表达式与JSTL

1.EL表达式 1.EL表达式概述 EL(Expression Language):表达式语言 在 JSP 2.0 规范中加入的内容,也是 Servlet 规范的一部分 作用:在 JSP 页面中获取数据。让我们的 JSP 脱离 java 代码块和 JSP 表达式 语法:${ 表达式内容 } …

群晖NAS drive的远程访问和电脑硬盘的内网穿透挂载设置方法

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…

【弃坑xdm】docker容器作为开发环境,更加灵活可靠

关于我准备转行深度学习~~ 弃坑xdm 弃坑xdm 弃坑xdm 转发给你的同学,吓他们一跳~~ ps:其实我准备使用docker容器作为开发环境,vscode可以直接连接docker容器,更加灵活可靠。

企业常用的项目管理工具推荐,了解有哪些选择

项目管理软件是一种帮助项目经理和团队有效地计划、组织和管理项目的工具。它为协作、通信和任务管理提供了一个集中的平台。市场上有各种各样的项目管理软件,每个都有其独特的特性和功能。企业常用的项目管理工具有哪些? 1.Zoho Projects Zoho Projec…

基于tornado BELLE 搭建本地的web 服务

我的github 将BELLE 封装成web 后端服务,采用tornado 框架 import timeimport torch import torch.nn as nnfrom gptq import * from modelutils import * from quant import *from transformers import AutoTokenizer import sys import json #import lightgbm a…

2023年中国城市矿产行业产值及发展趋势分析[图]

城市矿产是指工业化和城镇化过程中产生和蕴藏于废旧机电设备、电线电缆、通讯工具、汽车、家电、电子产品、金属和塑料包装物以及废料中,可循环利用的钢铁、有色金属、贵金属、塑料、橡胶等资源。 开展“城市矿产”示范基地建设是缓解资源瓶颈约束,减轻环…

BAT027:删除当前目录指定文件夹以外的文件夹

引言:编写批处理程序,实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件,点击【编辑】…

A062-防火墙安全配置-配置Iptables防火墙策略

实验步骤: 【教学资源类别】 序号 类别 打勾√ 1 学习资源 √ 2 单兵模式赛题资源 3 分组对抗赛题资源 【教学资源名称】 防火墙安全配置-配置安全设置iptables防火墙策略 【教学资源分类】 一级大类 二级大类 打勾√ 1.安全标准 法律法规 行业标准 安全…

【css】背景换颜色

更换前 longin.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>login</title><link href"/css/style.css" type"text/css" rel"stylesheet"><s…

AN动画基础——变换的文字动画

【AN动画基础——变换的文字动画】 文字变换动画 本篇内容&#xff1a;散件动画&#xff0c;形状提示 重点内容&#xff1a;形状提示 工 具&#xff1a;Adobe Animate 2022 文字变换动画 &#xff08;底下背景和前面文字一样动&#xff0c;转完GIF不知道为啥不动了&#xff0c…

node教程

文章目录 1.node入门 1.node入门 node是什么&#xff1f; node.js是一个开源的&#xff0c;跨平台的JS运行环境&#xff08;其实可以理解为是一款应用程序&#xff0c;是一款软件&#xff0c;可以运行JS&#xff09; node作用&#xff1a; 1.开发服务器应用

Wireshark新手小白基础使用方法

一、针对IP抓取 1、过滤格式&#xff1a; &#xff08;1&#xff09;、ip.src eq x.x.x.x &#xff08;2&#xff09;、ip.dst eq x.x.x.x &#xff08;3&#xff09;ip.src eq x.x.x.x or ip.dst eq x.x.x.x 二、针对端口过滤 1、过滤格式&#xff1a; &#xff08;1&a…

Linux下创建用户并禁止root登录

在Linux中&#xff0c;root几乎拥有所有的权限&#xff0c;一旦root用户密码外泄&#xff0c;对于服务器而言将是致命的威胁&#xff0c;禁止root用户通过ssh的方式远程登录&#xff0c;这样即使root用户密码外泄也能够保障服务器的安全。 1、创建用户&#xff1a; adduser ad…

网络安全分析——蠕虫病毒动态分析视图

蠕虫病毒&#xff08;Worm Virus&#xff09;是一种自我复制的恶意软件&#xff0c;通过网络或系统漏洞传播&#xff0c;感染其他计算机并利用其资源。与其他病毒不同&#xff0c;蠕虫病毒无需依赖于宿主文件&#xff0c;并可以自动在网络中传播&#xff0c;因此具有高度传染性…

嵌入式养成计划-42----QT 创建项目--窗口界面--常用类及组件

一百零五、如何创建 QT 项目 创建工程 New Project / 文件–>新建。。 /ctrl N 选择一个模板–>Application -->Qt Widgets Application 选择创建的路径&#xff0c;以及设置文件名 下一步 输入类名&#xff0c;选择基类为 QWidget 下一步 选择这个玩意&a…