MATLAB code for machine learning--neural network SVM prediction of electric load, designed MATLAB visual interface, including data (9)

MATLAB code for machine learning--neural network SVM prediction of electric load, designed MATLAB visual interface, including data (9)

the code

1、

%该程序已在MATLAB2010b运行通过
clc;
clear all
C = 30;
theta = 2;%C为最小二乘支持向量机的正则化参数,theta为高斯径向基的核函数参数,两个需要进行优化选择调试
NumOfPre = 1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1 = exp(-Dist/(2*theta));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/C;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/C - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*theta));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
for i = 1:Len
    figure 
    plot(1:Time,Data(i+Dim+2,6:N),'r',1:Time,Pre(i,:),'k');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'o')
    scatter(1:Time,Pre(i,:),'^')
   % axis([0 25 0 100])%坐标范围
    hold off
end
Acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
save Acu.mat Acu
s=0;
for i=1:Time
    s=abs(Acu(1,i))+s;
end
acu=s/Time;
save acu.mat acu;
Result=[C,theta,acu];
disp(Result);

2、

function [ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope)
%功能描述:初始化粒子群,限定粒子群的位置以及速度在指定的范围内
%[ParSwarm,OptSwarm,BadSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc)
%
%输入参数:SwarmSize:种群大小的个数
%输入参数:ParticleSize:一个粒子的维数
%输入参数:ParticleScope:一个粒子在运算中各维的范围;
%         ParticleScope格式:
%           3维粒子的ParticleScope格式:
%                                   [x1Min,x1Max
%                                    x2Min,x2Max
%                                    x3Min,x3Max]
%
%输入参数:AdaptFunc:适应度函数
%
%输出:ParSwarm初始化的粒子群
%输出:OptSwarm粒子群当前最优解与全局最优解
%
%用法[ParSwarm,OptSwarm,BadSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope,AdaptFunc);


%容错控制
if nargin~=3
 error('输入的参数个数错误。')
end
if nargout<2
 error('输出的参数的个数太少,不能保证以后的运行。');
end

[row,colum]=size(ParticleSize);
if row>1|colum>1
 error('输入的粒子的维数错误,是一个11列的数据。');
end
[row,colum]=size(ParticleScope);
if row~=ParticleSize|colum~=2
 error('输入的粒子的维数范围错误。');
end

%初始化粒子群矩阵
%初始化粒子群矩阵,全部设为[0-1]随机数
%rand('state',0);
ParSwarm=rand(SwarmSize,2*ParticleSize+1);

%对粒子群中位置,速度的范围进行调节
for k=1:ParticleSize
 ParSwarm(:,k)=ParSwarm(:,k)*(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
 %调节速度,使速度与位置的范围一致
 ParSwarm(:,ParticleSize+k)=ParSwarm(:,ParticleSize+k)*(ParticleScope(k,2)-ParticleScope(k,1))+ParticleScope(k,1);
end

%对每一个粒子计算其适应度函数的值
for k=1:SwarmSize
 C=ParSwarm(k,1);
 theta=ParSwarm(k,2);
 ParSwarm(k,2*ParticleSize+1)=AdaptFunc(C,theta);
end

%初始化粒子群最优解矩阵
OptSwarm=zeros(SwarmSize+1,ParticleSize);
%粒子群最优解矩阵全部设为零
[minValue,row]=min(ParSwarm(:,2*ParticleSize+1));
%寻找适应度函数值最小的解在矩阵中的位置(行数)
OptSwarm=ParSwarm(1:SwarmSize,1:ParticleSize);
OptSwarm(SwarmSize+1,:)=ParSwarm(row,1:ParticleSize);


3、

%该程序已在MATLAB2010b运行通过
ParticleScope=[0.1,150;
               0.1,10];
ParticleSize=2;
SwarmSize=20;
LoopCount=10;
opt=zeros(LoopCount,3);
MeanAdapt=zeros(1,LoopCount);
OnLine=zeros(1,LoopCount);
OffLine=zeros(1,LoopCount);
%控制显示2维以下粒子维数的寻找最优的过程
% DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc(XX,YY));
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);

