支持向量机( support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik创建的统计学习理论( statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,最小化结构风险,提高了模型的泛化能力,且没有数据维数的限制。在进行线性分类时,将分类面取在离两类样本距离较大的地方;进行非线性分类时通过高维空间变换,将非线性分类变成高维空间的线性分类问题。
一般支持向量机分类采用的是线性可分 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') %对待判样本点进行分类
检验图
待分类 28, 29, 30 的分类情况为:
该程序为恶性肿瘤数据分类,由于数据较多, 大家在调试的时候请自行找数据,该案例程序与案例①相似
将以上数据录入文本文件中, 本程序将文本文件命名为“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])
运行结果如下:
结果在矩阵 solution中: