转载:scikit-learn学习之SVM算法

转载,http://blog.csdn.net/gamer_gyt

目录(?)[+]

======================================================================

本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正

转载请注明出处,谢谢

======================================================================

机器学习中的算法(2)-支持向量机(SVM)基础

关于SVM一篇比较全介绍的博文
程序员训练机器学习 SVM算法分享

一:我对SVM的理解

先介绍一些简单的基本概念

分隔超平面:将数据集分割开来的直线叫做分隔超平面。

超平面:如果数据集是N维的,那么就需要N-1维的某对象来对数据进行分割。该对象叫做超平面,也就是分类的决策边界。

间隔

一个点到分割面的距离,称为点相对于分割面的距离。

数据集中所有的点到分割面的最小间隔的2倍,称为分类器或数据集的间隔。

最大间隔:SVM分类器是要找最大的数据集间隔。

支持向量:坐落在数据边际的两边超平面上的点被称为支持向量

1:超平面

对于上图直观的理解是红线的分类效果最好,为什么?

由此便引出了超平面的定义,SVM的目标就是寻找区分两类的超平面(hyper plane),使边际(margin)最大化。

那么如何选择超平面?超平面到一侧最近点的距离等于另一侧最近点的距离,两个超平面平行,如下图。

2:线性可区分(linear separable)和线性不可区分(linear inseparable)

上面显示的两个图都是线性可区分的,就是说很容易找到一个超平面将数据分割成两类

上图中的两个图形都是线性不可区分的,这种情况下,我们就需要用到核函数,将数据映射到高维空间中,寻找可区分数据的超平面

对于这幅图来说, 就是图中黄色那个点,它是方形的,因而它是负类的一个样本,这单独的一个样本,使得原本线性可分的问题变成了线性不可分的。这样类似的问题(仅有少数点线性不可分)叫做“近似线性可分”的问题。对于这类问题的处理就引入了一个松弛变量,当然随之而来的便是惩罚因子了,具体他们是什么请参考:点击阅读
, 这里不做解释

3:针对线性可区分,求超平面推导

超平面的公式可以定义为 : W * X + b = 0  W表示权重向量  W= {w1,w2,w3,w4.....,wn},n为特征值的个数 , X为训练实例, b表示偏移量

在这里假设二维特征向量X=(x1,x2)

做另外一个假设就是把b看作是另外一个weight,那么超平面就可以更新为: w0 + w1 * x1 +w2 * x2 = 0

所有超平面右上方的点满足:                    w0 + w1 * x1 +w2 * x2 > 0

所有超平面左下方的点满足:                    w0 + w1 * x1 +w2 * x2 < 0

调整weight,使超平面定义边际的两边:

H1:H1:w0 + w1 * x1 +w2 * x2 > 1 for yi=+1

H2:w0 + w1 * x1 +w2 * x2  =< -1 for yi=-1

综合上边两个公式得到:

(1): yi ( w0 + w1 * x1 +w2 * x2 ) >= 1  ,对于所有的i来说

所有坐落在数据边际的两边超平面上的点被称为支持向量
分界的超平面H1和H2任意一点的距离为 1/||W||  (推导过程这里略过,推导参考博客)   , ||W||表示向量的范数

W= sqrt(W1^2 + W2^2 + ... + Wn^2)
所以两边最大距离为                      2/||W||

利用一些数学公式的推导,以上公式(1)可以变为有限制的凸优化问题,利用KKT条件和拉格朗日公式,可以推出MMH(最大超平面)表示为以下决策边界:

yi是支持向量点Xi的类别标记

X^T是要测试的实例

ai和b0都是单一数值型参数

l是支持向量点的个数

下面看一张示例图片:

特性:训练好的模型算法复杂度是由支持向量的个数决定的,而不是 数据的纬度决定的,所以SVM不太容易产生OverWriting

SVM训练出的模型完全依赖于支持向量,即使所有训练集里所有非支持向量的点都被去除,重复训练过程,结果仍会得到一个完全一模一样的模型

一个SVM如果训练得出的支持向量个数比较小,SVM训练出的模型也容易被泛化

4:针对线性不可区分,求超平面推导

针对这种在空间中对应的向量不能被一个超平面划分开,用以下两个步骤来解决

1:利用一个非线性的映射把原数据集中的向量点转化到一个更高维的空间中

2:在这个高纬度的空间中找一个线性超平面来根据线性可分的情况处理

如下图示:

那么如何利用非线性映射把 转化到高维空间中

下面看一个小例子:

思考问题:如何选择合理的非线性转化把数据转到高维空间中?如何解决计算内积时算法复杂度高的问题?

