博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python实现SVM
阅读量:6360 次
发布时间:2019-06-23

本文共 5207 字,大约阅读时间需要 17 分钟。

一、概述

    支持向量机(SVM)是一系列可用于分类、回归和异常值检测的有监督学习方法。

优点:

    在高维空间中行之有效。

    当维数大于样本数时仍然可用。

    在决策函数中只使用训练点的一个子集(称为支持向量),大大节省了内存开销。

    用途广泛:决策函数中可以使用不同的核函数。提供了一种通用的核,但是也可以指定自定义的核。

劣势:

    如果特征数量远大于样本数量,则表现会比较差。

    SVM不直接提供概率估计。这个值通过五折交叉验证计算,代价比较高

二、分类

   要在数据集上进行多类别分类,可以使用SVC,NuSVC和LinearSVC这三个类。 SVC和NuSVC两种方法类似,但是接受的参数有细微不同,而且底层的数学原理不一样。另一方面,LinearSVC是对支持向量分类的另一种实现,使用了线性核。注意LinearSVC不接受关键字kernel,因为核被预设为是线性的。其与SVC和NuSVC相比还缺少了一些成员,如support_。

    和其它分类器一样,SVC,NuSVC和LinearSVC接受两个数组:大小为[n_samples, n_features]的数组X,包含训练样本;以及大小为[n_samples]的数组y,包含类别标签(以字符串类型或整型存储)

二分类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sklearn
sklearn svm
 
(,sklearn.)
 
= 
[[, ], [, ],[
-
,
-
]]
= 
[,,]
clf 
= 
svm.SVC()
(clf.fit(X, y))
result
=
clf.predict([[, ],[,
-
]])
(result)
(clf.support_vectors_)
(clf.support_ )
(clf.n_support_)

输出:

sklern version: 0.18.1

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape=None, degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

[1 1]

[[ 0.  0.]

 [-1. -1.]

 [ 1.  1.]]

[0 2 1]

[2 1]

多分类:

    SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;另一类是间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。 

    a.一对多法(one-versus-rest,简称1-v-r SVMs)。训练时依次把某个类别的样本归为一类,其他剩余的样本归为另一类,这样k个类别的样本就构造出了k个SVM。分类时将未知样本分类为具有最大分类函数值的那类。 

    b.一对一法(one-versus-one,简称1-v-1 SVMs)。其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。Libsvm中的多类分类就是根据这个方法实现的。 

    c.层次支持向量机(H-SVMs)。层次分类法首先将所有类别分成两个子类,再将子类进一步划分成两个次级子类,如此循环,直到得到一个单独的类别为止。

对c和d两种方法的详细说明可以参考论文《支持向量机在多类分类问题中的推广》(计算机工程与应用。2004) 

    d.其他多类分类方法。除了以上几种方法外,还有有向无环图SVM(Directed Acyclic Graph SVMs,简称DAG-SVMs)和对类别进行二进制编码的纠错编码SVMs。 

    为了提供一个和其它分类器一致的接口,选项decision_function_shape允许调用者将所有“一对一”分类器的结果聚合进一个(n_samples, n_classes)的决策函数。

SVC参数解释: 

