支持向量机(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. capsule network——CNN仅仅考虑了“有没有”的问题,没有考虑feature map的结构关系。这个结构关系包括位置,角度等。Capsule layer的输出也跟feature map的max-pooling输出不同,capsule layer的输出是一个向量,这个向量包含了位置,大小,角度等信息,这是feature map仅能输出一个值所不具备的;训练比较慢

    capsule network--<Dynamic Routing Between Capsules> from:https://zhuanlan.zhihu.com/p/31491520 ...

  2. python基础-文本操作

    文件IO #文件的基本操作 1.在python中你可以用file对象做大部分的文件操作 2.一般步骤: 先用python内置的open()函数打开一个文件,并创建一个file对象, 然后调用相关方法进 ...

  3. 二:apache的Qpid消息中间件介绍

    一:什么是Qpid?--->Qpid 是 Apache 开发的一款面向对象的消息中间件,它是一个 AMQP 的实现,可以和其他符合 AMQP 协议的系统进行通信.--->Qpid 提供了 ...

  4. 洛谷 P1496 火烧赤壁

    题目描述 曹操平定北方以后,公元208年,率领大军南下,进攻刘表.他的人马还没有到荆州,刘表已经病死.他的儿子刘琮听到曹军声势浩大,吓破了胆,先派人求降了. 孙权任命周瑜为都督,拨给他三万水军,叫他同 ...

  5. js 图片上传

    可能很多不熟悉的图片上传的同学会觉得有点懵,其实做过一次你就会发现特别的简单. 只是一个formData格式的表单提交,把地址写到 action = "" 里面就可以了,当然你可以 ...

  6. Azure一个Cloud Service支持多个公网地址

    Azure刚刚发布在同一个Cloud Service下支持多个公网IP地址的功能. 这个功能主要是用于: 当相同的端口需要公用相同的LoadBalance时. 比如: 一种使用场景是多组Web服务器被 ...

  7. In-App Purchase Programming Guide----(八) ---- Preparing for App Review

    Preparing for App Review After you finish testing, you’re ready to submit your app for review. This ...

  8. day4 DOM,BOM

    1.     BOM编程 1.1. BOM编程基础 全称 Browser Object Model,浏览器对象模型. JavaScript是由浏览器中内置的javascript脚本解释器程序来执行ja ...

  9. CodeForces 489C Given Length and Sum of Digits... (dfs)

    C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...

  10. HDU - 1114 Piggy-Bank 完全背包(背包恰好装满)

    Piggy-Bank Before ACM can do anything, a budget must be prepared and the necessary financial support ...