%开始更新算法的调用
for k=1:LoopCount
%显示迭代的次数:
disp('----------------------------------------------------------')
TempStr=sprintf('第 %g次迭代',k);
disp(TempStr);
disp('----------------------------------------------------------')

%在测试函数图形上绘制初始化群的位置
 %if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
  %  stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
  %end
 %end
%暂停让抓图
% disp('开始迭代,按任意键:')
 %pause

%调用一步迭代的算法

[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.9,0.4,LoopCount,k);

% if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
 %   stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
 % end
 %end
 
t=OptSwarm(SwarmSize+1,1);
u=OptSwarm(SwarmSize+1,2);
YResult=AdaptFunc(t,u);
str=sprintf('%g步迭代的最优目标函数值%g',k,YResult);
disp(str);
%记录每一步的平均适应度
MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));
end

%for循环结束标志

%记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];
%计算离线与在线性能
for k=1:LoopCount
 OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;
 OffLine(1,k)=max(MeanAdapt(1,1:k));
end

for k=1:LoopCount
   OffLine(1,k)=sum(OffLine(1,1:k))/k;
end

%绘制离线性能与在线性能曲线
figure
hold on
title('离线性能曲线图');
xlabel('迭代次数');
ylabel('离线性能');
grid on
plot(OffLine);

figure
hold on
title('在线性能曲线图')
xlabel('迭代次数');
ylabel('在线性能');
grid on
plot(OnLine);

%记录本次迭代得到的最优结果
aa=OptSwarm(SwarmSize+1,1);
bb=OptSwarm(SwarmSize+1,2);
cc=AdaptFunc1(aa,bb);
Result=[aa,bb,cc];
disp(Result);


4、

%该程序已在MATLAB2010b运行通过

function varargout = gui(varargin)
% GUI MATLAB code for gui.fig
%      GUI, by itself, creates a new GUI or raises the existing
%      singleton*.
%
%      H = GUI returns the handle to a new GUI or the handle to
%      the existing singleton*.
%
%      GUI('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI.M with the given input arguments.
%
%      GUI('Property','Value',...) creates a new GUI or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before gui_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to gui_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help gui

% Last Modified by GUIDE v2.5 13-Sep-2015 19:51:50

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @gui_OpeningFcn, ...
                   'gui_OutputFcn',  @gui_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{
    
    1})
    gui_State.gui_Callback = str2func(varargin{
    
    1});
end

if nargout
    [varargout{
    
    1:nargout}] = gui_mainfcn(gui_State, varargin{
    
    :});
else
    gui_mainfcn(gui_State, varargin{
    
    :});
end
% End initialization code - DO NOT EDIT


% --- Executes just before gui is made visible.
function gui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui (see VARARGIN)

% Choose default command line output for gui
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes gui wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = gui_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{
    
    1} = handles.output;



function edit1_Callback(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit1 as text
%        str2double(get(hObject,'String')) returns contents of edit1 as a double

input = get(handles.edit1,'String'); 
input = str2num(input);

% --- Executes during object creation, after setting all properties.
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit2_Callback(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit2 as text
%        str2double(get(hObject,'String')) returns contents of edit2 as a doubl
% --- Executes during object creation, after setting all properties.
input = get(handles.edit2,'String'); 
input = str2num(input);


function edit2_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end



function edit3_Callback(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of edit3 as text
%        str2double(get(hObject,'String')) returns contents of edit3 as a double
% --- Executes during object creation, after setting all properties.
input = get(handles.edit3,'String'); 
input = str2num(input);

function edit3_CreateFcn(hObject, eventdata, handles)
% hObject    handle to edit3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
C = 30;
theta = 2;%C为最小二乘支持向量机的正则化参数,theta为高斯径向基的核函数参数,两个需要进行优化选择调试
NumOfPre = 1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1 = exp(-Dist/(2*theta));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/C;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/C - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*theta));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
for i = 1:Len
    %figure 
    axes(handles.axes1);
    plot(1:Time,Data(i+Dim+2,6:N),'-or',1:Time,Pre(i,:),'-vk');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'o')
    scatter(1:Time,Pre(i,:),'v')
    legend('实际值','预测值','location','southeast')
    hold off
