clear; clc;close all;
% 五输入:5*39
% 一输出:1*39
% 回归预测
data=xlsread('data.xlsx','Sheet3','A2:G40');
%%
%***********************************************SVR**********************************%
%归一化
data_1 = data(:,1);
data_2 = data(:,2);
data_3 = data(:,3);
data_4 = data(:,4);
data_5 = data(:,5);
data_6 = data(:,6:7);
[data_1,ps0] = mapminmax(data_1',0,1);
[data_2,ps1] = mapminmax(data_2',0,1);
[data_6,ps6] = mapminmax(data_6',0,1);
data_1 = data_1';
data_2 = data_2';
data_6 = data_6';
%数据集
data_train_in(:,1) = data_1(1:30);% x1
data_train_in(:,2) = data_2(1:30);% x2
data_train_in(:,3) = data_3(1:30);% x3
data_train_in(:,4) = data_4(1:30);% x4
data_train_in(:,5) = data_5(1:30);% x5
data_train_out(:,1) = data_6(1:30,1);% y1
data_train_out(:,2) = data_6(1:30,2);% y2
data_test_in(:,1) = data_1(31:39);
data_test_in(:,2) = data_2(31:39);
data_test_in(:,3) = data_3(31:39);
data_test_in(:,4) = data_4(31:39);
data_test_in(:,5) = data_5(31:39);
data_test_out(:,1) = data_6(31:39,1)';
data_test_out(:,2) = data_6(31:39,1)';
%建立回归模型
[bestmse,bestc,bestg] = SVMcgForRegress(data_train_out,data_train_in,-2,2,-2,2,3,0.1,0.1);%cmin,cmax,gmin,gmax,v,cstep,gstep,msestep
% [bestmse,bestc,bestg] = gaSVMcgForRegress(data_train_out,data_train_in);
% pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',20, ...
% 'k',0.6,'wV',1,'wP',1,'v',5, ...
% 'popcmax',2^2,'popcmin',10^(-1),'popgmax',2^2,'popgmin',10^(-2));
% [bestmse,bestc,bestg] = psoSVMcgForRegress(data_train_out,data_train_in,pso_option);
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg),' -s 3 -t 2 -p 0.01'];
%%%%% -c 惩罚系数,默认1
%%%%% -g 核函数参数,默认1/K,K为特征数
%%%%% -s SVM类型 0 - C-SVC 1 - V-SVC 2 - One-Class-SVM 3 - e-SVR 4 - n-SVR
%%%%% -t 核函数类型 0 - 线性核 1 - 多项式核 2 - RBF核 3 - Sigmoid核
%%%%% -p 损失函数参数,默认0.1
%%%%% -v 交叉验证参数,默认3
model = svmtrain(data_train_out,data_train_in,cmd);
%预测
for i=1:2
[ptesty(:,i),mse,prob] = svmpredict(data_test_out(:,i),data_test_in,model);%mse:均方误差和相关系数
end
data_test_out = data_test_out';
data_test_out = mapminmax('reverse',data_test_out,ps6);%去归一化
ptesty = ptesty';
ptesty = mapminmax('reverse',ptesty,ps6);%去归一化
figure;
subplot(121)
plot(data_test_out(1,:));
hold on;
plot(ptesty(1,:));
legend('实际值','预测值')
subplot(122)
plot(data_test_out(2,:));
hold on;
plot(ptesty(2,:));
legend('实际值','预测值')