马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
刚开始学习BP及使用MATLAB,出现一些问题,请大家帮助
使用bp算法进行24时点的价格预测
1)24个时段分别预测,调用sim,到最后图形输出就象死了一样,为何?(w问号处)
2)预测精度平均测算下来才能达到20-50%,实在太大了,总有几个高峰点,为何呢?
3)还有无更好的方法或改进的地方?
多谢。
源码如下:
clf;clc;clear;
load pjm_0102.mat; %内含ul,up,ut三个经过归一化的矩阵,以及l,p,t 和w(星期)
t_seg = 24; % 时段
err=[]; errv=[];
train_ds=32;train_de=92; %ds起始日期 %de截至日期
test_ds=93;test_de=99; %预测8月1日-8月10日
for seg =1 : t_seg
train_s=[]; train_d=[]; test_s=[]; test_d=[]; out=[];
for i = train_ds : train_de %68,7月8日 92,7月31日
%训练用输入向量 10*n 1-7行为前七天电价,8-9行为前两天负荷,10行为预测日负荷,n为样本数, 需取逆才可输入 : 50%
%train_s = [train_s; up(i-1,seg) up(i-2,seg) up(i-3,seg) up(i-4,seg) up(i-5,seg) up(i-6,seg) up(i-7,seg) ul(i-1,seg) ul(i-2,seg) ul(i,seg)];
%仅用前七日电价 50-70%
%加上星期因素 25%-50% 改1-7为0 1,周6/7为1,其余为0 27%-40%-27%
train_s = [train_s; up(i-1,seg) up(i-2,seg) up(i-3,seg) up(i-4,seg) up(i-5,seg) up(i-6,seg) up(i-7,seg) ul(i-1,seg) ul(i-2,seg) ul(i,seg) w(i,2)];
%训练用目标向量 1*n,预测日电价
train_d = [train_d; up(i,seg)];
end
train_s = train_s'; train_d = train_d';
for i=test_ds: test_de
%测试用输入向量
%test_s = [test_s; up(i-1,seg) up(i-2,seg) up(i-3,seg) up(i-4,seg) up(i-5,seg) up(i-6,seg) up(i-7,seg) ul(i-1,seg) ul(i-2,seg) ul(i,seg)];
test_s = [test_s; up(i-1,seg) up(i-2,seg) up(i-3,seg) up(i-4,seg) up(i-5,seg) up(i-6,seg) up(i-7,seg) ul(i-1,seg) ul(i-2,seg) ul(i,seg) w(i,2)];
%测试用目标向量
test_d = [test_d; up(i,seg)];
end
test_s = test_s'; test_d=test_d';
%建立BP神经网络
net=newff(minmax(train_s),[4,1],{'tansig','tansig'},'trainlm'); %建立BP网络 4个隐含层,1个输出层 fy:误差在20%以内
% 4,1 tansig,purelin, traingdx tra to test 15% 15% 11% 11%
% traingd 7% 35% 24% 27% 17%
% trainrp 8% 12% 7% 12% (epochs<100 goal met)
% graincgf 9% 7% 13% 13% (100)
% traincgp 10% 12% 6% 8%(82)
% traincgb 11(13) 13(44) 9(57) 18(13) // 40(40) 33(213) 40(84)
% trainscg 9(118) 6(143) 12(496) 11(387) 4
% trainbfg 7(45) 10(47) 10(193) 6(36) 2 49(83) 30(28) 34(73) 18(0)
% trainoss 9(1439) 8(720) 8(337) 7(2192) 3
% trainlm 6(9) 9(6) 5(9) 10(7) 1/1 17%(6) 50(4) 12(7) 41(6)
%
%训练
net.trainParam.epochs=3000;
net.trainParam.show=50;
net.trainParam.lr=0.01;
%net.trainParam.mu=0.02;
net.trainParam.goal=0.0001;
tic;
net=train(net,train_s,train_d); %训练
toc;
%开始预测
out=sim(net,test_s);
err=[err;(test_d - out)./test_d];
%out=sim(net,train_s);
%err=[err;(train_d - out)./train_d]; %计算24各点的多样本误差
end
save mcp_bp_err.mat err;
clf;clc;clear;
load mcp_bp_err.mat;
errv=mean(abs(err),2)'; %24各点的多样本平均误差
% plot(err_seg_v); %???
erra=mean(errv) |