end
Acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
save Acu.mat Acu
s=0;
for i=1:Time
    s=abs(Acu(1,i))+s;
end
acu=s/Time;
save acu.mat acu;
Result=[C,theta,acu];
disp(Result);


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ParticleScope=[0.1,150;
               0.1,10];
ParticleSize = str2num(get(handles.edit1,'String'));
SwarmSize =  str2num(get(handles.edit2,'String'));
LoopCount = str2num(get(handles.edit3,'String'));

%ParticleSize=2;
%SwarmSize=20;
%LoopCount=10;
opt=zeros(LoopCount,3);
MeanAdapt=zeros(1,LoopCount);
OnLine=zeros(1,LoopCount);
OffLine=zeros(1,LoopCount);
%控制显示2维以下粒子维数的寻找最优的过程
% DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc(XX,YY));
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);

%开始更新算法的调用
for k=1:LoopCount
%显示迭代的次数:
disp('----------------------------------------------------------')
TempStr=sprintf('第 %g次迭代',k);
disp(TempStr);
disp('----------------------------------------------------------')

%在测试函数图形上绘制初始化群的位置
 %if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
  %  stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
  %end
 %end
%暂停让抓图
% disp('开始迭代,按任意键:')
 %pause

%调用一步迭代的算法

[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.9,0.4,LoopCount,k);

% if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
 %   stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
 % end
 %end
 
t=OptSwarm(SwarmSize+1,1);
u=OptSwarm(SwarmSize+1,2);
YResult=AdaptFunc(t,u);
str=sprintf('%g步迭代的最优目标函数值%g',k,YResult);
disp(str);
%记录每一步的平均适应度
MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));
end

%for循环结束标志

%记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];


%记录本次迭代得到的最优结果
XX=OptSwarm(SwarmSize+1,1);
YY=OptSwarm(SwarmSize+1,2);
%cc=AdaptFunc1(aa,bb);
%Result=[aa,bb,cc];
%disp(Result);

NumOfPre =1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 可不必拘泥
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1=exp(-Dist/(2*YY));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/XX;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/XX - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*YY));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
for i = 1:Len
    %figure 
    axes(handles.axes3);
    plot(1:Time,Data(i+Dim+2,6:N),'-or',1:Time,Pre(i,:),'-vk');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'o')
    scatter(1:Time,Pre(i,:),'v')
    legend('实际值','预测值','location','southeast')
    hold off
end
acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
s=0;
for i=1:Time
    s=abs(acu(1,i))+s;
end
Acu=s/Time;
save acu1.mat acu




% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ParticleScope=[0.1,150;
               0.1,10];
ParticleSize = str2num(get(handles.edit1,'String'));
SwarmSize =  str2num(get(handles.edit2,'String'));
LoopCount = str2num(get(handles.edit3,'String'));
%控制显示2维以下粒子维数的寻找最优的过程
% DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc(XX,YY));
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);
opt=zeros(LoopCount,3);
MeanAdapt=zeros(1,LoopCount);
OnLine=zeros(1,LoopCount);
OffLine=zeros(1,LoopCount);
%开始更新算法的调用
for k=1:LoopCount
%显示迭代的次数:
disp('----------------------------------------------------------')
TempStr=sprintf('第 %g次迭代',k);
disp(TempStr);
disp('----------------------------------------------------------')

l=sqrt((150-0.1)*(150-0.1)+(10-0.1)*(10-0.1));
p1=sum(ParSwarm(:,1))/20;
p2=sum(ParSwarm(:,2))/20;
for i=1:20
   s=0;
   x=sqrt((ParSwarm(i,1)-p1)^2+(ParSwarm(i,2)-p2)^2);
   s=x+s;
end
D(k)=s/(20*l);

fa=sum(ParSwarm(:,5))/20;
for i=1:20
   if max(abs((ParSwarm(i,5)-fa)))>1
      f=max(abs((ParSwarm(i,5)-fa)));
   else
      f=1;
   end 
