python实现svm源程序_python实现SVM
一、概述
支持向量机(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, 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)一般不考虑。
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, 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的方式进行多分类
两个线性支持向量机的决策边界都是直线边界,而非线性核函数的支持向量机(多项式核,高斯径向基核)的决策边界都是非线性的曲线边界,这些曲线边界的具体形状取决于核函数以及核函数的参数。
注意:将二维数据集的分类决策函数绘制出来,能够直观的了解其各自的特点,这种方法在高维数据集中就不能使用了。
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[i])
plt.show()
输出:
python实现svm源程序_python实现SVM相关推荐
- python遥感影像分类代码_python,sklearn,svm,遥感数据分类,代码实例
python,sklearn,svm,遥感数据分类,代码实例,数据,函数,精度,遥感,路径 python,sklearn,svm,遥感数据分类,代码实例 易采站长站,站长之家为您整理了python,s ...
- python导入鸢尾花数据集_Python实现鸢尾花数据集分类问题——基于skearn的SVM
1 #!/usr/bin/env python 2 #encoding: utf-8 3 __author__ = 'Xiaolin Shen' 4 from sklearn importsvm5 i ...
- python视频行人检测_python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
参照opencv官网例程写了一个基于python的行人检测程序,实现了和自带检测器基本一致的检测效果. opencv版本:3.4.0 训练集和opencv官方用了同一个,可以从http://pasca ...
- 支持向量机python代码_Python机器学习SVM支持向量机算法理论 | kTWO-个人博客
PS:这篇文章讲的是SVM的算法的基础理论知识,因为博主也是刚学习没多久,对SVM的数学思想了解的不是很深,所以这篇文章就简单介绍一下什么是SVM以及SVM是怎么工作的. 1.什么是支持向量机(SVM ...
- Python+OpenCV:理解支持向量机(SVM)
Python+OpenCV:理解支持向量机(SVM) 理论 线性可分数据(Linearly Separable Data) Consider the image below which has two ...
- Python机器学习:SVM004Scikit-learn中的SVM
纵向值很大 数据尺度归一化 #SCikit-learn中的SVN import numpy as np import matplotlib.pyplot as plt from sklearn imp ...
- 怎样保存python源程序_Python编程第1课,认识IDLE,编写保存运行第1个程序
你为什么想学Python呢?简单?易学?还是为了跟风? 大陈学它,起初完全是跟风,说实在话,写这篇文章的时候,我还没找到充足的理由告诉你,为什么不去学C.C++.VB.Java等,而一定要学Pytho ...
- python数据建模工具_python数据分析工具——Pandas、StatsModels、Scikit-Learn
Pandas Pandas是 Python下最强大的数据分析和探索工具.它包含高级的数据结构和精巧的工具,使得在 Python中处理数据非常快速和简单. Pandas构建在 Numpy之上,它使得以 ...
- python获取网页验证码_Python识别网站验证码
http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...
最新文章
- leetcode算法题--从上到下打印二叉树
- js字符串函数 [http://www.cnblogs.com/qfb620/archive/2011/07/28/2119799.html]
- 战神笔记本电脑自带access吗_双·12超值价 十代酷睿+GTX1650游戏本只卖4219元_神舟 战神Z7M-CU5NB_笔记本新闻...
- 中国棉纺织工业发展状况及未来竞争格局报告2022-2028年
- C#——《C#语言程序设计》实验报告——数据库编程——基于ADO.NET技术和WPF技术的简单数据库可视化工具DEMO
- PostgreSQL 8.4.3 Final / 9.0 Alpha 4
- 从字节码看 finally关键字、异常表
- linux中的网络体系结构
- 支付宝客户端架构分析:自动化日志收集及分析
- Araxis Merge for Mac(可视化文件比较合并工具)支持m1
- paip.导入数据英文音标到数据库mysql为空的问题之道解决原理
- linux下单网卡设双置IP
- protel99se中文版
- cherokee php,安装Cherokee与PHP5和MySQL支持在Mandriva 2009.1
- windows10下使用DNW下载
- iOS 自定义转场动画篇
- 【数据分享】2022年11月西南地区POI数据分享(重庆、四川、贵州、云南、西藏)
- 滑动窗口大杀器,牛逼
- 八斗大数据20期冲击百万年薪完结分享
- 后互联网:无聊已死、社交危机、故事崛起
热门文章
- 【已解决】报错qt.qpa.plugin: Could not load the Qt platform plugin “windows“ in “...“ even though it was
- Android studio:错误: 需要常量表达式
- Elasticsearch unassigned shards的解决之道
- input的focus事件阻止冒泡
- html中validate方法,HTML validate分享
- nginx 访问统计
- 性能测试需求分析怎么做
- 2012年的目标和执行情况跟踪记录
- Mysql explain 中的extra字段 解读
- Htc one m7 港版5.12.708.3官方RUU系统备份