1.前言:SVM属于机器学习的一个大类,善于做数据分类和回归。
由于项目的需要,重新学习和整理了SVM在数据分类和回归中的运用:
对于新手,这里不再赘述SVM理论知识,目前有这几篇优秀的SVM理论解释博客,避免重复造轮子,
主要篇幅用于讲解SVM的一个实例,及其在MATLAB环境中调用libSVM的一个例子:
1.机器学习中的算法(2)-支持向量机(SVM)基础 - LeftNotEasy - 博客园】 https://www.cnblogs.com/LeftNotEasy/archive/2011/05/02/basic-of-svm.html
这篇博客讲解SVM原理很是通俗易懂,但是还是有几个点没有补充,比如
2.拉格朗日乘数法中的第三种优化情况KKT,。
.深入理解机器学习中拉格朗日乘子和KKT条件 https://blog.csdn.net/u014675538/article/details/77509342
3.核函数(Kernel Function)与SVM的联系 及核函数的来源,作用等 https://blog.csdn.net/bitcarmanlee/article/details/77604484,
这篇博客第5部分视频的连接讲解非常清晰的表达了SVM的分类原理及核函数的作用。
有了以上的理论基础便可以上实例了:
2.SVM分类的一个MATLAB实例
一、实验目的
1.掌握支持向量机(SVM)的原理、核函数类型选择以及核参数选择原则等;
2.熟悉基于libSVM二分类的一般流程与方法;
二、实验内容
1.对“bedroom, forest”两组数据进行分类(二分类);
2.得到试验分类准确率;
三、实验条件
1.LibSVM软件包,3.17版本;
2. Matlab 2013a。
四、实验方法与流程
(1) 试验流程:
Step1: 根据给定的数据,选定训练集和测试集;
Step2: 为训练集与测试集选定标签集;
Step3: 利用训练集进行训练分类器得到model;
Step4: 根据model,对测试集进行测试集得到accuracyrate;
(2) 实验数据准备:
“bedroom.mat”10*15的矩阵,分别代表了不同的十张有关于bedroom的图片的15维属性;
“forest.mat”10*15矩阵,分别代表了不同的十张有关于forest的图片的15维属性特征;
训练集:trainset(); 分别取bedroom(1:5,:)和forse(1:5,:)作为训练集;
测试集:testset(); 分别取bedroom(6:10,:)和forse(6:10,:)作为测试集;
标签集:label(); 取bedroom的数据为正类标签为1;forse的数据为负类标签为-1.
(3) Matlab程序与实验结果:
数据集下载:
实验数据集说明,这里有关于森林和卧室图片抽取的有15个维度特征的数据集
链接:https://pan.baidu.com/s/1RRdaWgqFW2bjYE72PazNQg
提取码:ocym
目的是:利用LibSVM包将它们进行分类。
以下是实验代码:
clc;clear;
%读入数据
%实验说明,这里有关于森林和卧室图片的15个维度特征的数据集,目的是:利用LibSVM包将它们进行分类
%需要标签数据集
bedroom_=load('bedroom.mat');
forest_=load('forest.mat');
labelset_=load('labelset.mat');
label_=[ones(10,1);zeros(10,1)];
% 训练集:trainset(); 分别取bedroom(1:5,:)和forse(1:5,:)作为训练集;
% 测试集:testset(); 分别取bedroom(6:10,:)和forse(6:10,:)作为测试集;
% 标签集:label(); 取bedroom的数据为正类标签为1;forse的数据为负类标签为-1.
%组成训练集
P_train=[bedroom_.bedroom(1:5,:);forest_.MITforest(1:5,:)];
P_label=[label_(1:5);label_(11:15)];
T_test=[bedroom_.bedroom(6:10,:);forest_.MITforest(6:10,:)];
T_label=[label_(6:10);label_(16:20)];
%数据预处理,归一化
[mtrain ntrain]=size(P_train);
[mtest ntest]=size(T_test);
dataset=[P_train;T_test];
[dataset_scale ps]=mapminmax(dataset',0,1);
dataset_scale = dataset_scale';
train_set = dataset_scale(1:mtrain,:);
test_set = dataset_scale((mtrain+1):(mtrain+mtest),:);
% SVM 怎样能得到好的结果
% 1. 对数据做归一化(simple scaling)
% 2. 应用 RBF kernel
% 3. 用cross-validation和grid-search 得到最优的c和g
% 4. 用得到的最优c和g训练训练数据
% 5. 测试
%SVM训练
%SVM训练函数的参数意义
% model.Parameters参数意义从上到下依次为:
% -s svm类型:SVM设置类型(默认0)
% -t 核函数类型:核函数设置类型(默认2)
% -d degree:核函数中的degree设置(针对多项式核函数)(默认3)
% -g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数)
% -r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
% model=svmtrain(P_label,train_set,'-s 2 -c 1 -g 0.07');%-s参数选2结果不对
model = svmtrain(P_label,train_set, '-s 1 -c 1 -g 0.07');%-s参数可选0或1
%SVM网络预测
[result_label]=svmpredict(T_label,test_set,model);
%% 结果分析
% 测试集的实际分类和预测分类图
% 通过图可以看出只有一个测试样本是被错分的
figure;
hold on;
plot(T_label,'bo');
plot(result_label,'r*');
xlabel('测试集样本','FontSize',12);
ylabel('类别标签','FontSize',12);
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',12);
grid on;
其结果为:可以看出结果比较理想。
3.MATLAB中如何调用libSVM317安装包
安装包下载,其支持C++,Python,matlab,java等多种语言,非常好用
https://download.csdn.net/download/weixin_40405758/10745018
libsvm是由台湾大学林智仁(Lin Chih-Jen)教授开发的一款简单易用、快速有效的SVM模式识别与回归的软件包。这套库运算速度还是挺快的,可以很方便的对数据做分类或回归。由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库。
libsvm不但提供了编译好的可在Windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其它操作系统上应用;libsvm对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross Validation)的功能,可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
libsvm软件包介绍
下载软件压缩包,解压,可以看到libsvm可分为6个文件夹和一些c++源码文件,其详细说明如下:
1、Java——主要是应用于java平台;
2、Python——是用来参数优选的工具,稍后介绍;
3、svm-toy——一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows文件夹下;
4、tools——主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy),数据检查(checkdata);
5、windows——包含libSVM四个exe程序包,我们所用的库就是他们,里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的。
6、matlab——里面是C++编写的一些文件,但是不能在MATLAB中直接调用,而是要将其中的c文件通过编译后生成MATLAB可调用的文件,这里需要说明几点:
1.MATLAB版本最好在2013以上,最好安装有VS2012或者VS2013,如果版本不支持,可以参考下面的链接文章
2.请记得将当前你存放的文件目录添加到MATLAB路径中,操作如下:
首先按下图找到设置路径,弹出路径添加框
其次在弹出的框中按添加文件夹项,将路径添加进来后直接保存。
3.在命令窗口中运行make.m,这个文件程序会自动将其编译完成,如下图,这时可以调用trainsvm()函数。
4.具体配置细节可以参考以下:
1.LibSVM 在matlab中的使用 https://blog.csdn.net/abcjennifer/article/details/7370177
2.MATLAB利用SVM分类和回归:[1]libsvm的安装
https://jingyan.baidu.com/article/46650658048c3ff549e5f8c5.html