end
d=sum((ParSwarm(:,5)-fa)/f)^2;

if D(k)<0.001&d<0.01
   [ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope); 
end
%在测试函数图形上绘制初始化群的位置
 %if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
  %  stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
  %end
 %end
%暂停让抓图
% disp('开始迭代,按任意键:')
 %pause

%调用一步迭代的算法
%C=ParSwarm(k,1);
%theta=ParSwarm(k,2);
[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.9,0.4,LoopCount,k);

% if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
 %   stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
 % end
 %end
 
t=OptSwarm(SwarmSize+1,1);
u=OptSwarm(SwarmSize+1,2);
YResult=AdaptFunc(t,u);
str=sprintf('%g步迭代的最优目标函数值%g',k,YResult);
%记录每一步的最优目标函数值
disp(str);
opt(k,1)=t;
opt(k,2)=u;
opt(k,3)=YResult;
%记录每一步的平均适应度
MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));
end
%for循环结束标志

%记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];

%记录本次迭代得到的最优结果
[minValue,row]=min(opt(:,3));
XX=opt(row,1);
YY=opt(row,2);
NumOfPre =1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 可不必拘泥
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1=exp(-Dist/(2*YY));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/XX;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/XX - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*YY));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
for i = 1:Len
    %figure 
    axes(handles.axes2);
    plot(1:Time,Data(i+Dim+2,6:N),'-or',1:Time,Pre(i,:),'-vk');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'o')
    scatter(1:Time,Pre(i,:),'v')
    legend('实际值','预测值','location','southeast')
    hold off
end
acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
s=0;
for i=1:Time
    s=abs(acu(1,i))+s;
end
Acu=s/Time;
save acu1.mat acu



% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
close

5、

%该程序已在MATLAB2010b运行通过
ParticleScope=[0.1,150;
               0.1,10];
ParticleSize=2;
SwarmSize=20;
LoopCount=5;
%控制显示2维以下粒子维数的寻找最优的过程
% DrawObjGraphic(ParticleSize,ParticleScope,AdaptFunc(XX,YY));
[ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope);
opt=zeros(LoopCount,3);
MeanAdapt=zeros(1,LoopCount);
OnLine=zeros(1,LoopCount);
OffLine=zeros(1,LoopCount);
%开始更新算法的调用
for k=1:LoopCount
%显示迭代的次数:
disp('----------------------------------------------------------')
TempStr=sprintf('第 %g次迭代',k);
disp(TempStr);
disp('----------------------------------------------------------')

l=sqrt((150-0.1)*(150-0.1)+(10-0.1)*(10-0.1));
p1=sum(ParSwarm(:,1))/20;
p2=sum(ParSwarm(:,2))/20;
for i=1:20
   s=0;
   x=sqrt((ParSwarm(i,1)-p1)^2+(ParSwarm(i,2)-p2)^2);
   s=x+s;
end
D(k)=s/(20*l);

fa=sum(ParSwarm(:,5))/20;
for i=1:20
   if max(abs((ParSwarm(i,5)-fa)))>1
      f=max(abs((ParSwarm(i,5)-fa)));
   else
      f=1;
   end 
end
d=sum((ParSwarm(:,5)-fa)/f)^2;

if D(k)<0.001&d<0.01
   [ParSwarm,OptSwarm]=InitSwarm(SwarmSize,ParticleSize,ParticleScope); 
end
%在测试函数图形上绘制初始化群的位置
 %if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
  %  stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
  %end
 %end
%暂停让抓图
% disp('开始迭代,按任意键:')
 %pause

%调用一步迭代的算法
%C=ParSwarm(k,1);
%theta=ParSwarm(k,2);
[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,0.9,0.4,LoopCount,k);

% if 2==ParticleSize
 % for ParSwarmRow=1:SwarmSize
 %   stem3(ParSwarm(ParSwarmRow,1),ParSwarm(ParSwarmRow,2),ParSwarm(ParSwarmRow,5),'r.','markersize',8);
 % end
 %end
 
