转载自: https://blog.csdn.net/fengsigaoju/article/details/52314885
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 |
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 |
代码如下:
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=X1W’-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=X1W’-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
结果还不错~~