初入SVM学习报告

来源:互联网 发布:刺客信条枭雄优化补丁 编辑:程序博客网 时间:2024/06/06 04:17

学习报告

本周工作

初步的了解svm,熟悉算法的流程,建立模型,并且写程序实现。

了解每一行代码的含义(以葡萄酒实验和上证指数为例)

了解交叉选取参数的方法,以及意义

解决软件运行和兼容性的问题,为实验打好基础

实验总结

(1)算法介绍

(1)SVM介绍

支持向量机:(SVM)类似多层感知器网络、径向基函数网络,用于模式分类和线性回归。支持向量机的主要思想是建立一个超类平面作为一个决策去曲面,这样可以使得正例与反例之间的边缘得到最大化,利于区分。

1.多层感知网络:是一种前馈人工神经网络模型,其将输入的多个数据集映射到单一的输出的数据集上。

2.径向基函数 :是一个取值仅仅依赖于离原点距离的实值函数。

3.鲁棒性:是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。

4.VC维数:所谓VC维是对函数类的一种度量,可以简单的理解为问题的复杂程度,VC维越高,一个问题就越复杂。

5.核函数:多项式核函数K(x,xi)=(xxi+1)^d, d=1,2,...,N;根据模式识别理论,低维空间线性不可分的模式通过非线性映射到高维特征空间则可能实现线性可分,但是如果直接采用这种技术在高维空间进行分类或回归,则存在确定非线性映射函数的形式和参数、特征空间维数等问题,而最大的障碍则是在高维特征空间运算时存在的"维数灾难"

种类::线性核函数,多项式核函数,径向基核函数,Sigmoid核函数和复合核函数。

2)葡萄酒的分类中,为了达到满意的效果,需要调节相关的参数(c[惩罚参数],g[函数参数]),这时候,我们就要采用交叉验证,这样既可以避免欠学习,又可以避开过学习。

1.hold-out method:随机分为两组一组训练集,一组验证集。利用训练集训练分类器,验证集来验证模型,准确率与分组有关系,因此一般不采用。

2.KCV:原始数据分为K组,将每个子集数据分别做一次验证集,其余的K-1组为训练集。K一般都大于2,只有数据量很少时采用2

3.N-CV:每个样本单独的作为验证集,其余的 N-1个为训练集,所以会得到N个模型,实验结果有较高的说服力,但是计算量却是极大的。

        遗传算法是模拟达尔文的进化论的自然选择和遗传学机理的生物进 化过程的计算模型,是一种通过模拟自然进化和过程搜索的最优解方法。

遗传算法模拟了自然选择中的复制、交叉、变异等现象,从任一群体出发,通过随机交叉、变异、复制等操作,产生一群更适合环境的个体,使群体进化到搜索空间中更好的区域,这样一代代的繁衍进化,就得到了一个更加适应环境的个体,即最优解

3本次采取的算法还是前两次的方法,首先使用模糊信息粒化的原始数据,在最后加了回归预测。通过书上提供的4579个数据进行拟合回归分析。首先选定因变量与果变量,在讲数据进行归一化处理,在利用K-CV选出最佳的参数c/g,然后训练SVM,最后进行拟合预测。

(2)问题描述

(1)使用SVM对意大利的葡萄酒进行分类,数据使用UCIwine数据。共有178个数据,其中的50%是测试集,50%是训练集。用训练集对SVM进行训练得到分类模型,在用得到的模型对测试集进行预测。接下来使用相同的核函数与不同的归一化方法测试准确率,还有使用相同的归一化使用不同的核函数测试准确率。

(2)在SVM对葡萄酒进行分类中,利用K-CV来选取最佳参数cg

    (3)利用SVM进行了回归预测,根据大智慧软件提供的从1990 2009的数据进行预测,选取从14578的开盘指数的最高值,最低值,收盘指数,交易量,到交易额作为自变量,选取第二个到4579在指数作为因变量,然后对数据进行归一化处理,选择上一次的K-CV选择出最佳的参数,然后对SVM进行训练,回归预测。

(3)程序流程

一、用svm对葡萄酒进行分类

 

 

二、用K-CV对上一次的实验进行参数的优化

 

 

三、SVM进行回归预测

 

 

(4)程序实现

1.对葡萄酒进行分类的关键代码

close all;

clear;

clc;

format compact;

%% 数据提取

 load chapter12_wine.mat; 

选定训练集和测试集

 

将第一类的1-30,第二类的60-95,第三类的131-153做为训练集

train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];

相应的训练集的标签也要分离出来

train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];

将第一类的31-59,第二类的96-130,第三类的154-178做为测试集

test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];

相应的测试集的标签也要分离出来

test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)];

 

%% 数据预处理

数据预处理,将训练集和测试集归一化到[0,1]区间

[mtrain,ntrain] = size(train_wine);

[mtest,ntest] = size(test_wine);

 

dataset = [train_wine;test_wine];

% mapminmaxMATLAB自带的归一化函数

[dataset_scale,ps] = mapminmax(dataset',0,1);

dataset_scale = dataset_scale';

 

train_wine = dataset_scale(1:mtrain,:);

test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );

 

%% SVM网络训练

model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1 -t 2 ');

 

%% SVM网络预测

[predict_label, accuracy,dec_values] = svmpredict(test_wine_labels, test_wine, model); 

%% 结果分析

figure;

hold on;

plot(test_wine_labels,'o');

plot(predict_label,'r*');

