Python机器学习之SVM支持向量机


Posted in Python onDecember 27, 2017

SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集。
SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火爆,CSDN博客里也有大量的好文章对此进行分析,下面给出几个本人认为讲解的相当不错的:
支持向量机通俗导论(理解SVM的3层境界)
JULY大牛讲的是如此详细,由浅入深层层推进,以至于关于SVM的原理,我一个字都不想写了。。强烈推荐。
还有一个比较通俗的简单版本的:手把手教你实现SVM算法

SVN原理比较复杂,但是思想很简单,一句话概括,就是通过某种核函数,将数据在高维空间里寻找一个最优超平面,能够将两类数据分开。

针对不同数据集,不同的核函数的分类效果可能完全不一样。可选的核函数有这么几种:
线性函数:形如K(x,y)=x*y这样的线性函数;
多项式函数:形如K(x,y)=[(x·y)+1]^d这样的多项式函数;
径向基函数:形如K(x,y)=exp(-|x-y|^2/d^2)这样的指数函数;
Sigmoid函数:就是上一篇文章中讲到的Sigmoid函数。

我们就利用之前的几个数据集,直接给出Python代码,看看运行效果:

测试1:身高体重数据

# -*- coding: utf-8 -*- 
import numpy as np 
import scipy as sp 
from sklearn import svm 
from sklearn.cross_validation import train_test_split 
import matplotlib.pyplot as plt 
 
data  = [] 
labels = [] 
with open("data\\1.txt") as ifile: 
    for line in ifile: 
      tokens = line.strip().split(' ') 
      data.append([float(tk) for tk in tokens[:-1]]) 
      labels.append(tokens[-1]) 
x = np.array(data) 
labels = np.array(labels) 
y = np.zeros(labels.shape) 
y[labels=='fat']=1 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.0) 
 
h = .02  
# create a mesh to plot in 
x_min, x_max = x_train[:, 0].min() - 0.1, x_train[:, 0].max() + 0.1 
y_min, y_max = x_train[:, 1].min() - 1, x_train[:, 1].max() + 1 
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), 
           np.arange(y_min, y_max, h)) 
 
''''' SVM ''' 
# title for the plots 
titles = ['LinearSVC (linear kernel)', 
     'SVC with polynomial (degree 3) kernel', 
     'SVC with RBF kernel', 
     'SVC with Sigmoid kernel'] 
clf_linear = svm.SVC(kernel='linear').fit(x, y) 
#clf_linear = svm.LinearSVC().fit(x, y) 
clf_poly  = svm.SVC(kernel='poly', degree=3).fit(x, y) 
clf_rbf   = svm.SVC().fit(x, y) 
clf_sigmoid = svm.SVC(kernel='sigmoid').fit(x, y) 
 
for i, clf in enumerate((clf_linear, clf_poly, clf_rbf, clf_sigmoid)): 
  answer = clf.predict(np.c_[xx.ravel(), yy.ravel()]) 
  print(clf) 
  print(np.mean( answer == y_train)) 
  print(answer) 
  print(y_train) 
 
  plt.subplot(2, 2, i + 1) 
  plt.subplots_adjust(wspace=0.4, hspace=0.4) 
   
  # Put the result into a color plot 
  z = answer.reshape(xx.shape) 
  plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8) 
   
  # Plot also the training points 
  plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired) 
  plt.xlabel(u'身高') 
  plt.ylabel(u'体重') 
  plt.xlim(xx.min(), xx.max()) 
  plt.ylim(yy.min(), yy.max()) 
  plt.xticks(()) 
  plt.yticks(()) 
  plt.title(titles[i]) 
   
plt.show()

运行结果如下:

Python机器学习之SVM支持向量机

可以看到,针对这个数据集,使用3次多项式核函数的SVM,得到的效果最好。

测试2:影评态度

下面看看SVM在康奈尔影评数据集上的表现:(代码略)

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='linear', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.814285714286

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='poly', max_iter=-1, probability=False, random_state=None,  shrinking=True, tol=0.001, verbose=False)
0.492857142857

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='rbf', max_iter=-1, probability=False, random_state=None,  shrinking=True, tol=0.001, verbose=False)
0.492857142857

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='sigmoid', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.492857142857

可见在该数据集上,线性分类器效果最好。

测试3:圆形边界

最后我们测试一个数据分类边界为圆形的情况:圆形内为一类,原型外为一类。看这类非线性的数据SVM表现如何:
测试数据生成代码如下所示:

''''' 数据生成 ''' 
h = 0.1 
x_min, x_max = -1, 1 
y_min, y_max = -1, 1 
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), 
           np.arange(y_min, y_max, h)) 
n = xx.shape[0]*xx.shape[1] 
x = np.array([xx.T.reshape(n).T, xx.reshape(n)]).T 
y = (x[:,0]*x[:,0] + x[:,1]*x[:,1] < 0.8) 
y.reshape(xx.shape) 
 
x_train, x_test, y_train, y_test\ 
  = train_test_split(x, y, test_size = 0.2)

测试结果如下:

SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='linear', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.65
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='poly', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.675
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='rbf', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.9625
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0,  kernel='sigmoid', max_iter=-1, probability=False, random_state=None,
  shrinking=True, tol=0.001, verbose=False)
0.65

Python机器学习之SVM支持向量机

可以看到,对于这种边界,径向基函数的SVM得到了近似完美的分类结果。而其他的分类器显然束手无策。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python分治法求二维数组局部峰值方法
Apr 03 Python
一百多行python代码实现抢票助手
Sep 25 Python
python实现推箱子游戏
Mar 25 Python
python多线程分块读取文件
Aug 29 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Python3中的f-Strings增强版字符串格式化方法
Mar 04 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python定义具名元组实例操作
Feb 28 Python
Python echarts实现数据可视化实例详解
Mar 03 Python
Python:Scrapy框架中Item Pipeline组件使用详解
Dec 27 #Python
手把手教你python实现SVM算法
Dec 27 #Python
Python中使用支持向量机SVM实践
Dec 27 #Python
Python使用Scrapy保存控制台信息到文本解析
Dec 27 #Python
Python简单生成随机姓名的方法示例
Dec 27 #Python
ubuntu中配置pyqt4环境教程
Dec 27 #Python
Python中Threading用法详解
Dec 27 #Python
You might like
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
PHP二维数组分页2种实现方法解析
2020/07/09 PHP
用php实现分页效果的示例代码
2020/12/10 PHP
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
2014/05/29 Javascript
JS DOM实现鼠标滑动图片效果
2020/09/17 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
python发布模块的步骤分享
2014/02/21 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
详解Python 解压缩文件
2019/04/09 Python
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
解决pandas展示数据输出时列名不能对齐的问题
2019/11/18 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
编辑求职信样本
2013/12/16 职场文书
星级党支部申报材料
2014/05/31 职场文书
留学生求职信
2014/06/03 职场文书
学校交通安全责任书
2014/08/25 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
感恩教师节主题班会
2015/08/12 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL