close all;
clear all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 2000年前2個月的電價資料作為樣本,3月的資料作為檢驗,對4月的電價進行預測 %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
load price.txt;
load demand.txt;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 預測日型別(result: invalid)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
WE=4;
for i=1:366
if rem(i,7)==0
DataType(i) = 0.9/WE;
continue;
end;
if rem(i,7)==1
DataType(i) = 0.5/WE;
continue;
end;
if rem(i,7)==2
DataType(i) = 0.4/WE;
continue;
end;
if rem(i,7)==3
DataType(i) = 0.8/WE;
continue;
end;
if rem(i,7)==4
DataType(i) = 0.9/WE;
continue;
end;
if rem(i,7)==5
DataType(i) = 0.9/WE;
continue;
end;
if rem(i,7)==6
DataType(i) = 0.9/WE;
continue;
end;
end;
N = 60; %學習樣本數
ForeOutput =[];
for ForeDate = 85:91;%預測日期
SampleMaxDate = ForeDate-1;%最大樣本
% 電價資料歸一化處理
SamplePrice = price(1:ForeDate,:);
MaxPrice=zeros(1,24);
MinPrice=ones(1,24)*100;
for i=1:SampleMaxDate
for t=1:24
if MaxPrice(t)<SamplePrice(i,t)
MaxPrice(t)=SamplePrice(i,t);
end;
if MinPrice(t)>SamplePrice(i,t)
MinPrice(t)=SamplePrice(i,t);
end;
end;
end;
for t=1:24
SamplePrice(:,t) = (SamplePrice(:,t)-MinPrice(t))/(1.5*MaxPrice(t)-MinPrice(t));
end;
% 電價資料星期趨勢消除
for i=15:ForeDate
Temp = [];
Temp = SamplePrice(i-14:i-1,:);
PriceAvg(i,:) = sum(Temp,1)./14;
SamplePrice(i,:) = SamplePrice(i,:)./PriceAvg(i,:);
end;
% 負荷資料歸一化處理
SampleDemand = demand(1:ForeDate,:);
MaxDemand = zeros(1,24);
MinDemand = ones(1,24)*100;
for i=1:ForeDate
for t=1:24
if MaxDemand(t)<SampleDemand(i,t)
MaxDemand(t)=SampleDemand(i,t);
end;
if MinDemand(t)>SampleDemand(i,t)
MinDemand(t)=SampleDemand(i,t);
end;
end;
end;
for t=1:24
SampleDemand(:,t) = (SampleDemand(:,t)-MinDemand(t))/(1.5*MaxDemand(t)-MinDemand(t));
end;
IN_N = 13; %輸入層神經元個數
HIDE_N = 6; %隱層神經元個數
OUT_N = 1; %輸出層神經元個數
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% 神經網路訓練 %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MaxLearnTime = 1000; %U最大學習次數
PreError=0.001; %設定誤差
alpha = 0.95; %輸出-隱層的學習率
beta = 0.95; %隱層-輸入層的學習率
for t=1:24
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% 神經網路樣本資料 %%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
W_P=[0.5,0.6,0.7,0.8,1.5,2,0.5,0.6,0.8,1.5,4,10,1];
% W_P=[1,1,1,1,1,1,1,1,1,1,1,1,1];
for i=1:N
if t==1
Temp = [];
Temp = [SamplePrice((ForeDate-i)-8:(ForeDate-i)-7,t);...
SamplePrice((ForeDate-i)-3:(ForeDate-i)-1,t);...
SamplePrice((ForeDate-i)-7,t);...
SampleDemand((ForeDate-i)-8:(ForeDate-i)-7,t);...
SampleDemand((ForeDate-i)-2:(ForeDate-i),t);...
SampleDemand((ForeDate-i)-1,t)-SampleDemand(ForeDate-i,t);...
DataType(ForeDate-i)];
else
Temp = [];
Temp = [SamplePrice((ForeDate-i)-8:(ForeDate-i)-7,t);...
SamplePrice((ForeDate-i)-3:(ForeDate-i)-1,t);...
ForeOutput(ForeDate,t-1);...
SampleDemand((ForeDate-i)-8:(ForeDate-i)-7,t);...
SampleDemand((ForeDate-i)-2:(ForeDate-i),t);...
SampleDemand((ForeDate-i)-1,t)-SampleDemand(ForeDate-i,t);...
DataType(ForeDate-i)];
end;
SampleInput(i,t,:)=[W_P(1)*Temp(1),W_P(2)*Temp(2),W_P(3)*Temp(3),W_P(4)*Temp(4),...
W_P(5)*Temp(5),W_P(6)*Temp(6),W_P(7)*Temp(7),W_P(8)*Temp(8),...
W_P(9)*Temp(9),W_P(10)*Temp(10),W_P(11)*Temp(11),W_P(12)*Temp(12),...
W_P(13)*Temp(13)];
SampleTarget(i,t)= SamplePrice(ForeDate-i,t);
end;
%預測日神經網路輸入
if t==1
Temp = [];
Temp = [SamplePrice(ForeDate-8:ForeDate-7,t);SamplePrice(ForeDate-3:ForeDate-1,t);...
SamplePrice((ForeDate-i)-1,t);
SampleDemand(ForeDate-8:ForeDate-7,t);SampleDemand(ForeDate-2:ForeDate,t);...
SampleDemand(ForeDate-1,t)-SampleDemand(ForeDate,t);DataType(SampleMaxDate+i)];
else
Temp = [];
Temp = [SamplePrice(ForeDate-8:ForeDate-7,t);SamplePrice(ForeDate-3:ForeDate-1,t);...
ForeOutput((ForeDate)-1,t-1);
SampleDemand(ForeDate-8:ForeDate-7,t);SampleDemand(ForeDate-2:ForeDate,t);...
SampleDemand(ForeDate-1,t)-SampleDemand(ForeDate,t);DataType(SampleMaxDate+i)];
end;
ForeInput(t,:) = [W_P(1)*Temp(1),W_P(2)*Temp(2),W_P(3)*Temp(3),W_P(4)*Temp(4),...
W_P(5)*Temp(5),W_P(6)*Temp(6),W_P(7)*Temp(7),W_P(8)*Temp(8)...
W_P(9)*Temp(9),W_P(10)*Temp(10),W_P(11)*Temp(11),W_P(12)*Temp(12),...
W_P(13)*Temp(13)];
%初始化I-H層閾值和權重
W=rand(HIDE_N,IN_N);
theta=rand(HIDE_N,1);
%初始化H-O層權重和閾值
V=rand(OUT_N,HIDE_N);
gama=rand(OUT_N,1);
for CurrentStudy=1:MaxLearnTime
for m=1:N
%nn輸入訓練資料
for i=1:IN_N
InputData(i)=SampleInput(m,t,i);
end;
for k=1:OUT_N
OutputData(k)=SampleTarget(m,t,k);
end;
%從輸入層到隱含層
for j=1:HIDE_N
TempValue=0;
for i=1:IN_N
TempValue = TempValue+W(j,i)*InputData(i); %內積
end;
HideLayerInput(j)=TempValue+theta(j); %隱層輸入
HideLayerOutput(j)=1/(1+exp(-HideLayerInput(j))); %隱層輸出
end;
%從隱含層到輸出層
for k=1:OUT_N
TempValue=0;
for j=1:HIDE_N
TempValue = TempValue+V(k,j)*HideLayerOutput(j); %內積
end;
OutLayerInput(k)=TempValue+gama(k); %輸出層輸入
OutLayerOutput(k)=1/(1+exp(-OutLayerInput(k))); %輸出層輸出
end;
%得到第m個樣本的總誤差
err_sqr=0;
for k=1:OUT_N
err_temp = OutputData(k)-OutLayerOutput(k);
err_sqr = err_sqr+0.5*(err_temp*err_temp);
end;
Error(m)=err_sqr;
%誤差由輸出層向隱層反向傳播,并調整權重
for k=1:OUT_N
delta(k)= OutputData(k)-OutLayerOutput(k); %誤差
delta_bar(k)=delta(k)*OutLayerOutput(k)*(1-OutLayerOutput(k)); %求導數diff(f(x))=f(x)*(1-f(x))
gama(k) = gama(k)+beta*delta_bar(k); %調整輸出層閾值
for j=1:HIDE_N
V(k,j) = V(k,j)+beta*delta_bar(k)*HideLayerOutput(j); %調整輸出層權重
end;
end;
%調整輸入層至隱含層權重與閾值
for j=1:HIDE_N
sigma(j)=0;
for k=1:OUT_N
delta(k) = (OutputData(k)-OutLayerOutput(k))*OutLayerOutput(k)*(1-OutLayerOutput(k));
sigma(j) = sigma(j)+delta(k)*V(k,j)*HideLayerOutput(j)*(1-HideLayerOutput(j));
end;
for i=1:IN_N
W(j,i) = W(j,i)+alpha*sigma(j)*InputData(i); %調整權重
end;
theta(j) = theta(j)+alpha*sigma(j); %調整閾值
end;
end;
error=0;
for m=1:N
error = error+Error(m);
end;
error = error/(2*N);
if error < PreError
break;
end;
if error < PreError*20
alpha = 0.9; %輸出-隱層的學習率
beta = 0.9; %隱層-輸入層的學習率
end;
if error < PreError*10
alpha = 0.8; %輸出-隱層的學習率
beta = 0.8; %隱層-輸入層的學習率
end;
if error < PreError*5
alpha = 0.5; %輸出-隱層的學習率
beta = 0.5; %隱層-輸入層的學習率
end;
end;
% 用訓練好的網路進行預測
for i=1:IN_N
InputData(i) = ForeInput(t,i);
end;
%從輸入層到隱含層
for j=1:HIDE_N
TempValue=0;
for i=1:IN_N
TempValue = TempValue+W(j,i)*InputData(i); %內積
end;
HideLayerInput(j)=TempValue+theta(j); %隱層輸入
HideLayerOutput(j)=1/(1+exp(-HideLayerInput(j))); %隱層輸出
end;
%從隱含層到輸出層
for k=1:OUT_N
TempValue=0;
for j=1:HIDE_N
TempValue = TempValue+V(k,j)*HideLayerOutput(j); %內積
end;
OutLayerInput(k)=TempValue+gama(k); %輸出層輸入
OutLayerOutput(k)=1/(1+exp(-OutLayerInput(k))); %輸出層輸出
end;
ForeOutput(ForeDate,t) = OutLayerOutput;
ForeResult(ForeDate-84,t) = OutLayerOutput*PriceAvg(ForeDate,t)*(1.5*MaxPrice(t)-MinPrice(t))+MinPrice(t);
ForeActual(ForeDate-84,t) = SamplePrice(ForeDate,t)*PriceAvg(ForeDate,t)*(1.5*MaxPrice(t)-MinPrice(t))+MinPrice(t);
% ForeResult(ForeDate-44,t) = OutLayerOutput*(1.5*MaxPrice(t)-MinPrice(t))+MinPrice(t);
% ForeActual(ForeDate-44,t) = SamplePrice(ForeDate,t)*(1.5*MaxPrice(t)-MinPrice(t))+MinPrice(t);
end;
end;
ForeError= 100*(ForeResult-ForeActual)./ForeActual;
[ForeResult;ForeActual;ForeError]
figure(1);
subplot(211);
plot(DataOutspread(ForeResult),'k');
hold on;
plot(DataOutspread(ForeActual),'r');
hold on;
subplot(212);
plot(DataOutspread(ForeError),'b');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%End
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260698.html
標籤:AI
上一篇:Facebook “天鷹 Aquila” 計劃總結(Internet.org) -- 截至2017年
下一篇:C++命名空間