答案是使用核函数

5:核函数

更多关于核函数请参考:点击阅读

至此SVM已经被我描述的差不多,其中的两部分求超平面的具体数学推导和核函数的具体使用方法,我并没有写,第一是因为,对于非数学专业的人来讲确实麻烦了,其次是自己太菜,但是网上已经有很多写的很好的博客,大家可以参考,下面我们就来看看scikit-learn上SVM的具体使用吧

二:Scikit-learn上对SVM相关描述

C-Support Vector Classification):支持向量分类,基于libsvm实现的(libsvm详情参考 或者百科),数据拟合的时间复杂度是数据样本的二次方,这使得他很难扩展到10000个数据集,当输入是多类别时(SVM最初是处理二分类问题的),通过一对一的方案解决,当然也有别的解决办法,比如说(以下为引用):

========================================================================================

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

=====================================================================================
svc使用代码示例(我演示的是最简单的,官网上还有很多看起来很漂亮的分类示例,感兴趣的可以自己参考下):

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:14px;">‘‘‘‘‘
  2. SVC参数解释
  3. (1)C: 目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
  4. (2)kernel:参数选择有RBF, Linear, Poly, Sigmoid, 默认的是"RBF";
  5. (3)degree:if you choose ‘Poly‘ in param 2, this is effective, degree决定了多项式的最高次幂;
  6. (4)gamma:核函数的系数(‘Poly‘, ‘RBF‘ and ‘Sigmoid‘), 默认是gamma = 1 / n_features;
  7. (5)coef0:核函数中的独立项,‘RBF‘ and ‘Poly‘有效;
  8. (6)probablity: 可能性估计是否使用(true or false);
  9. (7)shrinking:是否进行启发式;
  10. (8)tol(default = 1e - 3): svm结束标准的精度;
  11. (9)cache_size: 制定训练所需要的内存(以MB为单位);
  12. (10)class_weight: 每个类所占据的权重,不同的类设置不同的惩罚参数C, 缺省的话自适应;
  13. (11)verbose: 跟多线程有关,不大明白啥意思具体;
  14. (12)max_iter: 最大迭代次数,default = 1, if max_iter = -1, no limited;
  15. (13)decision_function_shape : ‘ovo’ 一对一, ‘ovr’ 多对多  or None 无, default=None
  16. (14)random_state :用于概率估计的数据重排时的伪随机数生成器的种子。
  17. ps:7,8,9一般不考虑。
  18. ‘‘‘
  19. from sklearn.svm import SVC
  20. import numpy as np
  21. X= np.array([[-1,-1],[-2,-1],[1,1],[2,1]])
  22. y = np.array([1,1,2,2])
  23. clf = SVC()
  24. clf.fit(X,y)
  25. print clf.fit(X,y)
  26. print clf.predict([[-0.8,-1]])</span></span>

输出结果为:
第一个打印出的是svc训练函数的参数,其更多参数说明请参考:点击阅读最后一行打印的是预测结果

NuSVC(Nu-Support Vector Classification.):核支持向量分类,和SVC类似,也是基于libsvm实现的,但不同的是通过一个参数空值支持向量的个数

示例代码:

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;"><span style="font-family:Microsoft YaHei;font-size:14px;">‘‘‘‘‘
  2. NuSVC参数
  3. nu:训练误差的一个上界和支持向量的分数的下界。应在间隔(0,1 ]。
  4. 其余同SVC
  5. ‘‘‘
  6. import numpy as np
  7. X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
  8. y = np.array([1, 1, 2, 2])
  9. from sklearn.svm import NuSVC
  10. clf = NuSVC()
  11. clf.fit(X, y)
  12. print clf.fit(X,y)
  13. print(clf.predict([[-0.8, -1]]))
  14. </span></span>

输出结果:

更多NuSVC的参考:点击阅读