(1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0; 

(2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF"; 

(3)degree:if you choose 'Poly' in param 2, this is effective, degree决定了多项式的最高次幂; 

(4)gamma:核函数的系数('Poly', 'RBF' and 'Sigmoid'), 默认是gamma = 1 / n_features; 

(5)coef0:核函数中的独立项,'RBF' and 'Poly'有效; 

(6)probablity: 可能性估计是否使用(true or false); 

(7)shrinking:是否进行启发式; 

(8)tol(default = 1e - 3): svm结束标准的精度; 

(9)cache_size: 制定训练所需要的内存(以MB为单位); 

(10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应; 

(11)verbose: 跟多线程有关,不大明白啥意思具体; 

(12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited; 

(13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多  or None 无, default=None 

(14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。 

注意:(7),(8),(9)一般不考虑。 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import 
sklearn
from 
sklearn 
import 
svm
 
= 
[[
0
], [
1
], [
2
], [
3
]]
= 
[
0
1
2
3
]
# 一对一方法
clf 
= 
svm.SVC(decision_function_shape
=
'ovo'
)
print
(clf.fit(X, Y))
dec 
= 
clf.decision_function(`
1
`)
print
(
"一对一方法SVM个数:"
,dec.shape[
1
]) 
# 4 classes: 4*3/2 = 6
# 一对多方法
clf.decision_function_shape 
= 
"ovr"
dec 
= 
clf.decision_function(`
1
`)
print
(
"一对多方法SVM个数:"
,dec.shape[
1
]) 
# 4 classes
# LinearSVC实现了“一对多”分类法
lin_clf 
= 
svm.LinearSVC()
print
(lin_clf.fit(X, Y))
dec 
= 
lin_clf.decision_function(`
1
`)
print
(
"LinearSVC实现一对多方法SVM个数:"
,dec.shape[
1
])

输出:

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,

  decision_function_shape='ovo', degree=3, gamma='auto', kernel='rbf',

  max_iter=-1, probability=False, random_state=None, shrinking=True,

  tol=0.001, verbose=False)

一对一方法SVM个数: 6

一对多方法SVM个数: 4

LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,

     intercept_scaling=1, loss='squared_hinge', max_iter=1000,

     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,

     verbose=0)

LinearSVC实现一对多方法SVM个数: 4

三、利用SVM分类IRIS

    iris数据集共有4个维度,但是我们只根据前2个维度,使用不同的支持向量机对其中的数据进行分类,以对不同的支持向量机进行比较。这2个维度表示:萼片长度、萼片宽度。

    这个例子说明了如何绘制四个不同内核的支持向量机分类的决策面。

    线性模型LinearSVC()和SVC(kernel='linear')的决策边界略有不同,是因为:

    LinearSVC()使得hinge损失函数最小化,而SVC使得平方hinge损失函数最小化

    LinearSVC()使用1 vs all的方式进行多分类,而SVC使用1 vs 1的方式进行多分类

    两个线性支持向量机的决策边界都是直线边界,而非线性核函数的支持向量机(多项式核,高斯径向基核)的决策边界都是非线性的曲线边界,这些曲线边界的具体形状取决于核函数以及核函数的参数。

注意:将二维数据集的分类决策函数绘制出来,能够直观的了解其各自的特点,这种方法在高维数据集中就不能使用了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
numpy np
matplotlib.pyplot plt
sklearn svm, datasets
 
iris 
= 
datasets.load_iris()
= 
iris.data[:, :]
= 
iris.target
= 
= 
svc 
= 
svm.SVC(
=
=
C).fit(X, y)
rbf_svc 
= 
svm.SVC(
=
=
=
C).fit(X, y)
poly_svc 
= 
svm.SVC(
=
=
=
C).fit(X, y)
lin_svc 
= 
svm.LinearSVC(
=
C).fit(X, y)
 
 
x_min, x_max 
= 
X[:, ].
min
() 
- 
, X[:, ].
max
() 
+ 
y_min, y_max 
= 
X[:, ].
min
() 
- 
, X[:, ].
max
() 
+ 
xx, yy 
= 
np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
 
titles 
= 
[,
          
,
          
,
          
]
 
i, clf ((svc, lin_svc, rbf_svc, poly_svc)):
    
plt.subplot(, , i 
+ 
)
    
plt.subplots_adjust(
=
=
)
    
= 
clf.predict(np.c_[xx.ravel(), yy.ravel()])
 
    
= 
Z.reshape(xx.shape)
    
plt.contourf(xx, yy, Z, 
=
plt.cm.coolwarm, 
=
)
 
    
plt.scatter(X[:, ], X[:, ], 
=
y, 
=
plt.cm.coolwarm)
    
plt.xlabel()
    
plt.ylabel()
    
plt.xlim(xx.
min
(), xx.
max
())
    
plt.ylim(yy.
min
(), yy.
max
())
    
plt.xticks(())
    
plt.yticks(())
    
plt.title(titles[i])
plt.show()

输出:

参考:

     本文转自stock0991 51CTO博客,原文链接:http://blog.51cto.com/qing0991/1927324,如需转载请自行联系原作者

你可能感兴趣的文章
指纹获取 Fingerprint2
查看>>
面试题目3:智能指针
查看>>
flask ORM: Flask-SQLAlchemy【单表】增删改查
查看>>
vim 常用指令
查看>>
nodejs 获取自己的ip
查看>>
你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算...
查看>>
18.3 redis 的安装
查看>>
jdbc 简单连接
查看>>
Activiti 实战篇 小试牛刀
查看>>
java中的Static class
查看>>
[工具类]视频音频格式转换
查看>>
GNS3与抓包工具Wireshark的关联
查看>>
groovy-语句
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>
Silverlight 5 beta新特性探索系列:10.浏览器模式下内嵌HTML+浏览器模式下创建txt文本文件...
查看>>
YourSQLDba 配置——修改备份路径
查看>>
nginx web服务理论与实战
查看>>
java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码
查看>>