function psoSVMcpForRegress;
%psoSVMcgpForRegress;
%chapter_sh
tic;
close all;
clear;
clc;
format compact;
%% 数据的提取和预处理
% 载入测试数据上证指数(1990.12.19-2009.08.19)
% 数据是一个4579*6的double型的矩阵,每一行表示每一天的上证指数
% 6列分别表示当天上证指数的开盘指数,指数最高值,指数最低值,收盘指数,当日交易量,当日交易额.
%load chapter_sh.mat;
% 提取数据
%[m,n] = size(sh);
%ts = sh(2:m,1);
%tsx = sh(1:m-1,:);
%ts = sh(2:m-100,1);
%tsx = sh(1:m-101,:);
%fs = sh(m-99:m,1);
%fsx = sh(m-100:m-1,:);
ts = [445;507;434;443;503;687;678;811;707;652;608;594;591;699;722;788;783;780;781;726;1492;1503;1400;];
tsx = [
1.10 311.89 579.00 1152.00 445.00 1.24 200.00 7284.00 7.98
1.18 324.76 635.00 1168.00 507.00 1.37 209.00 7451.00 8.35
0.83 337.07 637.00 1186.00 434.00 1.39 221.00 7826.00 8.97
0.73 351.81 684.00 1201.00 443.00 2.48 227.00 8052.00 9.54
0.83 390.85 782.00 1217.00 503.00 3.25 343.00 8696.00 10.31
0.71 466.75 1019 1233.00 687.00 4.32 410.00 9216.00 11.07
0.84 490.83 1174 1249.00 678.00 6.43 504.00 10126.00 12.59
1.01 545.46 1282 1265.00 811.00 8.08 713.00 10159.00 13.42
0.84 648.30 1654 1288.00 707.00 8.61 717.00 10019.00 13.63
0.75 696.54 1883 1311.00 652.00 8.24 657.00 9526.00 13.00
0.76 781.66 2154 1334.00 608.00 8.42 605.00 8714.00 11.47
0.75 893.77 2318 1350.00 594.00 7.27 598.00 8888.00 11.94
0.45 1114.32 2697 1365.00 591.00 6.53 591.00 9427.00 12.98
0.81 1519.23 4044 1381.00 699.00 6.08 520.00 9194.00 11.93
1.26 1990.86 5273 1398.00 722.00 8.78 1086.00 7446.00 9.96
1.67 2518.08 6590 1414.00 788.00 8.23 1257.00 6273.00 9.32
2.01 2980.75 7545 1451.00 783.00 8.83 1974.00 25023.00 48.75
2.16 3465.28 8586 1489.00 780.00 12.61 2277.00 25991.00 47.12
2.40 3831.00 9147 1527.00 781.00 12.07 2006.00 26352.00 49.44
2.61 4222.30 9883 1567.00 726.00 15.81 2178.00 27171.00 51.09
4.13 4812.15 11061 1608.60 1492 16.44 2482.00 28369.00 56.37
4.21 5257.66 11660 1668.33 1503 42.31 1508.00 28869.00 60.34
4.71 5795.02 12627 1712.97 1400 50.43 2046 29759 65.00
];
fs=[1406;1543;1393;1231;1171;1100;1042;1011;944;916;914;902;868;759;676;]
fsx=[
5.42 6762.38 14013 1765.84 1406 58.00 2052 30678 69.00
2.71 8165.38 15937 1834.98 1543 72.09 2465 31554 71.00
0.92 9365.54 17894 1890.26 1393 75.06 2468 32684 73.00
0.66 10718.04 20022 1964.11 1231 86.85 2784 33799 80.00
0.40 12668.89 22893 2063.58 1171 94.02 2872 35634 85.00
0.27 14276.79 25172 2140.65 1100 94.07 2934 40328 253.00
0.28 15287.56 26591 2210.28 1042 99.57 2995 37745 244.00
0.22 17436.85 32287 2302.66 1011 115.44 3634 40890 266.00
0.21 19539.07 35461 2347.46 944.00 106.74 3477 42685 284.00
0.23 20558.98 36916 2380.43 916.00 112.72 3748 42911 288.00
0.20 22264.06 39642 2415.15 914.00 108.71 3720 43809 299.00
0.12 24068.20 43037 2425.68 902.00 124.34 3754 42848 301.00
0.10 25659.18 45881 2415.27 868.00 125.45 3766 40627 290.00
0.08 28183.51 49637 2419.70 759.00 114.98 3402 39055 282.00
0.07 30632.99 53617 2418.33 676.00 116.67 3419 39743 298.00
];
% = [971;897];
%fs=ts;
%fsx = tsx;
% = [971;897];
%fs=ts;
%fsx = tsx;
%8.3 10.2 12 12.7 13 13.2 13.9 12.9 13.4 13.2 12.3 10.8 7.8;
% 5.3 7.1 7.8 8.5 8.7 9.6 10.8 11.4 12.1 11.3 11.4 10.2 8.1
% 画出原始上证指数的每日开盘数
figure;
plot(ts,'LineWidth',2);
title('上海市交通事故数(1995-2009)','FontSize',12);
xlabel('事故年份(1995-2009)','FontSize',12);
ylabel('事故数','FontSize',12);
grid on;
% 数据预处理,将原始数据进行归一化
ts = ts';
tsx = tsx';
fs = fs';
fsx = fsx';
% mapminmax为matlab自带的映射函数
% 对ts进行归一化
[TS,TSps] = mapminmax(ts,1,2);
[FS,FSps] = mapminmax(fs,1,2);
% 画出原始上证指数的每日开盘数归一化后的图像
figure;
plot(TS,'LineWidth',2);
title('上海市交通事故数归一化后的图像','FontSize',12);
xlabel('事故年份(1995-2009)','FontSize',12);
ylabel('归一化后的事故数','FontSize',12);
grid on;
% 对TS进行转置,以符合libsvm工具箱的数据格式要求
TS = TS';
FS = FS';
% mapminmax为matlab自带的映射函数
% 对tsx进行归一化
[TSX,TSXps] = mapminmax(tsx,1,2);
[FSX,FSXps] = mapminmax(fsx,1,2);
% 对TSX进行转置,以符合libsvm工具箱的数据格式要求
TSX = TSX';
FSX = FSX';
%% 选择回归预测分析最佳的SVM参数c&g
% 首先进行粗略选择:
[bestmse,bestc,bestg] = psoSVMcgForRegress(TS,TSX);
% 打印粗略选择结果
disp('打印粗略选择结果');
str = sprintf( 'Best Cross Validation MSE = %g Best c = %g Best g = %g',bestmse,bestc,bestg);
disp(str);
% 根据粗略选择的结果图再进行精细选择:
%[bestmse,bestc,bestg] = psoSVMcgForRegress(TS,TSX,-4,4,-4,4,3,0.5,0.);
% 打印精细选择结果
%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 -t 2 -p 0.01'];
model = svmtrain(TS,TSX,cmd);
%% SVM网络回归预测
%[predict,mse] = svmpredict(TS,TSX,model);
%[predict] = svmpredict(TS,TSX,model,'-b 0');
[predict] = svmpredict(FS,FSX,model,'-b 0');
%[predict_t1,accuracy_t1,dv_t] = svmpredict(test_price1,test_proper1,model);
predict = mapminmax('reverse',predict',TSps);
predict = predict';
str1 = sprintf( 'pMSE = %g',predict);
disp(str1);
% 打印回归结果
str = sprintf( '均方误差 MSE = %g 相关系数 R = %g%%',mse(2),mse(3)*100);
%str = sprintf( '均方误差 MSE = %g 相关系数 R = %g%%',mse,mse*100);
disp(str);
%% 结果分析
figure;
hold on;
plot(fs,'-o');
hold on;
plot(predict,'r-^');
legend('原始数据','回归预测数据');
hold off;
title('原始数据和回归预测数据对比','FontSize',12);
xlabel('事故年份(1995-2009)','FontSize',12);
ylabel('事故数','FontSize',12);
grid on;
%figure;
%error = predict - fs';
%plot(error,'rd');
%title('Error map(predicted data - original data)','FontSize',12);
%xlabel('Days','FontSize',12);
%ylabel('Margin of error','FontSize',12);
%grid on;
%&&&&&&
figure;
error = (predict - fs')./fs';
plot(error,'rd');
title('相对误差图(predicted data - original data)/original data','FontSize',12);
xlabel('事故年份(1995-2009)','FontSize',12);
ylabel('相对误差量','FontSize',12);
grid on;
snapnow;
toc;
function [bestCVmse,bestc,bestg,pso_option] = psoSVMcgForRegress(train_label,train,pso_option)
% psoSVMcgForClass
%
% by faruto
%Email:patrick.lee@foxmail.com QQ:516667408 http://blog.sina.com.cn/faruto
%last modified 2011.06.08
% 若转载请注明:
% faruto and liyang , LIBSVM-farutoUltimateVersion
% a toolbox with implements for support vector machines based on libsvm, 2011.
% Software available at http://www.matlabsky.com
%
% Chih-Chung Chang and Chih-Jen Lin, LIBSVM : a library for
% support vector machines, 2001. Software available at
% http://www.csie.ntu.edu.tw/~cjlin/libsvm
%% 参数初始化
if nargin == 2
pso_option = struct('c1',1.5,'c2',1.7,'maxgen',200,'sizepop',100, ...
'k',0.6,'wV',1,'wP',1,'v',5, ...
'popcmax',10^1,'popcmin',10^(-1),'popgmax',10^3,'popgmin',10^(-2));
end
% c1:初始为1.5,pso参数局部搜索能力
% c2:初始为1.7,pso参数全局搜索能力
% maxgen:初始为200,最大进化数量
% sizepop:初始为20,种群最大数量
% k:初始为0.6(k belongs to [0.1,1.0]),速率和x的关系(V = kX)
% wV:初始为1(wV best belongs to [0.8,1.2]),速率更新公式中速度前面的弹性系数
% wP:初始为1,种群更新公式中速度前面的弹性系数
% v:初始为5,SVM Cross Validation参数
% popcmax:初始为100,SVM 参数c的变化的最大值.
% popcmin:初始为0.1,SVM 参数c的变化的最小值.
% popgmax:初始为1000,SVM 参数g的变化的最大值.
% popgmin:初始为0.01,SVM 参数c的变化的最小值.
Vcmax = pso_option.k*pso_option.popcmax;
Vcmin = -Vcmax ;
Vgmax = pso_option.k*pso_option.popgmax;
Vgmin = -Vgmax ;
eps = 10^(-4);
%% 产生初始粒子和速度
for i=1:pso_option.sizepop
% 随机产生种群和速度
pop(i,1) = (pso_option.popcmax-pso_option.popcmin)*rand+
评论0