SVM的matlab代码及SVM的多分类的作法

SVM是常用的一种有监督的学习模型(即给你一些输入特征,告诉你这些特征的样本是属于A类,再给你一些输入特征,告诉你这些特征的样本是属于B类,现在再来一些数据,来判断它们是属于哪一类)。

它与Kmeans的区别在于kmenas是无监督的学习模型,即kmeans不需要提前知道(训练),只要你把特征给我,我根据特征分就完事了.

它与Knn的区别在于knn来一个就算一次(和集合内的其余点进行比较),而SVM相当于一开始先把前期工作做好了(训练好),然后来一个我就根据带到训练的结果中一代就完事,

所以knn如果数据量太大或者维度太高就gg,因为我要与其数据集内比较(就算一些优化策略比较次数还是很多),而SVM有一种一劳永逸的感觉

线性SVM的一般流程:

1,数据标准化处理(减去平均值./标准差)

2,划出一个平面分割出所有的特征(也就是转化为规划模型求解)

3,训练结束后将待预测数据带入.

下面为一份训练集

我想根据资产折现力和盈利能力,活性来划分两个类别。


编号 资产折现力 盈利能力 活性 类别
1 0.9 0.34 1.53 1
2 0.88 0.23 1.67 1
3 0.92 0.28 1.43 1
4 0.89 0.14 1.24 1
5 0.78 0.35 1.8 1
6 0.81 0.26 2.01 1
7 0.72 0.18 1.75 1
8 0.93 0.22 0.99 1
9 0.82 0.26 1.4 1
10 0.78 0.26 1.34 -1
11 0.78 0.27 1.67 -1
12 0.72 0.18 1.53 -1
13 0.69 0.16 1.2 -1
14 0.63 0.15 0.88 -1
15 0.58 0.22 1.42 -1
16 0.81 0.18 1.59 -1
17 0.67 0.21 1.21 -1
18 0.65 0.16 1.37 -1
将数据存为SVM.xls,代码如下:

clc;
clear all;
X0=xlsread('SVM.xls','B2:E19');
for i=1:3%%%训练样本的输入数据
   X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
end
[m,n]=size(X);
e=ones(m,1);
D=[X0(:,4)];%%%训练样本的输出
B=zeros(m,m);
for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
end
A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
b=-e;
f=[0,0,0,0,ones(1,m)];
lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
x=linprog(f,A,b,[],[],lb);
W=[x(1,1),x(2,1),x(3,1)];
CC=x(4,1);
X1=[X(:,1),X(:,2),X(:,3)];
R1=X1*W'-CC;
R2=sign(R1);
disp('程序输出结果为:');
R=[R1,R2]
虽然有很小误差但是可以接受。

但是常见的并不是分为两类,比如葡萄酒那题分为4,5类怎么办(当然那题是无监督的,直接层次聚类或KEMANS就OK了)

假如我有三类要划分,他们是A、B、C。

  于是我在抽取训练集的时候,分别抽取

  (1)A所对应的向量作为正集(为1),B,C所对应的向量作为负集(剩下的分为-1);

  (2)B所对应的向量作为正集,A,C所对应的向量作为负集;

  (3)C所对应的向量作为正集,A,B所对应的向量作为负集;

   使用这三个训练集分别进行训练,然后的得到三个训练结果文件。

  在测试的时候,把对应的测试向量分别利用这三个训练结果文件进行测试。

  最后每个测试都有一个结果f1(x),f2(x),f3(x).

  于是最终的结果便是这四个值中最大的一个作为分类结果。

也就是说流程如下:

1,将数据整理成三个xls

2,对于第i个xls代表输入第i类的测试集,属于第i类的就标记结果为1,剩下的为-1.

3,每一个均划分平面

4,带入预测数据.

5,对于每一个预测数据取最大的那个xls的值作为结果,也就是说它属于第i类。

新的数据集如下:

编号 资产折现力 盈利能力 活性 类别
1 0.9 0.34 1.53 1
2 0.88 0.23 1.67 1
3 0.92 0.28 1.43 1
4 0.89 0.14 1.24 1
5 0.78 0.35 1.8 1
6 0.81 0.26 2.01 1
7 0.72 0.18 1.75 2
8 0.93 0.22 0.99 2
9 0.82 0.26 1.4 2
10 0.78 0.26 1.34 2
11 0.78 0.27 1.67 2
12 0.72 0.18 1.53 2
13 0.69 0.16 1.2 3
14 0.63 0.15 0.88 3
15 0.58 0.22 1.42 3
16 0.81 0.18 1.59 3
17 0.67 0.21 1.21 3
18 0.65 0.16 1.37 3
将数据处理后分别存入SVM2.xls,SVM3.xls,SVM4.xls

代码如下:


clc;
clear all;
X0=xlsread('SVM2.xls','B2:E19');
for i=1:3%%%训练样本的输入数据
   X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
end
[m,n]=size(X);
e=ones(m,1);
D=[X0(:,4)];%%%训练样本的输出
B=zeros(m,m);
for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
end
A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
b=-e;
f=[0,0,0,0,ones(1,m)];
lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
x=linprog(f,A,b,[],[],lb);
W=[x(1,1),x(2,1),x(3,1)];
CC=x(4,1);
X1=[X(:,1),X(:,2),X(:,3)];
R1=X1*W'-CC;
R=R1;

%%%处理表二
X0=xlsread('SVM3.xls','B2:E19');
for i=1:3%%%训练样本的输入数据
   X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
end
[m,n]=size(X);
e=ones(m,1);
D=[X0(:,4)];%%%训练样本的输出
B=zeros(m,m);
for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
end
A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
b=-e;
f=[0,0,0,0,ones(1,m)];
lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
x=linprog(f,A,b,[],[],lb);
W=[x(1,1),x(2,1),x(3,1)];
CC=x(4,1);
X1=[X(:,1),X(:,2),X(:,3)];
R1=X1*W'-CC;
R=[R,R1];


%%%处理表三
X0=xlsread('SVM4.xls','B2:E19');
for i=1:3%%%训练样本的输入数据
   X(:,i)=(X0(:,i)-mean(X0(:,i)))/std(X0(:,i));%%%标准化处理
end
[m,n]=size(X);
e=ones(m,1);
D=[X0(:,4)];%%%训练样本的输出
B=zeros(m,m);
for i=1:m
    B(i,i)=1;
    C(i,i)=D(i,1);
end
A=[-X(:,1).*D,-X(:,2).*D,-X(:,3).*D,D,-B];
b=-e;
f=[0,0,0,0,ones(1,m)];
lb=[-inf,-inf,-inf,-inf,zeros(1,m)]';
x=linprog(f,A,b,[],[],lb);
W=[x(1,1),x(2,1),x(3,1)];
CC=x(4,1);
X1=[X(:,1),X(:,2),X(:,3)];
R1=X1*W'-CC;
R=[R,R1];
for i=1:size(R,1)
[c,d]=max(R(i,:));
t(i,1)=c;
t(i,2)=d;%%%判断属于哪一个类别
end
disp('输出结果为:');
t

t =

   91.4813    1.0000
  105.2576    1.0000
   91.4428    1.0000
    5.0052    1.0000
   10.0521    1.0000
  105.9796    1.0000
   -0.7916    2.0000
    0.5677    2.0000
   -0.7547    2.0000
   -1.0000    3.0000
   -1.2244    2.0000
   -0.3183    3.0000
    1.1881    3.0000
    2.9200    3.0000
    1.2706    3.0000
   -0.0850    2.0000
    1.0000    3.0000
    1.1044    3.0000

结果还不错~~



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengsigaoju/article/details/52314885
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