SVM多分类问题 :matlab中的应用

转载自:https://blog.csdn.net/lwwangfang/article/details/52355062

对于支持向量机,其是一个二类分类器,但是对于多分类,SVM也可以实现。主要方法就是训练多个二类分类器。
一、多分类方式
1、一对所有(One-Versus-All OVA)
给定m个类,需要训练m个二类分类器。其中的分类器 i 是将 i 类数据设置为类1(正类),其它所有m-1个i类以外的类共同设置为类2(负类),这样,针对每一个类都需要训练一个二类分类器,最后,我们一共有 m 个分类器。对于一个需要分类的数据 x,将使用投票的方式来确定x的类别。比如分类器 i 对数据 x 进行预测,如果获得的是正类结果,就说明用分类器 i 对 x 进行分类的结果是: x 属于 i 类,那么,类i获得一票。如果获得的是负类结果,那说明 x 属于 i 类以外的其他类,那么,除 i 以外的每个类都获得一票。最后统计得票最多的类,将是x的类属性。
2、所有对所有(All-Versus-All AVA)
给定m个类,对m个类中的每两个类都训练一个分类器,总共的二类分类器个数为 m(m-1)/2 .比如有三个类,1,2,3,那么需要有三个分类器,分别是针对:1和2类,1和3类,2和3类。对于一个需要分类的数据x,它需要经过所有分类器的预测,也同样使用投票的方式来决定x最终的类属性。但是,此方法与”一对所有”方法相比,需要的分类器较多,并且因为在分类预测时,可能存在多个类票数相同的情况,从而使得数据x属于多个类别,影响分类精度。
对于多分类在matlab中的实现来说,matlab自带的svm分类函数只能使用函数实现二分类,多分类问题不能直接解决,需要根据上面提到的多分类的方法,自己实现。虽然matlab自带的函数不能直接解决多酚类问题,但是我们可以应用libsvm工具包。libsvm工具包采用第二种“多对多”的方法来直接实现多分类,可以解决的分类问题(包括C- SVC、n - SVC )、回归问题(包括e - SVR、n - SVR )以及分布估计(one-class-SVM )等,并提供了线性、多项式、径向基和S形函数四种常用的核函数供选择。

二、用libsvm在matlab中实现多分类(训练函数svmtrain+预测函数svmpredict)
对于libsvm中训练模型的函数svmtrain来说,model = svmtrain(训练数据类别, 训练数据, ‘一系列参数’);其中参数的形式如‘-c 2 -g 0.02’在这当中,参数主要包括以下几个方面:
(1) -s —— 其表示SVM的类型,包括上面提到的(默认值为0):
0 —— C-SVC
1—— v-SVC
2 —— 一类SVM
3 —— e -SVR
4 —— v-SVR
(2)-t—— 其表示核函数类型(默认值为2)
0 – 线性:u’v
1 – 多项式:(r*u’v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(r*u’v + coef0)
(3)核函数参数设置
-d ——核函数中的degree设置(针对多项式核函数)(默认3)
-g ——核函数中的gamma函数设置(针对多项式/rbf/sigmoid 核函数)(默认1/ k,k为特征值个数)
-r ——核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c ——设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n——设置nu-SVC,一类SVM和nu- SVR的参数(默认0.5)
-p ——设置e -SVR 中损失函数p的值(默认0.1)
-m ——设置cache内存大小,以MB为单位(默认40)
-e ——设置允许的终止判据(默认0.001)
-h ——是否使用启发式,0或1(默认1)
-b ——是否训练一个SVC或者SVR模型,0或1(默认0)
-wi ——设置第i类的参数C为weight*C(C-SVC中的C)(默认1)
-v——n-fold交互检验模式,n为fold的个数,必须大于等于2(训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差)

使用函数svmtrain训练分类模型后,会返回一个结构体,其中包括数据:
(1) parameters(一个5*1的数组)
第一个元素:-s,SVM的类型(int默认为0)
第二个元素:-t,核函数类型(默认为2)
第三个元素:-d,核函数中的degree设置(针对多项式核函数)(默认3);
     第四个元素:-g,核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认为类别数目的倒数);
