clc
clear
close all
%% 加载数据
load Speed.mat;
iGroupLen = 16;
iPredictLen = 16;
% 分组
iTotalLen = length(Speed);
vSpeed = Speed(400:1200);
iLen = length(vSpeed);
if iLen-iTotalLen >= 0
return;
end
if iLen+iPredictLen
vReal = Speed(iLen+1:iLen+iPredictLen);
else
vReal = Speed(iLen+1:iTotalLen);
end
iRealLen = length(vReal);
for iCount=1:iLen-iGroupLen
mGroup(iCount,1:iGroupLen) = vSpeed(iCount:iGroupLen+iCount-1);
mGroup(iCount,iGroupLen+1) = vSpeed(iGroupLen+iCount);
end
% 归一化
iMax = max(vSpeed);
iMin = min(vSpeed);
iSub = iMax-iMin;
vSpeed = (vSpeed(:,1)-iMin)/iSub;
vRealNormal = (vReal(:,1)-iMin)/iSub;
mFeature = mGroup(:,1:iGroupLen);
mTarget = mGroup(:,iGroupLen+1);
vStart = vSpeed(iCount:iGroupLen+iCount-1);
%% 训练
% 1、准备,训练样本和测试样本,模型初始化
type = 'function estimation';
kernel = 'RBF_kernel';
gam = 100; % Regularization parameter
sig2 = 0.01; % Kernel parameter (bandwidth in the case of the 'RBF_kernel'
mX = mFeature;
vY = mTarget;
model = initlssvm(mX,vY,type,gam,sig2,kernel);
%2 参数寻优
costfun = 'crossvalidatelssvm';
costfun_args = {10,'mse'};
optfun = 'gridsearch';
model = tunelssvm(model,optfun,costfun,costfun_args); % 模型参数优化
% load speedmodel.mat;
%% 预测
vPredict = [];
for iCount = 1:iRealLen
model = trainlssvm(model);
iReturn = simlssvm(model,vStart');
vPredict(iCount,1) = iReturn;
vStart = [vStart(2:iGroupLen); iReturn];
% vRealNormal(iCount,1)
% vStart = [vStart(2:iGroupLen); vRealNormal(iCount,1)];
end
反归一
vPredict(:,1).*iSub+ones(iRealLen,1)*iMin;
%统计计算结果
iAbs = abs(vReal-vPredict);
mResult = [vReal vPredict iAbs iAbs./vReal];
iAd = sum(mResult(:,4))/length(vReal);
%% 5 显示预测结果
plot(mResult(:,1:2));
xlabel('时间点(10min/次)','FontWeight', 'bold');
ylabel('功率(kw)','FontWeight', 'bold');
legend('预测风速','实际风速');