目录
摘要:
1.支持向量机介绍及核函数选取:
(1)支持向量机(Support Vector Machine, SVM)
(2)支持向量机的核函数选取
2.SVM构建与网格搜索优化:
3.运行结果及matlab代码:
摘要:
基于Matalb平台,使用SVM实现多输入单输出的电力系统负荷回归预测,其中使用径向基核(RBF)作为SVM的核函数。为了提升SVM的性能,使用网格搜索优化方法来优化SVM中两个最重要的参数c和g。使用均方根误差(RMSE)作为SVM回归预测性能评价,并绘制相关的图形。代码注释详细,考虑多种特征输入进行回归预测,可修改为自己的数据实现不同的功能。
1.支持向量机介绍及核函数选取:
(1)支持向量机(Support Vector Machine, SVM)
Vapnik等人在多年研究统计学习理论基础上对线性分类器提出了另一种设计最佳准则。其原理也从线性可分说起,然后扩展到线性不可分的情况。甚至扩展到使用非线性函数中去,这种分类器被称为支持向量机(简称SVM)。支持向量机的提出有很深的理论背景。支持向量机方法是在后来提出的一种新方法。SVM的主要思想可以概括为两点:
1.它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
2.它基于结构风险最小化理论之上在特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。
(2)支持向量机的核函数选取
SVM是一种有监督的模式识别方法,它的主要思想是建立一个分类决策面,利用核函数将数据映射到高维空间,使其尽可能的线性可分。常用的核函数包括线性核函数、多项式核、径向基核(RBF)、傅里叶核、样条核和Sigmoid核函数等。通过比较这些核函数适用的数据特点,无论样本数据特点是高维还是低维,数据量大还是小,RBF核函数展现了很好的性能。因此,选择RBF作为SVM的回归核函数。
2.SVM构建与网格搜索优化:
SVM数据处理过程如下:
设特征数据为N维,共L组数据,即
决策面可表示为
式中
—决策面的权重系数
—非线性映射函数
b—阈值
为了最小化结构风险,最优分类超平面应满足以下条件
引入非负松弛变量
这样分类误差就在一个规定的范围内。因此,优化问题就被转变为
式中c —惩罚因子,控制模型的复杂程度和泛化能力.
本文,引入RBF核函数
式中g —核函数参数,控制输入空间的范围
上述优化问题转变为
可以看出,优化问题取决于两个重要参数c和g,这两个参数会影响SVM的预测性能。SVM预测问题取决于两个重要参数c和g,这两个参数会影响SVM的预测性能。为了提高模型的预测性能,引入网格式搜索法(GS)优化模型建立过程中的两个重要参数。同时避免模型过学习和欠学习的现象发生,采用5倍交叉验证法以训练集最小均方根误差为适应度函数来进行参数寻优。当达到最小均方根误差时,所得到的c和g为最佳参数。GS中,以0.5为间隔进行全局搜索,c和g的范围均是(2-10, 210)
总之SVM预测过程为:
(1)输入数据,规定训练输入、训练输出、预测输入和预测输出
(2)为加快网络收敛速度,进行数据归一化处理
(3)参数寻优,网格数搜索开始
(4)得到最优参数建立预测模型,避免模型过学习和欠学习的现象发生,采用5倍交叉验证法以训练集最小均方根误差为适应度函数来进行参数寻优。当达到最小均方根误差时,所得到的c和g为最佳参数。
(5)预测数据输入
(6)得出预测结果
利用均方根误差(RMSE)评价预测效果好坏,RMSE越小越好。在显示面板结果直接显示了。
以12℃解释为例,当训练集在五倍交叉验证下获得最小均方误差为0.041678时,获得最佳参数c为0.43528,最佳参数g为6.6944。测试集的预测值和真实值之间均方根误差为14.8600。
3.运行结果及matlab代码:
基于SVM的电力负荷预测结果如下所示:
Matlab代码如下,本文仅展示部分代码,需要完整代码
%% 清空环境变量标签:SVM,预测,predict,网格,tts,参数,Matlab,搜素,函数 From: https://blog.51cto.com/u_15739983/5948913
clc;
close all;
clear all;
%% 数据的提取和预处理
data=xlsread('筛选后数据');
ts = data((2:321),1);%训练集输出
tsx = data((2:321),2:end);%训练集输入
tts=data((322:end),1);%预测集输出
ttx= data((322:end),2:end);%预测集输入
% 数据预处理,将原始数据进行归一化
ts = ts';
tsx = tsx';
tts=tts';
ttx=ttx';
% mapminmax为matlab自带的映射函数
% 对ts进行归一化
[TS,TSps] = mapminmax(ts,-1,1); %矢量归一化
[TTS,TTSps]= mapminmax(tts,-1,1);
TS = TS';
TTS=TTS';
% mapminmax为matlab自带的映射函数
% 对tsx进行归一化
[TSX,TSXps] = mapminmax(tsx,-1,1); %特征值归一化
[TTX,TTXps] = mapminmax(ttx,-1,1);
% 对TSX进行转置,以符合libsvm工具箱的数据格式要求
TSX = TSX';
TTX = TTX';
%% 选择回归预测分析最佳的SVM参数c&g
% 进行参数选择:
[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-10,10,-10,10);
% 打印参数选择结果
disp('打印参数选择结果');
str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg);
disp(str);
%% 利用回归预测分析最佳的参数进行SVM网络训练
cmd = ['-c ', num2str(bestc), ' -g ', num2str(bestg) , ' -s 3 -p 0.01'];
model = svmtrain(TS,TSX,cmd);
%% SVM网络回归预测
[predict,mse] = svmpredict(TS,TSX,model);
[predict_2,mse_2] = svmpredict(TTS,TTX,model);
predict = mapminmax('reverse',predict',TSps);
predict_2 = mapminmax('reverse',predict_2',TTSps);
predict = predict';
predict_2 =predict_2';
% 均方根误差计算
N = length(tts);
RMSE = sqrt((sum((tts-predict_2').^2))/N);
fprintf('优化后的SVM负荷预测的RMSE为');
disp(RMSE);
% % 相关系数
% N = length(tts);
% YUCE_R2 = (N*sum(predict_2'.*tts)-sum(predict_2)*sum(tts))^2/((N*sum((predict_2).^2)-(sum(predict_2'))^2)*(N*sum((tts).^2)-(sum(tts))^2))
%% 结果分析(测试集)
figure;
plot(tts,'-o');
hold on;
plot(predict_2,'r-^');
hold off;
ylim([100,300]);
grid on;
legend('实际负荷','预测负荷');
title('SVM预测输出图','FontSize',12);
xlabel('2019年11月20日-2019年12月30日','FontSize',12);
ylabel('负荷(KW)','FontSize',12);