支持向量机(Support Vector Machine,SVM)的基本模型是定义在特征空间上间隔最大的线性分类器。它是一种二类分类模型,当采用了核技巧之后,支持向量机可以用于非线性分类。

  1)线性可分支持向量机(也称硬间隔支持向量机):当训练数据线性可分是,通过硬间隔最大化,学得一个线性可分支持向量机

  2)线性支持向量机(也称为软间隔支持向量机):当训练数据近似线性可分时,通过软间隔最大化,学得一个线性支持向量机

  3)非线性支持向量机:当训练数据不可分时,通过使用核技巧以及软间隔最大化,学得一个非线性支持向量机。

1、线性可分支持向量机

  输入:线性可分训练数据集T

  输出:最大几何间隔的分离超平面和分类决策函数

  算法步骤:

    1)构造并且求解约束优化问题,求得最优解w*,b*

    2)由此得到分离超平面,以及分类决策函数

  若训练数据集T线性可分,最大间隔分离超平面存在且唯一

  下面是线性可分支持向量机学习算法的对偶算法:

  输入:线性可分训练数据集T

  输出:最大集合间隔的分离超平面和分类决策函数

  算法步骤:

    1)构造并且求解约束最优化问题,求得最优解α*

    2)计算w*,同时选择α*的一个正的分量αj*>0,计算b*

    3)由此得到最大集合间隔分离超平面和分类决策函数

2、线性支持向量机

  对于线性不可分训练数据,线性支持向量机不再适用,但可以将它扩展到线性不可分问题

  线性支持向量机学习算法的对偶算法:

  输入:训练数据集T,惩罚参数C>0

  输出:软间隔最大化分离超平面和分类决策函数

  算法步骤:

    1)求解约束优化问题,求得最优解α*

    2)计算w*,b*

    3)由此得到软间隔最大化分离超平面以及分类决策函数\

  实验代码:

 import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm def load_data_regression():
diabetes=datasets.load_diabetes()
return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0) def load_data_classfication():
iris=datasets.load_iris()
X_train=iris.data
Y_train=iris.target
return cross_validation.train_test_split(X_train,Y_train,test_size=0.25,random_state=0,stratify=Y_train) def test_LinearSVC(*data):
X_train,X_test,Y_train,Y_test=data
cls=svm.LinearSVC()
cls.fit(X_train,Y_train)
print("Coefficients:%s,intercept %s"%(cls.coef_,cls.intercept_))
print("Score:%.2f"%cls.score(X_test,Y_test)) X_train,X_test,Y_train,Y_test=load_data_classfication()
test_LinearSVC(X_train,X_test,Y_train,Y_test)

  实验结果:

  在测试集上的预测准确率达到了0.97,还是非常高的

3、非线性支持向量机

  核函数将输入空间中的任意两个向量x,z映射为特征空间中对应的向量之间的内积。在给定核函数K(x,z)的情况下,可以利用求解线性分类问题的方法求解非线性分类问题的支持向量机。

  在实际应用中,往往依赖经验直接选择核函数,然后验证该核函数确实是有效的核函数。常用的核函数如下:

  1)多项式核函数   2)高斯核函数  3)sigmoid核函数

  输入:训练数据集T,惩罚参数C

  输出:分类决策函数

  算法步骤:

    1)选择适当的核函数K,求解约束最优化问题,求得最优解α*

    2)计算w*和b*

    3)构造分类决策函数

  实验代码:

 import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm def load_data_regression():
diabetes=datasets.load_diabetes()
return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0) def load_data_classfication():
iris=datasets.load_iris()
X_train=iris.data
Y_train=iris.target
return cross_validation.train_test_split(X_train,Y_train,test_size=0.25,random_state=0,stratify=Y_train) def test_LinearSVC(*data):
X_train,X_test,Y_train,Y_test=data
cls=svm.LinearSVC()
cls.fit(X_train,Y_train)
print("Coefficients:%s,intercept %s"%(cls.coef_,cls.intercept_))
print("Score:%.2f"%cls.score(X_test,Y_test)) def test_SVC_linear(*data): #non-linear svm,kernel is linear
X_train,X_test,Y_train,Y_test=data
cls=svm.SVC(kernel="linear")
cls.fit(X_train,Y_train)
print("Score:%.2f"%cls.score(X_test,Y_test))
X_train,X_test,Y_train,Y_test=load_data_classfication()
#test_LinearSVC(X_train,X_test,Y_train,Y_test)
test_SVC_linear(X_train,X_test,Y_train,Y_test)

  实验结果:

  可以看到线性核要比线性分类支持向量机LinearSVC的预测效果更佳,对测试集的预测全部正确

  

4、支持向量回归(Support Vector Regression,SVR)

  (1)线性回归SVR

  实验代码:

 import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm def load_data_regression():
diabetes=datasets.load_diabetes()
return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0) def test_LinearSVR(*data):
X_train,X_test,Y_train,Y_test=data
regr=svm.LinearSVR()
regr.fit(X_train,Y_train)
print("Score:%.2f"%regr.score(X_test,Y_test)) X_train,X_test,Y_train,Y_test=load_data_regression()
test_LinearSVR(X_train,X_test,Y_train,Y_test)

  实验结果:

  可以看到线性回归支持向量机的预测性能较差,score值为负值。

  (2)非线性回归SVR

  实验代码:

 import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets,linear_model,cross_validation,svm def load_data_regression():
