设为首页 收藏本站
查看: 1003|回复: 0

[经验分享] python实现SVM-IT技术学习与交流

[复制链接]

尚未签到

发表于 2018-8-4 14:16:44 | 显示全部楼层 |阅读模式
  一、概述
  支持向量机(SVM)是一系列可用于分类、回归和异常值检测的有监督学习方法。
  优点:
  在高维空间中行之有效。
  当维数大于样本数时仍然可用。
  在决策函数中只使用训练点的一个子集(称为支持向量),大大节省了内存开销。
  用途广泛:决策函数中可以使用不同的核函数。提供了一种通用的核,但是也可以指定自定义的核。
  劣势:
  如果特征数量远大于样本数量,则表现会比较差。
  SVM不直接提供概率估计。这个值通过五折交叉验证计算,代价比较高
  二、分类
  要在数据集上进行多类别分类,可以使用SVC,NuSVC和LinearSVC这三个类。 SVC和NuSVC两种方法类似,但是接受的参数有细微不同,而且底层的数学原理不一样。另一方面,LinearSVC是对支持向量分类的另一种实现,使用了线性核。注意LinearSVC不接受关键字kernel,因为核被预设为是线性的。其与SVC和NuSVC相比还缺少了一些成员,如support_。
  和其它分类器一样,SVC,NuSVC和LinearSVC接受两个数组:大小为[n_samples, n_features]的数组X,包含训练样本;以及大小为[n_samples]的数组y,包含类别标签(以字符串类型或整型存储)
  二分类:
sklearn  
sklearn svm
  

  
(,sklearn.)
  

  
X = [[, ], [, ],[-,-]]
  
y = [,,]
  
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,>  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)一般不考虑。
import sklearn  
from sklearn import svm
  

  
X = [[0], [1], [2], [3]]
  
Y = [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,>  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,>  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的方式进行多分类
  两个线性支持向量机的决策边界都是直线边界,而非线性核函数的支持向量机(多项式核,高斯径向基核)的决策边界都是非线性的曲线边界,这些曲线边界的具体形状取决于核函数以及核函数的参数。
  注意:将二维数据集的分类决策函数绘制出来,能够直观的了解其各自的特点,这种方法在高维数据集中就不能使用了。
numpy np  
matplotlib.pyplot plt
  
sklearn svm, datasets
  

  
iris = datasets.load_iris()
  
X = iris.data[:, :]
  
y = iris.target
  
h = C = 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(=, =)
  
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
  

  
    Z = 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)
  
plt.show()
  输出:
DSC0000.jpg

  参考:https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html
  http://scikit-learn.org/stable/modules/svm.html
  http://scikit-learn.org/dev/modules/generated/sklearn.svm.SVC.html#sklearn.svm.SVC

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-546566-1-1.html 上篇帖子: python paramiko 使用 下篇帖子: Python27 反射
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表