【参考资料】
【1】《统计学习方法》
基本概念
- 当训练数据线性可分时,通过硬间隔最大化,学习一个线性的分类器,即线性可分支持向量机,又称硬间隔支持向量机;
- 当训练数据近似线性可分时,通过软间隔(增加一个松弛因子)后学习一个线性的分类器,即软间隔支持向量机;
- 当训练数据不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机
SVM的定义:
输入: 给定一个特征空间上的训练数据,其中分别表示二分类中的正例和负例。
方式: 通过间隔最大化得到一个超平面,这里表示特征空间的转换,基本就是
输出: 得到一个线性分类器
如上例所表示,存在两个正例点(3、3)和(4、3),一个负例点(1、1),由最优的超平面分割。
函数间隔
定义超平面(w、b)和样本点的函数间隔为
几何间隔
定义超平面(w、b)和样本点的几何间隔为
定义
SVM(硬间隔)
(重要)注意上面的最大间隔取的是其中一个样本点和超平面的距离,要就是说SVM的分割本质在于,一是对全部的样本进行正确分割,二是对最难分割的那个点仍然具有最好的分割效果(距离最大)
SVM的对偶解法(以硬分割为例)
对于本文一开始的实例,采用对偶方式求取最优值如下:
SVM(软间隔)
在硬间隔SVM的基础上增加一个松弛变量,使得优化问题转换为:
其中称为松弛变量,而C称为惩罚因子,也就是控制允许松弛的成都
SVM(核优化)
核技巧相当于把原始的输入空间映射到一个新的特征空间,之后再进行分类。例如高斯核函数:
则分类决策函数转变为:
SVM程序实现(基于sklearn)
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import svm
def iris_type(s):
it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
return it[s]
def _test_svm():
"""
采用鸢尾花卉数据集
"""
#converters 用以将第5列数据用iris_type进行映射
data = np.loadtxt("./data/iris.data", dtype=float, delimiter=',', converters={4: iris_type})
x, y = np.split(data, (4,), axis=1)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
"""
C: 惩罚系数。C越大,即对分错样本的惩罚程度越大,在训练样本中准确率越高,泛化能力降低,默认0.1
kernel: 核函数
linear: 线性核
poly: 多项式核
rbf: 高斯核
sigmoid: sigmoid核心函数
gamma: 核函数的系数
decision_function_shape: 支持多分类时使用,ovr和ovo代表不同的svm组成方式
"""
clf = svm.SVC(C=0.5, kernel='linear', decision_function_shape='ovr')
#clf = svm.SVC(C=0.9, kernel='rbf', gamma=10, decision_function_shape='ovr')
model = clf.fit(x_train, y_train.ravel())
y_test_pre = model.predict(x_test)
# 训练集上的预测结果
y_test = y_test.reshape(-1)
result = (y_test_pre == y_test)
acc = np.mean(result)
print('准确度: %.2f%%' % (100 * acc)) #准确度: 100.00% :)
pass
"""
说明:
svm分类代码实现,对应的笔记《13.2 支持向量机》
作者:fredric
日期:2018-9-24
"""
if __name__ == "__main__":
_test_svm()