matlab函数newff实现曲线拟合并分别采用权重偏置和sim函数测试曲线拟合情况

matlab函数newff实现曲线拟合并分别采用权重偏置和sim函数测试曲线拟合情况

背景

在电力系统领域,通常建立的数学模型非线性较强,求解较为困难,而分段线性化、线性近似等方法误差较大;在学习人工智能时了解到神经网络在曲线拟合和预测方面具有良好的效果,因此本文通过matlab软件编写程序实现曲线拟合(也称回归),即非线性模型的的线性化。(代码放最后)

数学模型

本文举例电力系统中的具有时变的冷负荷模型,参考文献【计及冷负荷效应时变特性的含风储联合系统负荷恢复策略】丁江等.电力自动化设备。
冷负荷曲线主要为开始供电时的跃升最大值到最后稳定值的曲线部分,包括最大值持续横线和数值减小到稳定值的曲线。冷负荷数学模型在该文献中有具体公式,此处直接使用matlab画出该曲线采样生成数据。
不同停电时间的冷负荷曲线

神经网络训练

本文利用非线性曲线采样生成数据后,保存到data2.mat中,这个需要加载到matlab的工作区,也可以通过load data2.mat命令加载到工作区。

数据生成归一化

本文对曲线做了一些改进,生成的数据中有多个输入参数和一个输出参数。由于数据中的各个参数具有不同数量级和不同分布,在训练时容易出现不收敛或训练接达不到要求,所以要对数据进行归一化,归一化的函数可以使用mapminmax,具体可自行在matlab查阅用法。

[p_train, ps_input] = mapminmax(P_train, 0, 1);%输入参数的归一化
[t_train, ps_output] = mapminmax(T_train, 0, 1);%输出参数的归一化

生成网络和训练

生成网络的函数为newff,其用法参考【https://blog.csdn.net/weixin_44248258/article/details/122064776】
本文设置3个隐藏层,隐藏层节点个数均为10个,隐藏层激活函数和输出层激活函数均为默认函数(分别为tansig和purelin函数)

	net = newff(p_train, t_train, [10*ones(1,3)]);
训练参数为:
	net.trainParam.epochs = 10000;     % 迭代次数 
	net.trainParam.goal = 1e-8;       % 误差阈值
	net.trainParam.lr = 0.003;         % 学习率

直接采用训练函数train训练即可

net= train(net, p_train, t_train);

反归一化

训练完后的结果展示需要反归一化得到具体的数值,这里需要用到归一化步骤得到的最大值和最小值,可以使用上面得到的ps_output实现反归一化

T_sim1 = mapminmax('reverse', t_sim1, ps_output);

sim函数测试

测试函数为sim,用法为

t_sim1 = sim(net, p_train);
net是上面生成的神经网络,p_train为训练数据,t_sim1为训练后的结果,需要与真实值对比

这个是训练后的图(训练数据较少,与真实曲线有较大误差)
在这里插入图片描述
真实曲线:
在这里插入图片描述

生成的权值和偏置测试

权值和偏置可通过生成的net获取,代码为:

iw=net.iw%输入权值
lw=net.lw%隐藏层权值
b=net.b%偏置

采用权值和偏置以及激活函数完成拟合曲线的测试,代码为:

b1=repmat(b{1,1},1,19);%因为b只有一列,需要复制生成输入数据的列数
b2=repmat(b{2,1},1,19);
b3=repmat(b{3,1},1,19);
b4=repmat(b{4,1},1,19);
t_sim = purelin(lw{4,3}*tansig(lw{3,2}* tansig(lw{2,1}*tansig(iw{1,1}*p_test+b1)+b2) +b3)+b4);

反归一化后得到的曲线图为:
在这里插入图片描述
这时会发现采用权值和偏置得到的曲线和sim函数得到的曲线完全不一样,查找原因后,发现是因为再用权值和偏置实现计算时,需要将输入数据和输出数据的归一化范围设置到[-1,1],而不是[0,1],原因好像是概率分布,net函数内置认为是对称性分布(不完全正确,自己推的)。通过将训练数据重新归一化得到的ps_input和ps_output归一化测试数据和其结果,得到曲线拟合图为:
在这里插入图片描述

代码

训练代码为:

%%  清空环境变量
% warning off             % 关闭报警信息
% close all               % 关闭开启的图窗
% clear all                  % 清空变量
% clc                     % 清空命令行
 
%%  导入数据
% res = xlsread('data2.xlsx');
res=data2;
%%  数据分析
num_size = 0.7;                              % 训练集占数据集比例
outdim = 1;                                  % 最后一列为输出
num_samples = size(res, 1);                  % 样本个数
% res = res(randperm(num_samples), :);         % 打乱数据集(不希望打乱时,注释该行)
num_train_s = round(num_size * num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度
 
%%  划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
M = size(P_train, 2);
 
P_test = res(num_train_s + 1: end, 1: f_)';
T_test = res(num_train_s + 1: end, f_ + 1: end)';
N = size(P_test, 2);
 
%%  数据归一化
[p_train, ps_input] = mapminmax(P_train, 0, 1);
p_test = mapminmax('apply', P_test, ps_input);
 
[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);
 
%%  创建网络
net = newff(p_train, t_train, [10*ones(1,3)]);
 
%%  设置训练参数
net.trainParam.epochs = 10000;     % 迭代次数 
net.trainParam.goal = 1e-8;       % 误差阈值
net.trainParam.lr = 0.003;         % 学习率
%  net.trainFcn = 'traincgb';
%%  训练网络
net= train(net, p_train, t_train);
 
%%  仿真测试
t_sim1 = sim(net, p_train);
t_sim2 = sim(net, p_test);
 
%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1, ps_output);
T_sim2 = mapminmax('reverse', t_sim2, ps_output);
 
