说明:
1):数据的标签在最后一列
2):tr:训练数据,te:测试数据
3):svm的参数说明:
-s svm类型:SVM设置类型(默认0)
0 — C-SVC; 1 –v-SVC; 2 – 一类SVM; 3 — e-SVR; 4 — v-SVR
-t 核函数类型:核函数设置类型(默认2)
0 – 线性核函数:u’v
1 – 多项式核函数:(ru’v + coef0)^degree
2 – RBF(径向基)核函数:exp(-r|u-v|^2)
3 – sigmoid核函数:tanh(ru’v + coef0)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,k为总类别数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
-c cost:设置C-SVC,e -SVR和v-SVR的参数(损失函数)(默认1)
-n nu:设置v-SVC,一类SVM和v- SVR的参数(默认0.5)
-p p:设置e -SVR 中损失函数p的值(默认0.1)
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e eps:设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
-v n: n-fold交互检验模式,n为fold的个数,必须大于等于2
4):为什么三行代码就已经出结果了,我下面还一阵乱操作?因为输出概率的排序并不是按照标签排序的,所以又操作了一番
ad:新手上路,变量使用得乱七八糟,也没有做好分段,注释
function [TestingAccuracy,predicted_label,Scores]=SVM1(tr,te)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:输出分类概率的SVM SVM1.m
%%入口参数:训练数据 tr (每一行是一个样本,标签在最后一列) 测试数据 te (同tr)
%%出口参数:测试精度 TestingAccuracy 预测标签 predicted_label 概率 Scores
%%函数功能说明:
%%基于libsvm工具包,完成对分类概率的输出
%%Scores的第一列对应着标签1的概率,第二列对应着标签2的概率,……最后一列是最大概率对应的标签
%%by SebastianLi, At ZZU, December 25th, 2020
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
model = svmtrain(tr(:,end), tr(:,1:end-1), '-c 1 -g 0.07 -t 0 -b 1 -q'); % 如果需要查看计算过程,删去'-q'
[predicted_label, TestingAccuracy,Scores] = svmpredict(te(:,end), te(:,1:end-1), model,'-b 1');
TestingAccuracy=TestingAccuracy(1)./100;
% 以下过程是将分类的概率与标签对应
p=[];
zhonglei=size(unique(tr(:,end)),1);
for i=1:size(te,1)
[~,b]=max(Scores(i,1:zhonglei));
p(i,:)=[predicted_label(i),b];
end
s=sortrows(p,1);
A2=[];
ss=unique(predicted_label);
ll=size(ss,1);
for j=1:ll
s1=find(s(:,1)==ss(j,1));
s2=s1(1);
A2(j,1)=ss(j,1);
A2(j,2)=s(s2,2);
end
scores=[];
for k=1:size(A2,1)
scores(:,k)=Scores(:,A2(k,2)); %注意大小写
end
Scores=[scores,predicted_label];
end
补充:
当分类标签是按照1,2,3,4等正常排列时,predicted_label所对应的scores的列,即为标签和对应标签的概率。如图:
当分类标签并不是按照1,2,3,4正常排列,而是异常排列,例如:2,4,5,6等。标签和概率对应的关系是列数应该是label_i在unique(lable)的对应索引。如下图,第一行的标签为18,在unique(lable)的索引为16,所以最大概率出现在第16列。