数学建模常用模型25:支持向量机

支持向量机( support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik创建的统计学习理论( statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,最小化结构风险,提高了模型的泛化能力,且没有数据维数的限制。在进行线性分类时,将分类面取在离两类样本距离较大的地方;进行非线性分类时通过高维空间变换,将非线性分类变成高维空间的线性分类问题。

一般支持向量机分类采用的是线性可分 SVM,以下为模型概述。

                 数学建模常用模型25:支持向量机_第1张图片

                   数学建模常用模型25:支持向量机_第2张图片

                  数学建模常用模型25:支持向量机_第3张图片

 

案例①-线性可分 SVM

序号               fenlei.txt 列别
1 8.35 23.53 7.51 8.62 17.42 10 1.04 11.21 1
2 9.25 23.75 6.61 9.19 17.77 10.48 1.72 10.51 1
3 8.19 30.5 4.72 9.78 16.28 7.6 2.52 10.32 1
4 7.73 29.2 5.42 9.43 19.29 8.49 2.52 10 1
5 9.42 27.93 8.2 8.14 16.17 9.42 1.55 9.76 1
6 9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35 1
7 10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81 1
8 9.09 28.12 7.4 9.62 17.26 11.12 2.49 12.65 1
9 9.41 28.2 5.77 10.8 16.36 11.56 1.53 12.17 1
10 8.7 28.12 7.21 10.53 19.45 13.3 1.66 11.96 1
11 6.93 29.85 4.54 9.49 16.62 10.65 1.88 13.61 1
12 8.67 36.05 7.31 7.75 16.67 11.68 2.38 12.88 1
13 9.98 37.69 7.01 8.94 16.15 11.08 0.83 11.67 1
14 6.77 38.69 6.01 8.82 14.79 11.44 1.74 13.23 1
15 8.14 37.75 9.61 8.49 13.15 9.76 1.28 11.28 1
16 7.67 35.71 8.04 8.31 15.13 7.76 1.41 13.25 1
17 7.9 39.77 8.49 12.94 19.27 11.05 2.04 13.29 1
18 7.18 40.91 7.32 8.94 17.6 12.75 1.14 14.8 1
19 8.82 33.7 7.59 10.98 18.82 14.73 1.78 10.1 1
20 6.25 35.02 4.72 6.28 10.03 7.15 1.93 10.39 1
21 10.6 52.41 7.7 9.98 12.53 11.7 2.31 14.69 2
22 7.27 52.65 3.84 9.16 13.03 15.26 1.98 14.57 2
23 13.45 55.85 5.5 7.45 9.55 9.52 2.21 16.3 2
24 10.85 44.68 7.32 14.51 17.13 12.08 1.26 11.57 2
25 7.21 45.79 7.66 10.36 16.56 12.86 2.25 11.69 2
26 7.68 50.37 11.35 13.3 19.25 14.59 2.75 14.87 2
27 7.78 48.44 8 20.51 22.12 15.73 1.15 16.61 2
28 7.94 39.65 20.97 20.82 22.52 12.41 1.75 7.9 待分类
29 8.28 64.34 8 22.22 20.06 15.12 0.72 22.89 待分类
30 12.47 76.39 5.52 11.24 14.52 22 5.46 25.5 待分类


将数据录入文本文件中, 本程序将文本文件命名为“fenlei”
需要 SVM 函数工具箱才能运行

matlab代码如下:

clc, clear
a0=load('fenlei.txt'); %把表中 x1...x8 的所有数据保存在纯文本文件 fenlei.txt 中
a=a0'; b0=a(:,[1:27]); dd0=a(:,[28:end]); %提取已分类和待分类的数据
[b,ps]=mapstd(b0); %已分类数据的标准化
%mapstd 按行逐行地对数据进行标准化处理,
%将每一行数据分别标准化为均值为 ymean(默认为 0)、
%标准差为 ystd(默认为 1)的标准化数据,其计算公式是: y = (x-xmean)*(ystd/xstd) + ymean。
%如果设置的 ystd=0,或某行的数据全部相同(此时 xstd =0),
%存在除数为 0 的情况,则 Matlab 内部将此变换变为 y = ymean。
dd=mapstd('apply',dd0,ps); %待分类数据的标准化
group=[ones(20,1); 2*ones(7,1)]; %已知样本点的类别标号,即设置分类,
%本程序设置前 20 个为第一类, 21-27 为 2 类
s=svmtrain(b',group) %训练支持向量机分类器
sv_index=s.SupportVectorIndices %返回支持向量的标号(分类器)
beta=s.Alpha %返回分类函数的权系数(分类器)
bb=s.Bias %返回分类函数的常数项(分类器)
mean_and_std_trans=s.ScaleData %第 1 行返回的是已知样本点均值向量的相反数,
%第 2 行返回的是标准差向量的倒数(分类器)
check=svmclassify(s,b') %验证已知样本点
%将检验图画出,更直观些(可不画)
x=1:27;%样本数据有 27 个
a=group';
b=check';
axis([0,28,0,3]);%设置坐标轴范围
plot(x,a,'-o',x,b,'-*')
err_rate=1-sum(group==check)/length(group) %计算已知样本点的错判率
solution=svmclassify(s,dd') %对待判样本点进行分类

 

检验图

数学建模常用模型25:支持向量机_第4张图片

待分类 28, 29, 30 的分类情况为:

 数学建模常用模型25:支持向量机_第5张图片

案例②-线性可分 SVM

该程序为恶性肿瘤数据分类,由于数据较多, 大家在调试的时候请自行找数据,该案例程序与案例①相似

数学建模常用模型25:支持向量机_第6张图片

将以上数据录入文本文件中, 本程序将文本文件命名为“cancerdata”, 该数据第一列为编号,不用管, 第二列是 1 和-1, 指的是良性和恶性, 后面的就是各指标数据了
matlab代码如下:

clc,clear
a=load('cancerdata.txt');
a(:,1)=[]; %删除第一列病例号
gind=find(a(:,1)==1); %读出良性肿瘤的序号
bind=find(a(:,1)==-1); %读出恶性肿瘤的序号
training=a([1:500],[2:end]); %提出已知样本点的数据
training=training';
[train,ps]=mapstd(training); %已分类数据标准化
group(gind)=1; group(bind)=-1; %已知样本点的类别标号
group=group'; %转换成列向量
xa0=a([501:569],[2:end]); %提出待分类数据
xa=xa0'; xa=mapstd('apply',xa,ps); %待分类数据标准化
s=svmtrain(train',group, 'Method','SMO', 'Kernel_Function','quadratic') %使用序列最小化方法训
练支持向量机的分类器,
%如果使用二次规划的方法训练支持向量机则无法求解
sv_index=s.SupportVectorIndices' %返回支持向量的标号
beta=s.Alpha' %返回分类函数的权系数
b=s.Bias %返回分类函数的常数项
mean_and_std_trans=s.ScaleData %第 1 行返回的是已知样本点均值向量的相反数,
%第 2 行返回的是标准差向量的倒数
check=svmclassify(s,train'); %验证已知样本点
err_rate=1-sum(group==check)/length(group) %计算错判率
solution=svmclassify(s,xa'); %进行待判样本点分类
solution=solution'
sg=find(solution==1) %求待判样本点中的良性编号
sb=find(solution==-1) %求待判样本点中的恶性编号
%画图
y1=1;
y2=-1;
n=length(solution);
x=1:n;
plot(sg,y1,'r*',sb,y2,'bo',x,solution,'k-')
axis([0 n -1.5 1.5])

运行结果如下:

数学建模常用模型25:支持向量机_第7张图片

结果在矩阵 solution中:

 

你可能感兴趣的:(数学建模,算法)