diabetes=datasets.load_diabetes()
return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0) def test_SVR_linear(*data):
X_train, X_test, Y_train, Y_test = data
regr = svm.SVR(kernel="linear")
regr.fit(X_train, Y_train)
print("Score:%.2f" % regr.score(X_test, Y_test)) X_train,X_test,Y_train,Y_test=load_data_regression()
test_SVR_linear(X_train,X_test,Y_train,Y_test)

  实验结果:

  线性核要比线性回归支持向量机LinearSVR的预测效果更好,但是依然是负值。并且采用poly、rbf、sigmoid函数,以及采用不同的参数,发现其预测的准确率都不是很高,峰值大概在0.6左右。可见支持向量机在回归问题上的表现并不突出

5、SVM的优缺点

  SVM本质上是非线性方法,在样本量很少时,容易抓住数据和特征之间的非线性关系,因此可以解决非线性问题、可以避免神经网络结构选择和局部极小点问题、可以提高泛化性能、可以解决高维问题

  SVM对缺失数据敏感,对非线性问题没有通用解决方案,必须谨慎选择核函数来处理,计算复杂度高。

    

python大战机器学习——支持向量机的更多相关文章

  1. python大战机器学习——人工神经网络

    人工神经网络是有一系列简单的单元相互紧密联系构成的,每个单元有一定数量的实数输入和唯一的实数输出.神经网络的一个重要的用途就是接受和处理传感器产生的复杂的输入并进行自适应性的学习,是一种模式匹配算法, ...

  2. python大战机器学习——模型评估、选择与验证

    1.损失函数和风险函数 (1)损失函数:常见的有 0-1损失函数  绝对损失函数  平方损失函数  对数损失函数 (2)风险函数:损失函数的期望      经验风险:模型在数据集T上的平均损失 根据大 ...

  3. python大战机器学习——数据预处理

    数据预处理的常用流程: 1)去除唯一属性 2)处理缺失值 3)属性编码 4)数据标准化.正则化 5)特征选择 6)主成分分析 1.去除唯一属性 如id属性,是唯一属性,直接去除就好 2.处理缺失值 ( ...

  4. python大战机器学习——集成学习

    集成学习是通过构建并结合多个学习器来完成学习任务.其工作流程为: 1)先产生一组“个体学习器”.在分类问题中,个体学习器也称为基类分类器 2)再使用某种策略将它们结合起来. 通常使用一种或者多种已有的 ...

  5. python大战机器学习——半监督学习

    半监督学习:综合利用有类标的数据和没有类标的数据,来生成合适的分类函数.它是一类可以自动地利用未标记的数据来提升学习性能的算法 1.生成式半监督学习 优点:方法简单,容易实现.通常在有标记数据极少时, ...

  6. python大战机器学习——聚类和EM算法

    注:本文中涉及到的公式一律省略(公式不好敲出来),若想了解公式的具体实现,请参考原著. 1.基本概念 (1)聚类的思想: 将数据集划分为若干个不想交的子集(称为一个簇cluster),每个簇潜在地对应 ...

  7. python大战机器学习——数据降维

    注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...

  8. Python大战机器学习——基础知识+前两章内容

    一  矩阵求导 复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix. x is a column vector, A is a matrix d(A∗x)/dx=A d( ...

  9. 【python与机器学习实战】感知机和支持向量机学习笔记(一)

    对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...

随机推荐

  1. CentOS7 网络管理工具nmcli

    今天帮别人调试虚拟机的网络问题(CentOS 7系统),习惯性直接改/etc/sysconfig/network-scripts/ifcfg-xxx配置文件,但是不知道为什么重启network后静态i ...

  2. hdu1085Holding Bin-Laden Captive!组合问题

    题目连接 题目意思:有单位价值为1 2 5的三种硬币,分别给出他们的数量,求用这些硬币不能组成的最小的价值 解题思路:普通的母函数 普通的母函数: 利用母函数的思想可以解决很多组合问题,下面举例说明: ...

  3. stack_1.设计一个有getMin功能的栈

    思路 : 生成两个栈($stack ,$stack_min ),往$stack塞数据($value)的时候 ,比较一下$value和$stack_min最上面的元素的大小,如果$value小,则压入$ ...

  4. JavaScript中的eval()函数详解

    和其他很多解释性语言一样,JavaScript同样可以解释运行由JavaScript源代码组成的字符串,并产生一个值.JavaScript通过全局函数eval()来完成这个工作     eval(“1 ...

  5. 【Jmeter】Jmeter聚合报告分析

    Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值 #Samples:表示你这次测试中一共发出了多少个请求 ...

  6. Advanced R之词汇表

    转载请注明出处:http://www.cnblogs.com/lizichao/p/4800513.html 词汇表 想要玩得转R,重要的一点是有一个好的工作词汇表.以下是我认为的一个好的词汇表.你不 ...

  7. 错误: 实例 "ahwater-linux-core" 执行所请求操作失败,实例处于错误状态。: 请稍后再试 [错误: Exceeded maximum number of retries. Exceeded max scheduling attempts 3 for instance 7c1609c9-9d0f-4836-85b3-cefd45f942a7. Last exception: [u

    错误: 实例 "ahwater-linux-core" 执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Exceeded maximum number of ret ...

  8. Deepin安装wxpython教程

    环境: 安装报错: 解决:  1.sudo apt-get install libgtk-3-dev -y 2.sudo apt-get install freeglut3-dev libgstrea ...

  9. reservoir sampling / random shuffle

    randomly choose a sample of k items from a list S containing n elements, the algorithm may be online ...

  10. MVN&nbsp;命令行

    Maven依赖查询: http://mvnrepository.com/ Maven常用命令:  1. 创建Maven的普通java项目:     mvn archetype:create     - ...