支持向量机(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)由此得到软间隔最大化分离超平面以及分类决策函数\

  实验代码:

 1 import matplotlib.pyplot as plt
 2 import numpy as np
 3 from sklearn import datasets,linear_model,cross_validation,svm
 4 
 5 def load_data_regression():
 6     diabetes=datasets.load_diabetes()
 7     return cross_validation.train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0)
 8 
 9 def load_data_classfication():
10     iris=datasets.load_iris()
11     X_train=iris.data
12     Y_train=iris.target
13     return cross_validation.train_test_split(X_train,Y_train,test_size=0.25,random_state=0,stratify=Y_train)
14 
15 def test_LinearSVC(*data):
16     X_train,X_test,Y_train,Y_test=data
17     cls=svm.LinearSVC()
18     cls.fit(X_train,Y_train)
19     print("Coefficients:%s,intercept %s"%(cls.coef_,cls.intercept_))
20     print("Score:%.2f"%cls.score(X_test,Y_test))
21 
22 X_train,X_test,Y_train,Y_test=load_data_classfication()
23 test_LinearSVC(X_train,X_test,Y_train,Y_test)

View Code