其他回答(7)
buzhuangweng
高分答主
02-01
TA获得超过7907个赞
P、T矩阵均为一列为一个样本,因此P、T的列数必须相等,否则报错。你参考下别人的程序,我建议使用newff函数,不要弄得这么复杂。还有P、T的生成不需要那么复杂,只需要:
P(i,:)=YY(i:i+2);
附上newff函数的格式为:
net=newff(PR,[S1 S2 ...SN],{TF1 TF2...TFN},BTF,BLF,PF),函数newff建立一个可训练的前馈网络。输入参数说明:
PR:Rx2的矩阵以定义R个输入向量的最小值和最大值;
Si:第i层神经元个数;
TFi:第i层的传递函数,默认函数为tansig函数;
BTF:训练函数,默认函数为trainlm函数;
BLF:权值/阀值学习函数,默认函数为learngdm函数;
PF:性能函数,默认函数为mse函数。
baoguangfeng
新兵答主
07-15
TA获得超过7911个赞
由于你没有给出几年来工资数,无法为你预测后五年的工资。现给你一个例子,希望对你有点启发。已知至的某地区人口总数3583,4150,5062,4628,5270,5340;现要预测和的人口总数。
% 清空环境变量
clear all;close all;clc
t=:;
% x为原始序列(行向量)
x=[3583 4150 5062 4628 5270 5340];
% 自回归阶数
lag=2;
%预测年份或某一时间段
t1=:;
%预测步数为fn
fn=length(t1);
[f_out,iinput]=BP(x,lag,fn); %BP神经网络函数
n1=length(t1);
P=vpa(f_out,5);
[t1'' P'']
% 画出预测图
figure,plot(:,iinput,''b''),hold on
plot(:,[iinput(end),f_out],''r''),grid on
title(''BP神经网络预测某地区人口数'')
如有问题,可以私聊或通过其他方式讨论。
caoleijing
优质答主
07-15
TA获得超过2506个赞
给你个例子,只要把训练输入输出数据换成你自己的就可以了,不懂可以加1298792082
% 现给出一药品商店一年当中12个月的药品销售量(单位:箱)如下:
% 2056 2395 2600 2298 1634 1600 1873 1487 1900 1500 2046 1556
% 训练一个BP网络,用当前的所有数据预测下一个月的药品销售量。
% 我们用前三个月的销售量预测下一个月的销售量,
% 也就是用1-3月的销售量预测第4个月的销售量,
% 用2-4个月的销售量预测第5个月的销售量,
% 如此循环下去,直到用9-11月预测12月份的销售量。
% 这样训练BP神经网络后,就可以用10-12月的数据预测来年一月的销售量。
% 实现程序如下:
%% 原始数据
P =[2056 2395 2600;2395 2600 2298;2600 2298 1634;2298 1634 1600;...
1634 1600 1873;1600 1873 1478;1873 1478 1900;1478 1900 1500;...
1900 1500 2046;];
%% 目标数据
T = [2298 1634 1600 1873 1487 1900 1500 2046 1556];
%% 对原始数据和目标数据进行归一化处理
pmax = max(P);
pmax1 = max(pmax);
pmin = min(P);
pmin1 = min(pmin);
for i = 1 : 9
P1(i, :) = (P(i, :) - pmin1) / (pmax1 - pmin1);
T1(i) = (T(i) - pmin1) / (pmax1 - pmin1);
end
%% 建立BP网络
net = newff(P1'', T1, [3 7], {''tansig'' ''logsig''}, ''traingd'');
%% 设置网络参数并进行训练
% for i = 1 : 9
net.trainParam.epochs = 15000;
net.trainParam.goal = 0.00001;
net.trainParam.lr = 0.1
net = train(net, P1(i,:)'', T1(i));
% end
%% 将10-12月的数据输入网络进行预测来年一月的销售量(归一化后的数值)
y = sim(net, [1500 2046 1556]'');
%% 反归一化求出来年一月份的销售量
y1 = y * (pmax1 - pmin1) + pmin1;
% 如果神经网络的训练函数使用trainlm,则仿真步骤会很少,但需要较大的系统内存。
% 经预测,来年一月的销售量(y1)为1.6845e+003箱(每次运行后的结果可能不同)
chaituodie
新兵答主
07-13
TA获得超过1162个赞
%% 训练集/测试集产生
% 训练集——用于训练网络
P_train = ;%输入集
T_train = ;%输出集
% 测试集——用于测试或者使用。
P_test = ;%输入
T_test ;
N = size(P_test,2);
%% BP神经网络创建、训练及仿真测试
% 创建网络
net = newff(P_train,T_train,9);
% 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
% 训练网络
net = train(net,P_train,T_train);
% 仿真测试、使用。
T_test = sim(net,P_test);%得到结果。
bikaoshao
高能答主
07-09
TA获得超过9569个赞
%采用动量梯度下降算法训练 BP 网络。
close all
clear
echo on
clc
% NEWFF——生成一个新的前向神经网络
% TRAIN——对 BP 神经网络进行训练
% SIM——对 BP 神经网络进行仿真
pause
% 敲任意键开始
clc
% 定义训练样本
% P 为输入矢量 pau
P=[-1,-2,3,1;-1,1,5,-3];
% T 为目标矢量
T=[-1, -1, 1, 1];
pause;
clc
% 创建一个新的前向神经网络
minmax(P)
net=newff(minmax(P),[3,1],{''tansig''''purelin''},''traingdm'');
% minmax(P)取值范围是P内的最小值到最大值 [3,1]是3个神经元 1维 tansig purelin traingdm各层神经网络的激励函数
% tansig purelin隐含层更改权值的函数 当前输入层权值和阈值
inputWeights=net.IW{1,1};
inputbias=net.b{1};
% 当前网络层权值和阈值
layerWeights=net.LW{2,1};
layerbias=net.b{2};
%表示对各层神经网络的权值与阈值传递到相应变量
pause
clc
% 设置训练参数
net.trainParam.show = 50; %训练显示间隔 50次显示一次
net.trainParam.lr = 0.05; %学习步长0.05学习率
net.trainParam.mc = 0.9; %动量项系数0.9
net.trainParam.epochs = 1000; %训练次数1000次
net.trainParam.goal = 1e-3; %训练精度目标为0.001
pause
clc
% 调用 traingdm 算法训练 BP 网络
[net,tr]=train(net,P,T);%调用网络指令
pause
clc
% 对 BP 网络进行仿真
A=sim(net,P)
% 计算仿真误差
E=T-A
MSE=mse(E)
pause
clc
echo off
biaosheizhuan
高能答主
07-09
TA获得超过8199个赞
首先是我不知道你用的matlab是什么版本。
如果用的以后的版本,那么你这样初始化神经网络一定会报警告。
版以后初始化神经网络的语句是这样的
net = newff(p, t, 7);
输出层不需要自己去告诉系统。
我想知道的第二个问题,是你的输出层函数是否需要使用logsig。如果使用purelin,那么你大可不必去归一化。后面我会告诉你原因。
你手动指定了训练次数,但是学习率0.01这个数值不知道你从哪里找到的。我可能会选择高一点的学习率,最高我用过0.25.
训练函数你也是手动指定的,这个是需要的么?如果不需要,对于7个神经节点,完全可以使用trainlm,这样你也不需要这么多的训练次数。
下面说一下以后的matlab中,神经网络训练增加的一个功能。在初始化神经网络以后,有一个默认的dividing function,将训练样本中的一部分用来校验神经网络性能,以防止过度训练。那么这个参数可能会导致训练不充分。在初始化神经网络以后,需要做的工作是设定net.divideFcn = '''';用来去掉这个分配函数。
如果你需要更改你的transfer function,那么可以在net.layers{2}.transferFcn = ''logsig''将输出层传输函数手动修改。
那么,我使用全默认设置,没有进行归一化处理,获得的结果是这样的。
这个就是把你的t和训练后的神经网络计算的结果放在一起。结果已经很不错了。
如过我去掉了分配函数,那么神经网络就会一直训练到训练次数上限或者达到目标值。165次训练后,误差值是1.77e-19(误差使用mean squared error计算),结果在这里贴出来已经没意义了,因为几乎没有误差。
如果你还有问题,那么跟我细聊一下。
biaohuaigang
高分答主
07-08
TA获得超过7463个赞
比较新的版本,比如说matlab 以上的,都不需要装神经网络的工具箱
建立网络步骤:
1、数据归一化:输入的数据通常为P,输出数据通常为T,数据格式为:每列对应一个样本,归一化常用函数:mapminmax
[pn,ps]=mapminmax(p); [tn,ts]=mapminmax(t)
pn,tn是归一化后的数据,ps, ts是归一化的结构体,在后面反归一化预测值很有用。
2、建立网络并设定参数
net=newff(pn,tn,[ ]) 中括号里面的是输入层数,隐含神经元数,输出层数,还可以设定节点传递函数等等的参数
net.trainparam.epochs=1000 训练的次数
net.trainparam.goal=0.0001 训练的误差目标值
net.trainparam.lr=0.1 学习速率,通常在0到1之间,过大过小都不好
3、预测并分析
an=sim(net, pn)
ouput=mapminmax(''reverse'', an, ts) 根据之前归一化的标准,对预测结果进行反归一化,得到结果
error=output-t 这里是对误差进行输出,也可以用error=sum(asb(output-t))
当然也可以作图,比如说:
plot(p,t,''-o'')
hold on
plot(p, output,''-*'')
看预测值和真实值能否吻合
还可以在神经网络训练完成后的对话框中看MSE和R方
还有很多方法提高神经网络的精度,以上程序没有经过MATLAB调试,但大致过程如上
纯手打,希望采纳!