t=OptSwarm(SwarmSize+1,1);
u=OptSwarm(SwarmSize+1,2);
YResult=AdaptFunc(t,u);
% str=sprintf('%g步迭代的最优目标函数值%g',k,YResult);
%记录每一步的最优目标函数值
% disp(str);
opt(k,1)=t;
opt(k,2)=u;
opt(k,3)=YResult;
%记录每一步的平均适应度
MeanAdapt(1,k)=mean(ParSwarm(:,2*ParticleSize+1));
end
%for循环结束标志

%记录最小与最大的平均适应度
MinMaxMeanAdapt=[min(MeanAdapt),max(MeanAdapt)];
%计算离线与在线性能
for k=1:LoopCount
 OnLine(1,k)=sum(MeanAdapt(1,1:k))/k;
 OffLine(1,k)=min(MeanAdapt(1,1:k));
end

for k=1:LoopCount
   OffLine(1,k)=sum(OffLine(1,1:k))/k;
end

%绘制离线性能与在线性能曲线
figure
hold on
title('离线性能曲线图');
xlabel('迭代次数');
ylabel('离线性能');
grid on
plot(OffLine);

figure
hold on
title('在线性能曲线图')
xlabel('迭代次数');
ylabel('在线性能');
grid on
plot(OnLine);

[minValue,row]=min(opt(:,3));
aa=opt(row,1);
bb=opt(row,2);
cc=AdaptFunc1(aa,bb);
Result=[aa,bb,cc];
%记录本次迭代得到的最优结果
% disp(Result);


6、

%下面的函数BaseStepPso实现了标准全局版粒子群算法的单步更新位置速度的功能
function [ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,ParticleScope,MaxW,MinW,LoopC,CurCount)
%功能描述:全局版本:基本的粒子群算法的单步更新位置,速度的算法
%
%[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopCount,CurCount)
%
%输入参数:ParSwarm:粒子群矩阵,包含粒子的位置,速度与当前的目标函数值
%输入参数:OptSwarm:包含粒子群个体最优解与全局最优解的矩阵
%输入参数:ParticleScope:一个粒子在运算中各维的范围;
%输入参数:AdaptFunc:适应度函数
%输入参数:LoopC:迭代的总次数
%输入参数:CurCount:当前迭代的次数
%
%返回值:含意同输入的同名参数
%
%用法:[ParSwarm,OptSwarm]=BaseStepPso(ParSwarm,OptSwarm,AdaptFunc,ParticleScope,MaxW,MinW,LoopC,CurCount)
%异常:首先保证该文件在Matlab的搜索路径中,然后查看相关的提示信息。

% 添加2*unifrnd(0,1).*SubTract1(row,:)中的unifrnd(0,1)随机数,使性能大为提高
%参照基于MATLAB的粒子群优化算法程序设计
%容错控制
if nargin~=7
error('输入的参数个数错误。')
end
if nargout~=2
error('输出的个数太少,不能保证循环迭代。')
end

%开始单步更新的操作

