机器学习之MATLAB代码--神经网络关于电力负荷的SVM预测,设计了MATLAB的可视化界面,含数据(九)

机器学习之MATLAB代码--神经网络关于电力负荷的SVM预测,设计了MATLAB的可视化界面,含数据(九)

代码

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、这个代码可以参考一下

扫描二维码关注公众号,回复: 14966437 查看本文章
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

数据

在这里插入图片描述

结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如有需要代码和数据的同学请在评论区发邮箱,一般一天之内会回复,请点赞+关注谢谢!!

猜你喜欢

转载自blog.csdn.net/weixin_44312889/article/details/128099474
今日推荐