调用lssvm训练好的模型

最近要实现异步电机的LSSVM逆控制,参考文献《基于LS-SVM的异步电机解耦控制方法》已附。遇到的问题是:训练得到的模型model挺好的,为什么单独拿出来调用,效果却很差?我的程序贴出来如下:1,训练程序 lssvm_um.m ,保存训练好的model ,文件名为 LSSVM1223
%% 文件:LS-SVM 程序学习,数据:MTdata1126.mat,具有6000组数据 日期:20141209 目标:转矩电压输出um
%6输入1输出的系统
clear all
clc
%导入数据
load MTdata1126.mat
%随机产生训练集和测试集
n=randperm(size(MTdata1029_in,1));             %***********注意数据修改****************************
%训练集 1000个样本
train_matrix=MTdata1029_in(n(1:2:2000),:);
train_label=MTdata1029_um_out(n(1:2:2000),:);       %训练集输出值为um,对应于MTdata1126_um*********注意:修改部分*************
%测试集 200个样本
%test_matrix=MTdata1029_in(n(2:2:800),:);
%test_label=MTdata1029_um_out(n(2:2:800),:); 
test_matrix=MTdata1029_in(n(5801:end),:);
test_label=MTdata1029_um_out(n(5801:end),:);      %测试集输出值为um,对应于data1017_um*********注意:修改部分************
%% 归一化处理
%训练集
[Train_matrix,inputps]=mapminmax(train_matrix');
Train_matrix=Train_matrix';                        %数据结构为4000*6  
Test_matrix=mapminmax('apply',test_matrix',inputps);
Test_matrix=Test_matrix';                          %数据结构为2000*6
%测试集
[Train_label,outputps]=mapminmax(train_label');
Train_label=Train_label';                          %数据结构为4000*1 
Test_label=mapminmax('apply',test_label',outputps);
Test_label=Test_label';                            %数据结构为2000*1      
%%  *********************统一一下训练、测试集书写格式*****************************
X=Train_matrix; %训练集输入矩阵
Xt=Test_matrix; %测试集输入矩阵
Y=Train_label;  %训练集输出(标签)矩阵
Yt=Test_label;  %测试集输出(标签)矩阵
%% LS-SVM参数设置****************************************************************
%type = 'f';
%kernel = 'RBF_kernel';
%gam = 2;                % Regularization parameter
%sig2 = 0.25;            % Kernel parameter (bandwidth in the case of the 'RBF_kernel'
%model = initlssvm(X,Y,type,gam,sig2,kernel);     % ***********模型初始化********************
model = initlssvm(X,Y,'f',[],[],'RBF_kernel','original'); %最后一个参数表示’preprocess’(*) or ’original’,归一化或者不归一化(自己归一化的数据,试用此)
%% 交叉验证优化参数
%costfun = 'rcrossvalidate';
%costfun_args = {X,Y,10};
%optfun = 'gridsearch';
%model = tunelssvm(model,[],optfun,{},costfun,costfun_args);     % *******模型参数优化****** 

model = tunelssvm(model,'simplex','crossvalidatelssvm',{10,'mse'});    %交叉验证优化参数的三种形式,simplex which works for all kernels
                                                                        %单纯型 适用于所有内核
%model = tunelssvm(model,'gridsearch','crossvalidatelssvm',{10,'mse'}); %(this one is restricted to 2-dimensional tuning parameter optimization);
                                                                       %(这是局限于二维调优参数优化);
%model = tunelssvm(model,'linesearch','crossvalidatelssvm',{10,'mse'}); %(used with the linear kernel).用于线性内核
%% 留一法优化参数
%model =
%tunelssvm(model,'simplex','leaveonroutlssvm',{'mse'}); %leaveonroutlssvm留一法无法使用

%% 训练与测试
model = trainlssvm(model);          %训练model 
Predict_Y=simlssvm(model,X);        %训练集回归预测
Predict_Yt=simlssvm(model,Xt);      %测试集回归预测
%model                               %显示model的结构以及参数
save LSSVM1223 model        %保存训练好的model   文件名为 LSSVM1223
%% ***********************************性能指标***********************************
              %*****************训练集的性能指标*********************************
%均方误差
tn_sim=Predict_Y;         %方便计算均方误差和决定系数
tn_test=Y;                %方便计算均方误差和决定系数
E_1=mse(tn_sim-tn_test);
%决定系数
N = size(train_label,1);   %训练集样本数
R2_1=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))^2/((N*sum((tn_sim).^2)-(sum(tn_sim))^2)*(N*sum((tn_test).^2)-(sum(tn_test))^2)); 

               %*****************测试集的性能指标*********************************
%均方误差
tn_sim=Predict_Yt;        %方便计算均方误差和决定系数
tn_test=Yt;               %方便计算均方误差和决定系数
E=mse(tn_sim-tn_test);
%决定系数
N = size(test_label,1);   %测试集样本数
R2=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))^2/((N*sum((tn_sim).^2)-(sum(tn_sim))^2)*(N*sum((tn_test).^2)-(sum(tn_test))^2)); 
%反归一化
predict_Y=mapminmax('reverse',Predict_Y',outputps);    %训练集回归预测反归一化后数值
predict_Y=predict_Y';
predict_Yt=mapminmax('reverse',Predict_Yt',outputps);  %测试集回归预测反归一化后数值
predict_Yt=predict_Yt';
%% ******************************* 结果作图**************************************
figure(1)
plot(1:length(train_label),train_label,'r-*',1:length(train_label),predict_Y,'b:o')
grid on
legend('真实值','预测值')
xlabel('样本编号')
ylabel('转矩电压um')
string_1={'训练集预测结果对比'
          ['mse = ' num2str(E_1)  'R^2 = ' num2str(R2_1)]};
title(string_1)
figure(2)
plot(1:length(test_label),test_label,'r-*',1:length(test_label),predict_Yt,'b:o')
grid on
legend('真实值','预测值')
xlabel('样本编号')
ylabel('转矩电压um')
string_2={'测试集预测结果对比';
          ['mse = ' num2str(E) 'R^2 = ' num2str(R2)]};
title(string_2)
figure(3)
plotlssvm(model)                  %绘图,用LSSVM绘制训练好model的情况

2,然后用保存好model   文件名为 LSSVM1223  进行回归预测(检验一下训练好的模型是否好用,想要利用训练好的model用到simulink中,如参考文献),请注意红色部分。
测试model的程序 test_lssvm_um.m:(这个程序只是测试用的,解释文字没有实际意义)
%% 文件:LS-SVM 程序学习,数据:MTdata1126.mat 日期:20141209 目标:转矩电压输出um
%6输入以输出的系统
clear all
clc
%导入数据
load MTdata1126.mat
%随机产生训练集和测试集
n=randperm(size(MTdata1029_in,1));             %***********注意数据修改****************************
%训练集 400个样本
%train_matrix=MTdata1029_in(n(1:2:800),:);
%train_label=MTdata1029_um_out(n(1:2:800),:);       %训练集输出值为um,对应于MTdata1126_um*********注意:修改部分*************
%测试集 200个样本
%test_matrix=MTdata1029_in(n(2:2:800),:);
%test_label=MTdata1029_um_out(n(2:2:800),:); 

%test_matrix=MTdata1029_in(n(5801:end),:);
%test_label=MTdata1029_um_out(n(5801:end),:);      %测试集输出值为um,对应于data1017_um*********注意:修改部分************
%%  *******************等间隔选取样本*****************************
%产生训练集400个样本
train_matrix=MTdata1029_in(1:2:800,:);     %数据结构为4000*6   , 神经网络的格式使然。SVM格式为4000*6
train_label=MTdata1029_um_out(1:2:800,:);  %数据结构为4000*6    ,SVM格式为4000*6,每一列为一个样本
%产生测试集200个样本
test_matrix=MTdata1029_in((1000:2:6000),:);    %都变成了2000*6
test_label=MTdata1029_um_out((1000:2:6000),:); %都变成了2000*1
%% 归一化处理
%训练集
[Train_matrix,inputps]=mapminmax(train_matrix');
Train_matrix=Train_matrix';                        %数据结构为4000*6  
Test_matrix=mapminmax('apply',test_matrix',inputps);
Test_matrix=Test_matrix';                          %数据结构为2000*6
%测试集
[Train_label,outputps]=mapminmax(train_label');
Train_label=Train_label';                          %数据结构为4000*1 
Test_label=mapminmax('apply',test_label',outputps);
Test_label=Test_label';                            %数据结构为2000*1      
%%  *********************统一一下训练、测试集书写格式*****************************
%pn_train=Train_matrix;    %训练集输入矩阵
X=Train_matrix;
%pn_test=Test_matrix;      %测试集输入矩阵
Xt=Test_matrix;
%tn_train=Train_label;     %训练集输出(标签)矩阵
Y=Train_label; 
%tn_test=Test_label;       %%测试集输出(标签)矩阵
Yt=Test_label;
%% LS-SVM参数设置****************************************************************
%type = 'f';
%kernel = 'RBF_kernel';
%gam = 2;              % Regularization parameter
%sig2 = 0.25;            % Kernel parameter (bandwidth in the case of the 'RBF_kernel'
%model = initlssvm(X,Y,type,gam,sig2,kernel);     % ***********模型初始化********************
%% 交叉验证优化参数
%costfun = 'rcrossvalidate';
%costfun_args = {X,Y,10};
%optfun = 'gridsearch';
%model = tunelssvm(model,[],optfun,{},costfun,costfun_args);     % *******模型参数优化****** 
%% 训练与测试
load ('LSSVM1223.mat')                    %下载保存好的model,用于预测
%model = trainlssvm(model);          %训练model 
Predict_Y=simlssvm(model,X);        %训练集回归预测
Predict_Yt=simlssvm(model,Xt);      %测试集回归预测
model                        %显示model的解耦以及参数
%save LSSVM1209 model        %保存训练好的model   文件名为 LSSVM1209
%% ***********************************性能指标***********************************
              %*****************训练集的性能指标*********************************
%均方误差
tn_sim=Predict_Y;         %方便计算均方误差和决定系数
tn_test=Y;                %方便计算均方误差和决定系数
E_1=mse(tn_sim-tn_test);
%决定系数
N = size(train_label,1);   %训练集样本数
R2_1=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))^2/((N*sum((tn_sim).^2)-(sum(tn_sim))^2)*(N*sum((tn_test).^2)-(sum(tn_test))^2)); 

               %*****************测试集的性能指标*********************************
%均方误差
tn_sim=Predict_Yt;        %方便计算均方误差和决定系数
tn_test=Yt;               %方便计算均方误差和决定系数
E=mse(tn_sim-tn_test);
%决定系数
N = size(test_label,1);   %测试集样本数
R2=(N*sum(tn_sim.*tn_test)-sum(tn_sim)*sum(tn_test))^2/((N*sum((tn_sim).^2)-(sum(tn_sim))^2)*(N*sum((tn_test).^2)-(sum(tn_test))^2)); 
%反归一化
predict_Y=mapminmax('reverse',Predict_Y',outputps);    %训练集回归预测反归一化后数值,反归一化时候,转置一下数据
predict_Y=predict_Y';                                   %再次转置回来
predict_Yt=mapminmax('reverse',Predict_Yt',outputps);  %测试集回归预测反归一化后数值
predict_Yt=predict_Yt';                                       %再次转置回来
%% ******************************* 结果作图**************************************
figure(1)
plot(1:length(train_label),train_label,'r-*',1:length(train_label),predict_Y,'b:o')
grid on
legend('真实值','预测值')
xlabel('样本编号')
ylabel('转矩电压um')
string_1={'训练集预测结果对比'
          ['mse = ' num2str(E_1)  'R^2 = ' num2str(R2_1)]};
title(string_1)
figure(2)
plot(1:length(test_label),test_label,'r-*',1:length(test_label),predict_Yt,'b:o')
grid on
legend('真实值','预测值')
xlabel('样本编号')
ylabel('转矩电压um')
string_2={'测试集预测结果对比';
          ['mse = ' num2str(E) 'R^2 = ' num2str(R2)]};
title(string_2)
figure(3)
plotlssvm(model)                  %绘图,用LSSVM绘制保存的训练好model的情况
 

你可能感兴趣的:(调用lssvm训练好的模型)