%*********************************************
%*****更改下面的代码,可以更改惯性因子的变化*****
%---------------------------------------------------------------------
%线形递减策略
w=MaxW-CurCount*(MaxW-MinW)/LoopC;
%---------------------------------------------------------------------
%w固定不变策略
%w=0.7;
%w非线形递减,以凹函数递减
%w=(MaxW-MinW)*(CurCount/LoopC)^2+(MinW-MaxW)*(2*CurCount/LoopC)+MaxW;
%---------------------------------------------------------------------
%w非线形递减,以凹函数递减
%w=MinW*(MaxW/MinW)^(1/(1+10*CurCount/LoopC));
%*****更改上面的代码,可以更改惯性因子的变化*****
%得到粒子群群体大小以及一个粒子维数的信息
[ParRow,ParCol]=size(ParSwarm);
%得到粒子的维数
ParCol=(ParCol-1)/2;
SubTract1=OptSwarm(1:ParRow,:)-ParSwarm(:,1:ParCol);
%*****更改下面的代码,可以更改c1,c2的变化*****
c1=2;
c2=2;
%---------------------------------------------------------------------
%con=1;
%c1=4-exp(-con*abs(mean(ParSwarm(:,2*ParCol+1))-AdaptFunc(OptSwarm(ParRow+1,:))));
%c2=4-c1;
%----------------------------------------------------------------------
%*****更改上面的代码,可以更改c1,c2的变化*****
%*********************************************
for row=1:1:ParRow
SubTract2=OptSwarm(ParRow+1,:)-ParSwarm(row,1:ParCol);
TempV=w.*ParSwarm(row,ParCol+1:2*ParCol)+2*unifrnd(0,1).*SubTract1(row,:)+2*unifrnd(0,1).*SubTract2;
%限制速度的代码
for h=1:ParCol
 if TempV(:,h)>ParticleScope(h,2)
    TempV(:,h)=ParticleScope(h,2);
 end
 if TempV(:,h)<-ParticleScope(h,2)
     TempV(:,h)=-ParticleScope(h,2)+1e-10;
    %1e-10防止适应度函数被零除
 end
end
%更新速度
ParSwarm(row,ParCol+1:2*ParCol)=TempV;
%*****更改下面的代码,可以更改约束因子的变化*****
%---------------------------------------------------------------------
%a=1;
%---------------------------------------------------------------------
a=0.729;
%*****更改上面的代码,可以更改约束因子的变化*****

 %限制位置的范围
TempPos=ParSwarm(row,1:ParCol)+a*TempV;
for h=1:ParCol
 if TempPos(:,h)>ParticleScope(h,2)
    TempPos(:,h)=ParticleScope(h,2);
 end
 if TempPos(:,h)<=ParticleScope(h,1)
    TempPos(:,h)=ParticleScope(h,1)+1e-10;
 end
end

%更新位置 
ParSwarm(row,1:ParCol)=TempPos;
%计算每个粒子的新的适应度值
a=ParSwarm(row,1);
b=ParSwarm(row,2);
ParSwarm(row,5)=AdaptFunc(a,b);
c=OptSwarm(row,1);
d=OptSwarm(row,2);
 if ParSwarm(row,2*ParCol+1)<AdaptFunc(c,d)
   OptSwarm(row,1:ParCol)=ParSwarm(row,1:ParCol);
 end
end
%for循环结束

%寻找适应度函数值最小的解在矩阵中的位置(行数),进行全局最优的改变 
[minValue,row]=min(ParSwarm(:,2*ParCol+1));
if AdaptFunc(a,b)<AdaptFunc(c,d)
    OptSwarm(ParRow+1,:)=ParSwarm(row,1:ParCol);
end

7、

function [Acu]=AdaptFunc1(XX,YY)
%C为最小二乘支持向量机的正则化参数,theta为高斯径向基的核函数参数,两个需要进行优化选择调试
NumOfPre =1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 可不必拘泥
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1=exp(-Dist/(2*YY));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/XX;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/XX - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*YY));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
for i = 1:Len
    %figure 
%     axes(handles.axes2);
    plot(1:Time,Data(i+Dim+2,6:N),'-or',1:Time,Pre(i,:),'-vk');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'o')
    scatter(1:Time,Pre(i,:),'v')
    legend('实际值','预测值','location','southeast')
    hold off
end
acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
s=0;
for i=1:Time
    s=abs(acu(1,i))+s;
end
Acu=s/Time;
save acu1.mat acu


8、

function [Acu]=AdaptFunc(XX,YY)
%C为最小二乘支持向量机的正则化参数,theta为高斯径向基的核函数参数,两个需要进行优化选择调试
NumOfPre =1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 可不必拘泥
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1=exp(-Dist/(2*YY));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/XX;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/XX - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*YY));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;
%for i = 1:Len
%   figure
%   plot(1:Time,Data(i+Dim+2,6:N),'-ro',1:Time,Pre(i,:),'-k^');%画出每一天的预测值和真实值
%   hold on
%
%   axis([0 25 0 100])%坐标范围
%   hold off
%end
acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
s=0;
for i=1:Time
    s=abs(acu(1,i))+s;