第五个元素:-r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
(2)-nr_class: 表示数据集中有多少个类(int)
(3)-totalSV: 表示支持向量的总数。(int)
(4)-rho: 决策函数wx+b中的常数偏置的相反数(-b)。
(5)-Label: 表示数据集中类别的标签
(6)ProbA: 使用-b参数时用于概率估计的数值,否则为空。
ProbB: 使用-b参数时用于概率估计的数值,否则为空。
(7)-nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。
(8)-sv_coef: 表示每个支持向量在决策函数中的系数。
(9)-SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。
(10)nu: -n参数的显示
(11)iter: 迭代次数
(12)obj: 表示SVM文件转换的二次规划求解的最小值

svmpredict函数根据测试数据类属性,测试数据,以及通过svmtrain函数获得的模型来进行分类预测并计算分类精度,[predict_label, accuracy, dec_values]=svmpredict(测试数据类属性,测试数据,分类模型),返回值介绍如下:
(1)predicted_label:存储着分类后样本所对应的类属性。
(2)accuracy:一个3 * 1的数组,依次为:分类的正确率、回归的均方根误差、回归的平方相关系数。
(3)decision_values/prob_estimates:是一个表示概率的数组,对于一个m个数据,n个类的情况,如果指定“-b 1”参数(使用,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n * n×(n-1)/2的矩阵,每一行表示n(n-1)/2个二分类SVM的预测结果。

三、 使用libsvm进行分类的步骤
(1) 对数据做归一化(simple scaling)
对数据进行简单的缩放处理(scaling),缩放的最主要优点是能够避免大数值区间的属性过分支配了小数值区间的属性。另一个优点能避免计算过程中数值复杂度。(在试验中发现,归一化过程,分别对训练数据和测试数据进行归一化处理,比对训练数据和测试数据整体进行归一化处理获得的分类精度要高)
(2) 应用 RBF kernel
(3) 选择得到最优的c和g
c是惩罚因子,是一个在训练模型前需要自己设置的一个数值,它表示我们对类中的离群数据的重视程度,c的数值越大,表明我们越重视,越不想丢掉这些离群的数据;g是核函数中的gamma函数设置(针对多项式/rbf/sigmoid 核函数)(默认1/ k,k为特征值个数) 。c和g的选择对分类精度影响很大,在本文的试验中,用函数SVMcgForClass选择完成c和g的选择。
(4) 用得到的最优c和g训练分类模型
使用libsvm中的svmtrain函数来训练多分类模型
(5)测试
使用libsvm中的svmpredict函数来测试分类精度

四、实验
使用libsvm提供的数据进行多分类实验,下载的wine数据,是关于葡萄酒种类,下载的数据包括这里写图片描述三部分,分别是类数3,178个酒数据的13个属性列表,178个酒数据对应的类属性列表。代码如下:

function [ classfication ] = test( train,test )

load chapter12_wine.mat                       %下载数据

train=[wine(1:30,:);wine(60:95,:);wine(131:153,:)]; %选取训练数据
train_group=[wine_labels(1:30);wine_labels(60:95); wine_labels(131:153)];%选取训练数据类别标识
test=[wine(31:59,:);wine(96:130,:);wine(154:178,:)];%选取测试数据
test_group=[wine_labels(31:59);wine_labels(96:130); wine_labels(154:178)]; %选取测试数据类别标识

%数据预处理,用matlab自带的mapminmax将训练集和测试集归一化处理[0,1]之间
%训练数据处理
[train,pstrain] = mapminmax(train');
% 将映射函数的范围参数分别置为0和1
pstrain.ymin = 0;
pstrain.ymax = 1;
% 对训练集进行[0,1]归一化
[train,pstrain] = mapminmax(train,pstrain);
% 测试数据处理
[test,pstest] = mapminmax(test');
% 将映射函数的范围参数分别置为0和1
pstest.ymin = 0;
pstest.ymax = 1;
% 对测试集进行[0,1]归一化
[test,pstest] = mapminmax(test,pstest);
% 对训练集和测试集进行转置,以符合libsvm工具箱的数据格式要求
train = train';
test = test';

%寻找最优c和g
%粗略选择:c&g 的变化范围是 2^(-10),2^(-9),...,2^(10)
[bestacc,bestc,bestg] = SVMcgForClass(train_group,train,-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_group,train,-2,4,-4,4,3,0.5,0.5,0.9);

%训练模型
cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
model=svmtrain(train_group,train,cmd);
disp(cmd);

%测试分类
[predict_label, accuracy, dec_values]=svmpredict(test_group,test,model);

%打印测试分类结果
figure;
hold on;
plot(test_group,'o');
plot(predict_label,'r*');
legend('实际测试集分类','预测测试集分类');
title('测试集的实际分类和预测分类图','FontSize',10);
end


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

五、实验结果

这里写图片描述

这里写图片描述

六、问题
疑惑(1)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
上面的实验是参照libsvm 中的示例写的,最开始按照示例思路,但是在归一化时,自己是将训练数据和测试数据一起归一化的, 获得的精度只有61%,后来改为示例中的分别对训练数据和测试数据进行归一化后,精度就到了现在的88%,但是不理解造成此差异的原因,希望知道原因的朋友多多指教(代码如下(1)和(2))

1、训练数据和测试数据分别归一化到[0,1]代码(获得分类精度88%):

%训练数据处理
[train,pstrain] = mapminmax(train');
% 将映射函数的范围参数分别置为0和1
pstrain.ymin = 0;
pstrain.ymax = 1;
% 对训练集进行[0,1]归一化
[train,pstrain] = mapminmax(train,pstrain);

% 测试数据处理
[test,pstest] = mapminmax(test');
% 将映射函数的范围参数分别置为0和1
pstest.ymin = 0;
pstest.ymax = 1;
% 对测试集进行[0,1]归一化
[test,pstest] = mapminmax(test,pstest);
% 对训练集和测试集进行转置,以符合libsvm工具箱的数据格式要求
train = train';
test = test';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2、训练数据和测试数据整体归一化到[0,1]代码(获得分类精度61%):

[mtrain,ntrain]=size(train);
[mtest,ntest]=size(test);
dataset=[train;test];
[dataset_scale,ps]=mapminmax(dataset',0,1);
dataset_scale=dataset_scale';
train=dataset_scale(1:mtrain,:);
test=dataset_scale((mtrain+1):(mtrain+mtest),:);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

疑惑(2)!!!!!!!!!!!!!!!!!!!!!!!!!!!!
再有就是,对于c和g这两个数值有函数可以自动调优,但是在归一化时,如下面我要是把对训练数据和测试数据分别归一化的范围从[0,1]变成[0,4],获得的分类精度就从88%提高到了96%,这种归一化的范围又该怎么确定呢?

训练数据和测试数据分别归一化到[0,4]代码(获得分类精度96%):

%训练数据处理
[train,pstrain] = mapminmax(train');
% 将映射函数的范围参数分别置为0和4
pstrain.ymin = 0;
pstrain.ymax = 4;
% 对训练集进行[0,4]归一化
[train,pstrain] = mapminmax(train,pstrain);

% 测试数据处理
[test,pstest] = mapminmax(test');
% 将映射函数的范围参数分别置为0和4
pstest.ymin = 0;
pstest.ymax = 4;
% 对测试集进行[0,4]归一化
[test,pstest] = mapminmax(test,pstest);
% 对训练集和测试集进行转置,以符合libsvm工具箱的数据格式要求
train = train';
test = test';
  • 12
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1.版本:matlab2014/2019a,内含运行结果,不会运行可私信 2.领域:智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,更多内容可点击博主头像 3.内容:标题所示,对于介绍可点击主页搜索博客 4.适合人群:本科,硕士等教研学习使用 5.博客介绍:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可si信 ### 1 智能优化算法及应用 **1.1 改进智能优化算法方面(单目标和多目标)** **1.2 生产调度方面** 1.2.1 装配线调度研究 1.2.2 车间调度研究 1.2.3 生产线平衡研究 1.2.4 水库梯度调度研究 **1.3 路径规划方面** 1.3.1 旅行商问题研究(TSP、TSPTW) 1.3.2 各类车辆路径规划问题研究(vrp、VRPTW、CVRP) 1.3.3 机器人路径规划问题研究 1.3.4 无人机三维路径规划问题研究 1.3.5 多式联运问题研究 1.3.6 无人机结合车辆路径配送 **1.4 三维装箱求解** **1.5 物流选址研究** 1.5.1 背包问题 1.5.2 物流选址 1.5.4 货位优化 ##### 1.6 电力系统优化研究 1.6.1 微电网优化 1.6.2 配电网系统优化 1.6.3 配电网重构 1.6.4 有序充电 1.6.5 储能双层优化调度 1.6.6 储能优化配置 ### 2 神经网络回归预测、时序预测、分类清单 **2.1 bp预测和分类** **2.2 lssvm预测和分类** **2.3 svm预测和分类** **2.4 cnn预测和分类** ##### **2.5 ELM预测**和分类 ##### **2.6 KELM预测**和分类 **2.7 ELMAN预测和分类** ##### **2.8 LSTM预测**和分类 **2.9 RBF预测和分类** ##### 2.10 DBN预测和分类 ##### 2.11 FNN预测 ##### 2.12 DELM预测和分类 ##### 2.13 BIlstm预测和分类 ##### 2.14 宽度学习预测和分类 ##### 2.15 模糊小波神经网络预测和分类 ##### 2.16 GRU预测和分类 ### 3 图像处理算法 **3.1 图像识别** 3.1.1 车牌、交通标志识别(新能源、国内外、复杂环境下车牌) 3.1.2 发票、身份证、银行卡识别 3.1.3 人脸类别和表情识别 3.1.4 打靶识别 3.1.5 字符识别(字母、数字、手写体、汉字、验证码) 3.1.6 病灶识别 3.1.7 花朵、药材、水果蔬菜识别 3.1.8 指纹、手势、虹膜识别 3.1.9 路面状态和裂缝识别 3.1.10 行为识别 3.1.11 万用表和表盘识别 3.1.12 人民币识别 3.1.13 答题卡识别 **3.2 图像分割** **3.3 图像检测** 3.3.1 显著性检测 3.3.2 缺陷检测 3.3.3 疲劳检测 3.3.4 病害检测 3.3.5 火灾检测 3.3.6 行人检测 3.3.7 水果分级 **3.4 图像隐藏** **3.5 图像去噪** **3.6 图像融合** **3.7 图像配准** **3.8 图像增强** **3.9 图像压缩** ##### 3.10 图像重建 ### 4 信号处理算法 **4.1 信号识别** **4.2 信号检测** **4.3 信号嵌入和提取** **4.4 信号去噪** ##### 4.5 故障诊断 ##### 4.6 脑电信号 ##### 4.7 心电信号 ##### 4.8 肌电信号 ### 5 元胞自动机仿真 **5.1 模拟交通流** **5.2 模拟人群疏散** **5.3 模拟病毒扩散** **5.4 模拟晶体生长** ### 6 无线传感器网络 ##### 6.1 无线传感器定位 ##### 6.2 无线传感器覆盖优化 ##### 6.3 室内定位 ##### 6.4 无线传感器通信及优化 ##### 6.5 无人机通信继优化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值