xlabel('测试集样本','FontSize',12);

ylabel('类别标签','FontSize',12);

legend('实际测试集分类','预测测试集分类');

title('测试集的实际分类和预测分类图','FontSize',12);

grid on;

 

%%%之后改变了不同的归一化进行再次实验

[dataset_scale,ps] = mapminmax(dataset',-1,1);

%%%改变不同的核函数进行实验

model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1 -t 0 ');

model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1 -t 1 ');

model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1 -t 2 ');

model = svmtrain(train_wine_labels, train_wine, '-c 2 -g 1 -t 3 ');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5

 进行随机的选取cg进行实验

%% 清空环境变量

function chapter13_GridSearch

close all;

clear;

clc;

format compact;

%% 数据提取

load chapter13_wine.mat;

选定训练集和测试集

train_wine = [wine(1:30,:);wine(60:95,:);wine(131:153,:)];

train_wine_labels = [wine_labels(1:30);wine_labels(60:95);wine_labels(131:153)];

test_wine = [wine(31:59,:);wine(96:130,:);wine(154:178,:)];

test_wine_labels = [wine_labels(31:59);wine_labels(96:130);wine_labels(154:178)]; 

%% 数据预处理

[mtrain,ntrain] = size(train_wine);

[mtest,ntest] = size(test_wine);

dataset = [train_wine;test_wine];

[dataset_scale,ps] = mapminmax(dataset',0,1);

dataset_scale = dataset_scale';

train_wine = dataset_scale(1:mtrain,:);

test_wine = dataset_scale( (mtrain+1):(mtrain+mtest),: );

%% 选择最佳的SVM参数c&g

bestc = 100*rand(1);

bestg = 200*rand(1)-100;

%% 利用最佳的参数进行SVM网络训练

cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];

model = svmtrain(train_wine_labels,train_wine,cmd);

%% SVM网络预测

[predict_label,accuracy,dec_values] = svmpredict(test_wine_labels,test_wine,model);

打印测试集分类准确率

total = length(test_wine_labels);

right = sum(predict_label == test_wine_labels);

disp('打印测试集分类准确率');

str = sprintf( 'Accuracy = %g%% (%d/%d)',accuracy(1),right,total);

disp(str);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%调用子函数进行选择%%%%%%%%%%%%%%%%%%

 % 首先进行粗略选择: c&g 的变化范围是 2^(-10),2^(-9),...,2^(10)

[bestacc,bestc,bestg] = SVMcgForClass(train_wine_labels,train_wine,-10,10,-10,10);

根据粗略选择的结果图再进行精细选择: c 的变化范围是 2^(-2),2^(-1.5),...,2^(4), g 的变化范围是 2^(-4),2^(-3.5),...,2^(4),

[bestacc,bestc,bestg] = SVMcgForClass(train_wine_labels,train_wine,-2,4,-4,4,3,0.5,0.5,0.9);

 %%%%%%%%%%%%%%5%%%%%%%%%%%%%%%%

对上证指数进行回归预测

 function chapter14

tic;

close all;

clear;

clc;

format compact;

load chapter14_sh.mat;

提取数据

[m,n] = size(sh);

ts = sh(2:m,1);

tsx = sh(1:m-1,:); 

数据预处理,将原始数据进行归一化

ts = ts';

tsx = tsx';

 [TS,TSps] = mapminmax(ts,1,2);  

TS进行转置,以符合libsvm工具箱的数据格式要求

TS = TS';

tsx进行归一化

[TSX,TSXps] = mapminmax(tsx,1,2);   

TSX进行转置,以符合libsvm工具箱的数据格式要求

TSX = TSX';

 

%% 选择回归预测分析最佳的SVM参数c&g

 

首先进行粗略选择

[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-8,8,-8,8); 

根据粗略选择的结果图再进行精细选择

[bestmse,bestc,bestg] = SVMcgForRegress(TS,TSX,-4,4,-4,4,3,0.5,0.5,0.05);

 

打印精细选择结果

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,decal_value] = svmpredict(TS,TSX,model);

predict = mapminmax('reverse',predict',TSps);

predict = predict';

 

打印回归结果

str = sprintf( '均方误差 MSE = %g 相关系数 R = %g%%',mse(2),mse(3)*100);

disp(str);

 

%% 结果分析

figure;

hold on;

plot(ts,'-o');

plot(predict,'r-^');

legend('原始数据','回归预测数据');

hold off;

title('原始数据和回归预测数据对比','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('开盘数','FontSize',12);

grid on;

 

figure;

error = predict - ts';

plot(error,'rd');

title('误差图(predicted data - original data)','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('误差量','FontSize',12);

grid on;

figure;

error = (predict - ts')./ts';

plot(error,'rd');

title('相对误差图(predicted data - original data)/original data','FontSize',12);

xlabel('交易日天数(1990.12.19-2009.08.19)','FontSize',12);

ylabel('相对误差量','FontSize',12);

grid on;

snapnow;

toc;

(5)结果分析

 

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

(6)未解决问题

遗传算法没弄明白

2 PSO寻找最佳参数没看懂

随机选取程序连续运行3次就会报错

4 print -dtiff -r600 result;是什么意思?

3参考文献

MATAB神经网络30个案例分析.史峰

Matlab中文论坛

SCDN论坛文章

下周工作

解决未知问题

学习SVM的信息粒化时序回归预测,看懂程序,并且做出结果

 

 

0 0