end
Acu=s/Time;
save acu.mat acu


9. You can refer to this code

clc;
clear all
C = 30;
theta = 2;%C为最小二乘支持向量机的正则化参数,theta为高斯径向基的核函数参数,两个需要进行优化选择调试
NumOfPre = 1;%预测天数,在此预测本季度最后七天
Time = 24;
Data = xlsread('a23.xls');%此为从excel表格读数据的命令,表示将表格的数据读到Data数组中,省略表格中的第一行第一列文字部分 可输入你要预测的表格名称
[M N] = size(Data);%计算读入数据的行和列 M行N列
for i = 1:3
    maxData = max(Data(:,i));
    minData = min(Data(:,i));
    Data1(:,i) = (Data(:,i) - minData)/(maxData-minData);%对温度进行归一化处理
end
for i = 4:5
    Data1(:,i) = Data(:,i);
end
for i = 6:N
    Data1(:,i) = log10(Data(:,i)) ;%对负荷进行对数处理 温度和负荷的预处理 可采用不同的方法 
end
Dim =  M - 2 - NumOfPre;%训练样本数%训练样本数
Input = zeros(M-2,12,Time);%预先分配处理后的输入向量空间
y = zeros(Dim,Time);
for i = 3:M 
    for j = 1:Time
        %%选取前一天温度、同一时刻的负荷,前两天的负荷,当天的温度作为输入特征
        x = [Data1(i-1,1:5), Data1(i-1,j+5), Data1(i-2,j+5),Data1(i,1:5)];
        Input(i-2,:,j) = x;
        y(i-2,j) = Data1(i,j+5);
    end
end
Dist = zeros(Dim,Dim,Time);%预先分配距离空间
for i=1:Time
    for j=1:Dim
        for k=1:Dim
            Dist(j,k,i) = (Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))';
        end
    end
end
Dist1 = exp(-Dist/(2*theta));%RBF
for i=1:Time
    H = Dist1(:,:,i) + eye(Dim)/C;%最小二乘支持向量的H矩阵
    f = -y(1:Dim,i); 
    Aeq = ones(Dim,1)';
    beq = [0];
    option.MaxIter=1000;
    [a,fval]=quadprog(H,f,[],[],Aeq,beq);%,[],[],[],option);
    b = 0;
    for j = 1:Dim
        b(j) = y(j,i) - a(j)/C - a'* Dist1(:,j,i);%求每个输入特征对应的b
    end
    b = sum(b)/Dim;%求平均b,消除误差
    for j = Dim + 1:M-2
        for k = 1:Dim
            K(k) = exp(-(Input(j,:,i) - Input(k,:,i))*(Input(j,:,i) - Input(k,:,i))'/(2*theta));%预测输入特征与训练特征的RBF距离
        end
        Pre(j-Dim,i) = sum(a'*K') + b;  %求解预测值   
    end
end
Len = M  - (Dim + 3) + 1;%预测的天数 取本季度最后Len天
Pre = 10.^Pre;

Acu = (Pre - Data(Dim+3:M,6:N))./Data(Dim+3:M,6:N);%相对误差
save Acu.mat Acu
s=0;
for i=1:Time
    s=abs(Acu(1,i))+s;
end
acu=s/Time;
save acu.mat acu;
Result=[C,theta,acu];
disp(Result);
for i = 1:Len
    figure 
    plot(1:Time,Data(i+Dim+2,6:N),'r',1:Time,Pre(i,:),'k');%画出每一天的预测值和真实值
    hold on
    scatter(1:Time,Data(i+Dim+2,6:N),'*')
    scatter(1:Time,Pre(i,:),'+')
     legend('实际值','+预测值')
    axis([0 30 0 350])%坐标范围
    hold off
end

data

insert image description here

result

insert image description here
insert image description here
insert image description here
If you need code and data, please send an email in the comment area, usually a reply will be made within one day, please like + pay attention, thank you! !

Guess you like

Origin blog.csdn.net/weixin_44312889/article/details/128099474