SVM输出分类概率的matlab实现

说明:
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(r
u’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列。
在这里插入图片描述
在这里插入图片描述

### 回答1: SVM分类预测是指在SVM算法的基础上,对于多个类别的分类任务进行预测。MATLAB作为一种常用的科学计算软件,也提供了相应的SVM分类预测函数。 首先,需要准备好带标签的训练数据集和测试数据集,用于训练和测试模型。然后,可以使用MATLAB中的fitcecoc函数来建立多分类SVM模型。fitcecoc函数的主要输入参数包括训练数据集和对应标签,SVM模型类型,以及其他相关参数,例如惩罚参数、核函数等。 建立好模型之后,可以使用predict函数来对测试数据进行预测。predict函数会返回每个测试数据属于哪个类别的概率值,在多分类情况下,概率值最大的类别即为预测结果。 具体的代码实现步骤如下: 1. 准备训练数据集和测试数据集。 2. 建立多分类SVM模型: svmModel = fitcecoc(trainData, trainLabel, 'KernelFunction', 'linear', 'Coding', 'onevsall', 'Verbose', 2); 其中,trainData是训练数据集,trainLabel是对应的标签信息,'KernelFunction'参数指定核函数为线性核,'Coding'参数指定使用one-vs-all方法进行多分类,'Verbose'参数为2表示输出详细的训练过程信息。 3. 使用模型进行预测: predictResult = predict(svmModel, testData); 其中,svmModel是已经建立好的SVM模型,testData是测试数据集,predictResult是预测结果。 需要注意的是,SVM模型的性能很大程度上取决于参数的选择和调整。如果模型的预测效果不佳,可以尝试调整参数来进行优化。例如,可以通过交叉验证等方法来选择合适的惩罚参数和核函数类型。 ### 回答2: SVM(支持向量机)是常见的分类算法之一,可以用于二分类和多分类问题。在MATLAB中,可以使用Classification Learner App来自动生成支持向量机分类器的代码,也可以手动编写代码实现SVM分类预测的MATLAB代码如下: 1. 数据准备和预处理 首先需要准备数据集,将其划分为训练集和测试集,并进行数据预处理。 load fisheriris %导入数据 inds = ~strcmp(species,'setosa'); %将setosa类别排除在外,保留versicolor和virginica X = meas(inds,:); %获取特征向量数据 Y = species(inds); %获取标签数据 cvp = cvpartition(Y,'holdout',0.25); %将数据分为训练集和测试集 Xtrain = X(cvp.training,:); Ytrain = Y(cvp.training,:); Xtest = X(cvp.test,:); Ytest = Y(cvp.test,:); 2. SVM训练和预测 接着,需要定义SVM分类器的参数,并训练多分类SVM模型。 SVMmdl = fitcecoc(Xtrain,Ytrain,'KernelFunction','rbf','Standardize',true); %定义SVM分类器参数,训练多分类SVM模型 最后,使用测试集进行预测,并计算预测结果的准确率。 Ypred = predict(SVMmdl,Xtest); %使用测试集进行预测 accuracy = sum(Ypred==Ytest)/numel(Ytest) %计算预测结果的准确率 完整代码如下: %% 多分类SVM预测代码 % 数据准备和预处理 load fisheriris %导入数据 inds = ~strcmp(species,'setosa'); %将setosa类别排除在外,保留versicolor和virginica X = meas(inds,:); %获取特征向量数据 Y = species(inds); %获取标签数据 cvp = cvpartition(Y,'holdout',0.25); %将数据分为训练集和测试集 Xtrain = X(cvp.training,:); Ytrain = Y(cvp.training,:); Xtest = X(cvp.test,:); Ytest = Y(cvp.test,:); % SVM训练和预测 SVMmdl = fitcecoc(Xtrain,Ytrain,'KernelFunction','rbf','Standardize',true); %定义SVM分类器参数,训练多分类SVM模型 Ypred = predict(SVMmdl,Xtest); %使用测试集进行预测 accuracy = sum(Ypred==Ytest)/numel(Ytest) %计算预测结果的准确率 以上就是SVM分类预测的MATLAB代码。需要注意的是,代码中使用的是径向基函数(RBF)作为核函数,也可以使用其他的核函数如线性核函数、多项式核函数等。此外,还可以通过调整模型参数和优化算法来提高预测准确率,这需要根据具体问题进行调整。 ### 回答3: SVM(支持向量机)是一种用于二分类或多分类机器学习算法,它通过将数据映射到高维空间中进行分类。在MATLAB中,SVM分类预测可以通过以下步骤实现: 1. 准备数据集:首先,需要准备一个包含标签和特征值的数据集。标签指数据集中的每个数据所属的类别,特征值指用来分辨不同类别的一些特征。在MATLAB中,可以使用table或array来表示数据集。 2. 拆分数据集:为了训练模型并测试其准确性,需要将数据集拆分成训练集和测试集。在MATLAB中,可以使用cvpartition函数将数据集拆分成训练集和测试集。 3. 训练SVM分类器:接下来,需要使用fitcecoc函数创建一个SVM分类器。fitcecoc函数允许使用一对一方法将多分类问题转化为多个二分类问题,并使用支持向量机来解决这些二分类问题。 4. 预测新的数据:使用predict函数可以对新的数据进行分类预测。预测结果是一个向量,包含数据集中每个数据的分类结果。 下面是一个简单的SVM分类预测MATLAB代码示例: ```matlab % 准备数据集 data = readtable('data.csv'); labels = data(:,end); features = data(:,1:end-1); % 拆分数据集 cv = cvpartition(size(data,1),'HoldOut',0.3); train_data = features(training(cv),:); train_labels = labels(training(cv),:); test_data = features(test(cv),:); test_labels = labels(test(cv),:); % 训练SVM分类svm_model = fitcecoc(train_data,train_labels); % 预测新的数据 predicted_labels = predict(svm_model,test_data); accuracy = sum(predicted_labels == test_labels)/numel(test_labels); disp(['分类准确率为:',num2str(accuracy)]); ``` 代码中,我们首先使用readtable函数读取数据文件,并将标签和特征值分别存储在labels和features变量中。然后,我们使用cvpartition函数将数据集拆分成训练集和测试集。根据一般惯例,我们将数据集拆分成70%的训练集和30%的测试集。接下来,我们使用fitcecoc函数创建一个SVM分类器,并使用训练集中的数据进行训练。最后,我们使用predict函数对测试集中的数据进行分类预测,并计算分类准确率。 需要注意的是,SVM算法的性能很大程度上依赖于特征选择和参数调整。通常需要对不同的特征选择和参数组合进行试验来找到最佳方案。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值