LinearSVC(Linear Support Vector Classification):线性支持向量分类,类似于SVC,但是其使用的核函数是”linear“上边介绍的两种是按照brf(径向基函数计算的,其实现也不是基于LIBSVM,所以它具有更大的灵活性在选择处罚和损失函数时,而且可以适应更大的数据集,他支持密集和稀疏的输入是通过一对一的方式解决的

代码使用实例如下:

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;">‘‘‘
  2. LinearSVC 参数解释
  3. C:目标函数的惩罚系数C,用来平衡分类间隔margin和错分样本的,default C = 1.0;
  4. loss :指定损失函数
  5. penalty :
  6. dual :选择算法来解决对偶或原始优化问题。当n_samples > n_features 时dual=false。
  7. tol :(default = 1e - 3): svm结束标准的精度;
  8. multi_class:如果y输出类别包含多类,用来确定多类策略, ovr表示一对多,“crammer_singer”优化所有类别的一个共同的目标
  9. 如果选择“crammer_singer”,损失、惩罚和优化将会被被忽略。
  10. fit_intercept :
  11. intercept_scaling :
  12. class_weight :对于每一个类别i设置惩罚系数C = class_weight[i]*C,如果不给出,权重自动调整为 n_samples / (n_classes * np.bincount(y))
  13. verbose:跟多线程有关,不大明白啥意思具体<pre name="code" class="python">
  14. from sklearn.svm import SVC
  15. X=[[0],[1],[2],[3]]
  16. Y = [0,1,2,3]
  17. clf = SVC(decision_function_shape=‘ovo‘) #ovo为一对一
  18. clf.fit(X,Y)
  19. print clf.fit(X,Y)
  20. dec = clf.decision_function([[1]])    #返回的是样本距离超平面的距离
  21. print dec
  22. clf.decision_function_shape = "ovr"
  23. dec =clf.decision_function([1]) #返回的是样本距离超平面的距离
  24. print dec
  25. #预测
  26. print clf.predict([1])</span>

random_state :用于概率估计的数据重排时的伪随机数生成器的种子。max_iter :‘‘‘import numpy as npX = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])y = np.array([1, 1, 2, 2])from sklearn.svm import LinearSVCclf = LinearSVC()clf.fit(X, y) print clf.fit(X,y)print(clf.predict([[-0.8, -1]]))

结果如下:

更多关于LinearSVC请参考:点击阅读

  1. <span style="font-family:Microsoft YaHei;">#-*-coding:utf-8-*-
  2. ‘‘‘‘‘
  3. Created on 2016年4月29日
  4. @author: Gamer Think
  5. ‘‘‘
  6. from sklearn.svm import SVC,LinearSVC
  7. X=[[0],[1],[2],[3]]
  8. Y = [0,1,2,3]
  9. ‘‘‘‘‘
  10. SVC and NuSVC
  11. ‘‘‘
  12. clf = SVC(decision_function_shape=‘ovo‘) #ovo为一对一
  13. clf.fit(X,Y)
  14. print "SVC:",clf.fit(X,Y)
  15. dec = clf.decision_function([[1]])    #返回的是样本距离超平面的距离
  16. print "SVC:",dec
  17. clf.decision_function_shape = "ovr"
  18. dec =clf.decision_function([1]) #返回的是样本距离超平面的距离
  19. print "SVC:",dec
  20. #预测
  21. print "预测:",clf.predict([1])
  22. ‘‘‘</span><pre name="code" class="python"><span style="font-family:Microsoft YaHei;">LinearSVC</span>

‘‘‘lin_clf = LinearSVC()lin_clf.fit(X, Y) dec = lin_clf.decision_function([[1]])print "LinearSVC:",dec.shape[1]

结果显示:

红色字体暂时忽略

Unbalanced problems(数据不平衡问题)

对于非平衡级分类超平面,使用不平衡SVC找出最优分类超平面,基本的思想是,我们先找到一个普通的分类超平面,自动进行校正,求出最优的分类超平面

这里可以使用 SVC(kernel="linear")

针对下面的svc可以使用 clf=SGDClassifier(n_iter=100,alpha=0.01)
代替

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;"># -*-coding:utf-8-*-
  2. ‘‘‘‘‘
  3. Created on 2016年5月4日
  4. @author: Gamer Think
  5. ‘‘‘
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. from sklearn import svm
  9. #from sklearn.linear_model import SGDClassifier
  10. # we create 40 separable points
  11. rng = np.random.RandomState(0)
  12. n_samples_1 = 1000
  13. n_samples_2 = 100
  14. X = np.r_[1.5 * rng.randn(n_samples_1, 2),0.5 * rng.randn(n_samples_2, 2) + [2, 2]]
  15. y = [0] * (n_samples_1) + [1] * (n_samples_2)
  16. print X
  17. print y
  18. # fit the model and get the separating hyperplane
  19. clf = svm.SVC(kernel=‘linear‘, C=1.0)
  20. clf.fit(X, y)
  21. w = clf.coef_[0]
  22. a = -w[0] / w[1]      #a可以理解为斜率
  23. xx = np.linspace(-5, 5)
  24. yy = a * xx - clf.intercept_[0] / w[1]    #二维坐标下的直线方程
  25. # get the separating hyperplane using weighted classes
  26. wclf = svm.SVC(kernel=‘linear‘, class_weight={1: 10})
  27. wclf.fit(X, y)
  28. ww = wclf.coef_[0]
  29. wa = -ww[0] / ww[1]
  30. wyy = wa * xx - wclf.intercept_[0] / ww[1]   #带权重的直线
  31. # plot separating hyperplanes and samples
  32. h0 = plt.plot(xx, yy, ‘k-‘, label=‘no weights‘)
  33. h1 = plt.plot(xx, wyy, ‘k--‘, label=‘with weights‘)
  34. plt.scatter(X[:, 0], X[:, 1], c=y)
  35. plt.legend()
  36. plt.axis(‘tight‘)
  37. plt.show()</span>

