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

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

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

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

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

线性SVM的一般流程:

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

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

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

下面为一份训练集

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


编号资产折现力盈利能力活性类别
10.90.341.531
20.880.231.671
30.920.281.431
40.890.141.241
50.780.351.81
60.810.262.011
70.720.181.751
80.930.220.991
90.820.261.41
100.780.261.34-1
110.780.271.67-1
120.720.181.53-1
130.690.161.2-1
140.630.150.88-1
150.580.221.42-1
160.810.181.59-1
170.670.211.21-1
180.650.161.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类。

新的数据集如下:

编号资产折现力盈利能力活性类别
10.90.341.531
20.880.231.671
30.920.281.431
40.890.141.241
50.780.351.81
60.810.262.011
70.720.181.752
80.930.220.992
90.820.261.42
100.780.261.342
110.780.271.672
120.720.181.532
130.690.161.23
140.630.150.883
150.580.221.423
160.810.181.593
170.670.211.213
180.650.161.373
将数据处理后分别存入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

结果还不错~~



评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值