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进行一些简单的自然语言处理的教程
Mar 31 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
Python基于DES算法加密解密实例
Jun 03 Python
Python读取properties配置文件操作示例
Mar 29 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
Apr 27 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
scikit-learn线性回归,多元回归,多项式回归的实现
Aug 29 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
Python 读取有公式cell的结果内容实例方法
Feb 17 Python
windows上彻底删除jupyter notebook的实现
Apr 13 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导入mysql
2009/11/09 PHP
php mail to 配置详解
2014/01/16 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
Jquery跨浏览器文本复制插件Zero Clipboard的使用方法
2016/02/28 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
Vue.js递归组件构建树形菜单
2017/12/24 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
js实现简单模态框实例
2018/11/16 Javascript
vue插件draggable实现拖拽移动图片顺序
2018/12/01 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python中selenium实现文件上传所有方法整理总结
2017/04/01 Python
Python 实现数据库更新脚本的生成方法
2017/07/09 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python opencv 直方图反向投影的方法
2018/02/24 Python
python调用staf自动化框架的方法
2018/12/26 Python
python用700行代码实现http客户端
2021/01/14 Python
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
自荐书模板
2013/12/19 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
工厂车间标语
2014/06/19 职场文书
党员创先争优心得体会
2014/09/11 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
九华山导游词
2015/02/03 职场文书
《刷子李》教学反思
2016/02/20 职场文书
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