运行结果截图

2:Regression

支持分类的支持向量机可以推广到解决回归问题,这种方法称为支持向量回归

支持向量分类所产生的模型仅仅依赖于训练数据的一个子集,因为构建模型的成本函数不关心在超出边界范围的点,类似的,通过支持向量回归产生的模型依赖于训练数据的一个子集,因为构建模型的函数忽略了靠近预测模型的数据集。

有三种不同的实现方式:支持向量回归SVR,nusvr和linearsvr。linearsvr提供了比SVR更快实施但只考虑线性核函数,而nusvr实现比SVR和linearsvr略有不同。
作为分类类别,训练函数将X,y作为向量,在这种情况下y是浮点数

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;">>>> from sklearn import svm
  2. >>> X = [[0, 0], [2, 2]]
  3. >>> y = [0.5, 2.5]
  4. >>> clf = svm.SVR()
  5. >>> clf.fit(X, y)
  6. SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma=‘auto‘,
  7. kernel=‘rbf‘, max_iter=-1, shrinking=True, tol=0.001, verbose=False)
  8. >>> clf.predict([[1, 1]])
  9. array([ 1.5])</span>

下面看一个使用SVR做线性回归的例子:

[python] view plain copy

  1. <span style="font-family:Microsoft YaHei;">#-*-coding:utf-8-*-
  2. ‘‘‘‘‘
  3. Created on 2016年5月4日
  4. @author: Gamer Think
  5. ‘‘‘
  6. import numpy as np
  7. from sklearn.svm import SVR
  8. import matplotlib.pyplot as plt
  9. ###############################################################################
  10. # Generate sample data
  11. X = np.sort(5 * np.random.rand(40, 1), axis=0)  #产生40组数据,每组一个数据,axis=0决定按列排列,=1表示行排列
  12. y = np.sin(X).ravel()   #np.sin()输出的是列,和X对应,ravel表示转换成行
  13. ###############################################################################
  14. # Add noise to targets
  15. y[::5] += 3 * (0.5 - np.random.rand(8))
  16. ###############################################################################
  17. # Fit regression model
  18. svr_rbf = SVR(kernel=‘rbf‘, C=1e3, gamma=0.1)
  19. svr_lin = SVR(kernel=‘linear‘, C=1e3)
  20. svr_poly = SVR(kernel=‘poly‘, C=1e3, degree=2)
  21. y_rbf = svr_rbf.fit(X, y).predict(X)
  22. y_lin = svr_lin.fit(X, y).predict(X)
  23. y_poly = svr_poly.fit(X, y).predict(X)
  24. ###############################################################################
  25. # look at the results
  26. lw = 2
  27. plt.scatter(X, y, color=‘darkorange‘, label=‘data‘)
  28. plt.hold(‘on‘)
  29. plt.plot(X, y_rbf, color=‘navy‘, lw=lw, label=‘RBF model‘)
  30. plt.plot(X, y_lin, color=‘c‘, lw=lw, label=‘Linear model‘)
  31. plt.plot(X, y_poly, color=‘cornflowerblue‘, lw=lw, label=‘Polynomial model‘)
  32. plt.xlabel(‘data‘)
  33. plt.ylabel(‘target‘)
  34. plt.title(‘Support Vector Regression‘)
  35. plt.legend()
  36. plt.show()</span>

运行结果:

当然,官网上还有关于以下几个方面的,在这里小编就不翻译了感兴趣的自己看吧:

密度估计,新颖性检测
复杂性
实用的技巧
核函数
数学公式
实施细则

SVM实在是很强大,不是我这等菜鸟短时间内所能参透的,以后有机会还会继续学习SVM,我相信不同的时间看同一个算法或者项目会有不同的收获,谢谢

时间: 2024-08-01 09:10:09

转载:scikit-learn学习之SVM算法的相关文章

