matlab实现简单BP神经网络(不使用工具箱),两种求误差方式

BP网络实现y=1+x+x*x函数模拟,输入层一个节点,隐含层8个节点,输出层1个节点

将数据分为测试集合和训练集合两部分

%% BP算法模拟 y = 1 + x + x*x
%作者:msl 时间:2017-10-07
clc;
clear;
%% step0:定义
TrainCount = 1000;%最大训练次数为2000次
DataNum = 1001;%训练的数据有1001个
Hide_Out = zeros(1,8);%初始化隐含层输出
Hide_OutTest = zeros(1,8);
Rata_H = 0.2;%隐含层学习速率
Rata_O = 0.1;%输出层学习速率
%% step1:取数据
x = -5:0.01:6;%x的训练数据
y = 1 + x + x.*x;%y对应于x的数据
%% step2:训练数据归一化和初始化权值
x_Nor = (x -(-5) + 1)/(5 - (-5) + 1);%x归一化后得到的数据
y_Nor = (y - 0.75 + 1)/(31 - 0.75 + 1);%y归一化后得到的数据
w = 2*(rand(1,8)-0.5);%得到输入层到隐含层的8个权值初始化
v = 2*(rand(1,8)-0.5);%得到隐含层到输出层的8个权值初始化
dw = zeros(1,8);%隐含层权值调整量初始化 0
dv = zeros(1,8);%输出层权值调整量初始化 0
%%  CH  建立训练集和测试集
xNum=length(x);
Itest=1:11:xNum;
Xtest_Nor=x_Nor(Itest);
Ytest_Nor=y_Nor(Itest);

Xtrain_Nor=x_Nor;
Ytrain_Nor=y_Nor;
Xtrain_No
  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
以下是一个基本的 MATLAB 代码,用于创建和训练一个简单BP 神经网络,不使用工具箱: 1. 创建网络结构 ```matlab inputSize = 4; % 输入层大小 hiddenSize = 5; % 隐藏层大小 outputSize = 3; % 输出层大小 % 随机初始化权重和阈值 W1 = rand(hiddenSize, inputSize); % 输入层到隐藏层的权重矩阵 b1 = rand(hiddenSize, 1); % 隐藏层的偏置向量 W2 = rand(outputSize, hiddenSize); % 隐藏层到输出层的权重矩阵 b2 = rand(outputSize, 1); % 输出层的偏置向量 ``` 2. 设置训练参数 ```matlab learning_rate = 0.1; % 学习率 epochs = 1000; % 迭代次数 goal = 0.01; % 训练误差目标 ``` 3. 准备数据集 ```matlab load iris_dataset.mat % 载入数据集 inputs = irisInputs; % 输入数据 targets = irisTargets; % 目标数据 ``` 4. 训练网络 ```matlab for epoch = 1:epochs % 随机打乱数据集 order = randperm(size(inputs, 2)); inputs = inputs(:, order); targets = targets(:, order); % 前向传播 z1 = W1 * inputs + b1; a1 = sigmoid(z1); z2 = W2 * a1 + b2; a2 = sigmoid(z2); % 计算误差 error = targets - a2; mse(epoch) = mean(mean(error.^2)); % 反向传播 delta2 = error .* sigmoid_derivative(a2); delta1 = (W2' * delta2) .* sigmoid_derivative(a1); % 更新权重和阈值 W2 = W2 + learning_rate * delta2 * a1'; b2 = b2 + learning_rate * delta2; W1 = W1 + learning_rate * delta1 * inputs'; b1 = b1 + learning_rate * delta1; % 判断是否达到训练误差目标 if mse(epoch) < goal break; end end ``` 5. 测试网络 ```matlab outputs = zeros(outputSize, size(inputs, 2)); for i = 1:size(inputs, 2) z1 = W1 * inputs(:, i) + b1; a1 = sigmoid(z1); z2 = W2 * a1 + b2; a2 = sigmoid(z2); outputs(:, i) = a2; end ``` 其中,sigmoid 函数和其导数的实现如下: ```matlab function y = sigmoid(x) y = 1 ./ (1 + exp(-x)); end function y = sigmoid_derivative(x) y = sigmoid(x) .* (1 - sigmoid(x)); end ``` 这是一个简单的示例,您可以根据您的具体应用程序进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值