%%  均方根误差
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
 
%%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid
 
figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比';['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid
iw=net.iw
lw=net.lw
b=net.b

测试代码为:

u=zeros(19,6);
for k=1:1:19
    u(k,1)=k-1;%这里写成k-1,有横线,写成k无横线
    u(k,2)=1348;
    u(k,3)=0.5;
    u(k,4)=35;
    u(k,5)=200;
    u(k,6)=3;
end
%A1=xlsread('权重和偏置.xlsx','6输入','A2:F11');%权值和偏置保存到excel中时,方便后续移植到其他地方
%A2=xlsread('权重和偏置.xlsx','6输入','J2:S11');
%A3=xlsread('权重和偏置.xlsx','6输入','J14:S23');
%A4=xlsread('权重和偏置.xlsx','6输入','J26:S26');
%b1=repmat(xlsread('权重和偏置.xlsx','6输入','H2:H11'),1,19);
%b2=repmat(xlsread('权重和偏置.xlsx','6输入','U2:U11'),1,19);
%b3=repmat(xlsread('权重和偏置.xlsx','6输入','U14:U23'),1,19);
%b4=repmat(xlsread('权重和偏置.xlsx','6输入','U26:U26'),1,19);

res=data2;
%%  数据分析
outdim = 1;                                  % 最后一列为输出
num_samples = size(res, 1);                  % 样本个数
num_train_s = round(num_samples); % 训练集样本个数
f_ = size(res, 2) - outdim;                  % 输入特征维度
 
%%  划分训练集和测试集
P_train = res(1: num_train_s, 1: f_)';
T_train = res(1: num_train_s, f_ + 1: end)';
[p_train, ps_input] = mapminmax(P_train, -1, 1);
[t_train, ps_output] = mapminmax(T_train, -1, 1);

%%
num_samples = size(u, 1);                  % 样本个数
num_train_s = round(num_samples); % 训练集样本个数

 
%%  划分训练集和测试集
P_test = u(:, 1: 6)';
 
%%  数据归一化
p_test = mapminmax('apply', P_test, ps_input);
% t_sim = purelin(A4*tansig(A3* tansig(A2*tansig(A1*p_test+b1)+b2) +b3)+b4);%直接调用excel中读取的参数
b1=repmat(b{1,1},1,19);
b2=repmat(b{2,1},1,19);
b3=repmat(b{3,1},1,19);
b4=repmat(b{4,1},1,19);
t_sim = purelin(lw{4,3}*tansig(lw{3,2}* tansig(lw{2,1}*tansig(iw{1,1}*p_test+b1)+b2) +b3)+b4);
% t_sim = sim(net, p_test);%sim函数测试
%  
% %%  数据反归一化
T_sim = mapminmax('reverse', t_sim, ps_output);
plot(0:1:18,T_sim)
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
新版Matlab神经网络训练函数Newff的详细讲解-新版Matlab神经网络训练函数Newff的使用方法.doc 本帖最后由 小小2008鸟 于 2013-1-15 21:42 编辑 新版Matlab神经网络训练函数Newff的详细讲解 一、   介绍新版newffSyntax·          net = newff],{TF1 TF2...TFNl}, BTF,BLF,PF,IPF,OPF,DDF) Descriptionnewff],{TF1 TF2...TFNl}, BTF,BLF,PF,IPF,OPF,DDF) takes several arguments PR x Q1 matrix of Q1 sample R-element input vectorsTSN x Q2 matrix of Q2 sample SN-element target vectorsSiSize of ith layer, for N-1 layers, default = [ ]. TFiTransfer function of ith layer. (Default = 'tansig' for hidden layers and 'purelin' for output layer.)BTFBackpropagation network training function BLFBackpropagation weight/bias learning function IPFRow cell array of input processing functions. OPFRow cell array of output processing functions. DDFData divison function ExamplesHere is a problem consisting of inputs P and targets T to be solved with a network.·          P = [0 1 2 3 4 5 6 7 8 9 10];T = [0 1 2 3 4 3 2 1 2 3 4];Here a network is created with one hidden layer of five neurons.·          net = newff;The network is simulated and its output plotted against the targets.·          Y = sim;plotThe network is trained for 50 epochs. Again the network's output is plotted.·          net.trainParam.epochs = 50;net = train;Y = sim; plot 二、   新版newff与旧版newff调用语法对比 Example1比如输入input(6*1000),输出output为(4*1000),那么旧版定义:net=newff,[14,4],{'tansig','purelin'},'trainlm');新版定义:net=newff; Example2比如输入input(6*1000),输出output为(4*1000),那么旧版定义:net=newff,[49,10,4],{'tansig','tansig','tansig'},'traingdx');新版定义:net=newff; 更详细请看word文档 新版Matlab神经网络训练函数Newff的使用方法.doc

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值