scikit-learn学习之SVM算法

====================================================================== 本系列博客主要参考 Scikit-Learn 官方网站上的每一个算法进行,并进行部分翻译,如有错误,请大家指正 转载请注明出处,谢谢 ====================================================================== 机器学习中的算法(2)-支持向量机(SVM)基础 关于SVM一篇比较全介绍的博文

机器学习-scikit learn学习笔记

scikit-learn官网:http://scikit-learn.org/stable/ 通常情况下,一个学习问题会包含一组学习样本数据,计算机通过对样本数据的学习,尝试对未知数据进行预测. 学习问题一般可以分为: 监督学习(supervised learning) 分类(classification) 回归(regression) 非监督学习(unsupervised learning) 聚类(clustering) 监督学习和非监督学习的区别就是,监督学习中,样本数据会包含要预测的标签(

Query意图分析:记一次完整的机器学习过程(scikit learn library学习笔记)

所谓学习问题,是指观察由n个样本组成的集合,并根据这些数据来预测未知数据的性质. 学习任务(一个二分类问题): 区分一个普通的互联网检索Query是否具有某个垂直领域的意图.假设现在有一个O2O领域的垂直搜索引擎,专门为用户提供团购.优惠券的检索:同时存在一个通用的搜索引擎,比如百度,通用搜索引擎希望能够识别出一个Query是否具有O2O检索意图,如果有则调用O2O垂直搜索引擎,获取结果作为通用搜索引擎的结果补充. 我们的目的是学习出一个分类器(classifier),分类器可以理解为一个函数,

机器学习笔记—svm算法(上)

本文申明:本文原创,如转载请注明原文出处. 引言:上一篇我们讲到了logistic回归,今天我们来说一说与其很相似的svm算法,当然问题的讨论还是在线性可分的基础下讨论的. 很多人说svm是目前最好的分类器,那我们就来看看我们的svm好在哪里. 一:初识svm 问题:用一条直线把下图的圆球和五角星分离开来. 解答:有N种分法,如下图: 附加题:找出最佳分类? 解答:如图: Exe me?鬼知道哪一条是最佳?? 等等这个最佳分类是不是等价于,地主让管家给两个儿子分地,是不是只要让两家之间一样多就可

(转载)深度学习三十年创新路

转载自:http://36kr.com/p/533832.html 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想法出现了. 本篇文章来自依图科技 CEO Leo的投稿,依图科技是一家专注研究CV(Computer Vison,计算机视觉)的以技术驱动的创业公司,Leo自己也在这一领域有深入研究,因此这次写下这篇文章,希望回顾一下深度学习三十年的创新之路. 近期Na

SVM算法

摘要:SVM(支持向量机)算法是一种典型的监督式学习算法.介绍SVM算法的思想和应用. 关键词:机器学习   SVM    支持向量机 SVM(Support Vector Machine)支持向量机,简称SV机,一种监督式学习算法,广泛地应用于统计分类和回归分析中. SVM算法的思想可以概括为两点. 第一点:SVM是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本映射到高维特征空间使其线性可分,从而使得高维特征空间采用采用线性算法对样本的非线

程序员训练机器学习 SVM算法分享

http://www.csdn.net/article/2012-12-28/2813275-Support-Vector-Machine 摘要:支持向量机(SVM)已经成为一种非常受欢迎的算法.本文主要阐述了SVM是如何进行工作的,同时也给出了使用Python Scikits库的几个示例.SVM作为一种训练机器学习的算法,可以用于解决分类和回归问题,还使用了kernel trick技术进行数据的转换,再根据转换信息在可能的输出之中找到一个最优的边界. [CSDN报道]支持向量机(Support

从Loagistic 到 SVM算法

SVM(支持向量机),一种二类分类器,之所以称之为向量机,是因为它本身就产生一个二值决策结果,即使一种决策"机",支持向量机的泛化错误低(具有结构风险最小),具有很强的学习能力,因此很多人认为它是最好的监督学习算法. SVM与Logistic回归的联系: logistic回归的目的就是从特征值中学习出一个0/1分类模型.而这个模型的输入是将特征的线性组合作为自变量,由于sigmod函数的自变量具有从负无穷到正无穷的输入范围,因此它可以把任何一个输入映射到0/1 sigmod函数的形式化

SVM算法入门

转自:http://blog.csdn.net/yangliuy/article/details/7316496SVM入门(一)至(三)Refresh 按:之前的文章重新汇编一下,修改了一些错误和不当的说法,一起复习,然后继续SVM之旅. (一)SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中[10]. 支持向量机方法