%% 针对于含容差器件建立SVM----1VSR
clc;clear
load('C:\Users\lenovo\Desktop\CodeOfGra\Data-Train-CV-Test\S9\ClusterList_Train.mat')
load('C:\Users\lenovo\Desktop\CodeOfGra\Data-Train-CV-Test\S9\ClusterList_CV.mat')
load('C:\Users\lenovo\Desktop\CodeOfGra\Data-Train-CV-Test\S9\ClusterList_Test.mat')
%% 训练
totalClassifiyNum=length(ClusterList_Train);
for i=1:totalClassifiyNum
%构建训练数据
trainData{1,i}=ClusterList_Train{1,i}{1,1}(:,:);%1类
len_Train_i=length(ClusterList_Train{1,i}{1,2});
trainClass{1,i}=[];
for k=1:len_Train_i
trainClass{1,i}=[trainClass{1,i};num2str(i)];%类的标号就按照聚类后样本所在的簇数
end
for j=1:totalClassifiyNum
if j~=i %R类
trainData{1,i}=[trainData{1,i};ClusterList_Train{1,j}{1,1}(:,:)];
len_Train_j=length(ClusterList_Train{1,j}{1,2});
for k=1:len_Train_j
trainClass{1,i}=[trainClass{1,i};'R'];%类的标号就按照聚类后样本所在的簇数
end
end
end
%使用训练数据,进行SVM模型训练
totalSVM{1,i}= svmtrain(trainData{1,i},trainClass{1,i},'kernel_function','rbf');
end
save totalSVM totalSVM
%构建数据集
TrainDataOnTest=[];
TrainClassOnTest=[];
CVData=[];
CVClass=[];
TestData=[];
TestClass=[];
for i=1:totalClassifiyNum
%构建测试用的训练数据
TrainDataOnTest=[TrainDataOnTest;ClusterList_Train{1,i}{1,1}(:,:)];
len_Train=length(ClusterList_Train{1,i}{1,2});
TrainClassOnTest=[TrainClassOnTest;ones(len_Train,1)*i];
%构建CV数据
CVData=[CVData;ClusterList_CV{1,i}{1,1}(:,:)];
len_CV=length(ClusterList_CV{1,i}{1,2});
CVClass=[CVClass;ones(len_CV,1)*i];%类的标号就按照聚类后样本所在的簇数
%构建测试数据
TestData=[TestData;ClusterList_Test{1,i}{1,1}(:,:)];
len_Test=length(ClusterList_Test{1,i}{1,2});
TestClass=[TestClass;ones(len_Test,1)*i];%类的标号就按照聚类后样本所在的簇数
end
%% 测试
%基于训练数据的测试
RecRate_Train=useSVNModel_1VSR(TrainDataOnTest,TrainClassOnTest,totalSVM);
sprintf('自测试的训练误差是 %3.3f',RecRate_Train)
%基于CV的测试
RecRate_CV=useSVNModel_1VSR(CVData,CVClass,totalSVM);
sprintf('CV数据集在测试中的误差是 %3.3f',RecRate_CV)
%基于测试数据的测试
RecRate_Test=useSVNModel_1VSR(TestData,TestClass,totalSVM);
sprintf('测试数据集在测试中的误差是 %3.3f',RecRate_Test)
%% svmtrain、svmclassify仅适用于二分类
%SVMStruct = svmtrain(Training,Group,Name,Value),其输入参数为(训练数据,训练数据相应组属性,可选参数名,可选参数的值),输出为一个结构体。
%1、kernel_function(核函数类型):可选的核函数有linear,quadratic,polynomial,rbf,mlp,@kfun ,如果不设置核函数类型,那么默认的选用线性核函数linear。
%2、showplot(绘图):是一个布尔值,用来指示是否绘制分类数据(这里是训练数据)和分类线。但是这个绘图功能只支持绘制有两个特征值的数据,也就是二维的点数据。
%(默认为false),在svmtrain函数中,如果将showplot设置为true,程序会自动在figure中用不同的颜色绘制出训练数据中两个类的点以及通过训练数据获得的分类线,并标注出哪些点是支持向量。
%3、boxconstraint:svmtrain函数输出的结构体中包含训练出的分类器的信息,包括支持向量机,偏置b的值等等。
%svmclassify函数,其实一个应用训练的分类模型和测试数据进行分类测试的函数:
%Group = svmclassify(SVMStruct,Sample,’Showplot’,true),其最多只有这四个输入参数,包括(训练出的分类模型结构体,测试数据,绘图显示,’true’)。
%在svmclassify函数中用Showplot绘图,会绘制出svmclassify函数中输入的测试数据点,如下图所示,粉色的+为被分到类1中的测试数据,蓝色星号是被分到类2中的测试数据)