1. 基础概念
什么是SVM:支持向量机就是使用一条直线(二维)或超平面(多维)将数据分成两类,同时保证离超平面最近的点与超平面的间隔尽可能小。
支持向量:离超平面最近的几个训练样本,且满足
间隔(margin):分类不同的支持向量之间的距离
γ=2∥w∥
γ
=
2
‖
w
‖
。
对偶问题:在求解分类器时过于复杂,为了简化问题,我们将目标函数和约束函数融入新的函数,即使用拉格朗日乘子法得到“对偶问题”。
核函数:当训练样本不是线性可分时,需要使用到核函数。核函数将样本维数映射到更高维的空间,使得样本在高维空间中线性可分。核函数
k(⋅,⋅)=ϕ(xi)Tϕ(xj)
k
(
⋅
,
⋅
)
=
ϕ
(
x
i
)
T
ϕ
(
x
j
)
,
ϕ(x)
ϕ
(
x
)
表示x映射后的特征向量。
常用核函数:
软间隔:在现实生活中很难找到合适的核函数使得训练样本线性可分,因此需要引入“软间隔”。软间隔是指允许某些样本出错,但是要让错误尽可能小。三种常见的替代损失函数:
支持向量回归(SVR):传统的回归模型是计算模型输出
f(x)
f
(
x
)
与真实值输出y之间的差别来计算损失,而支持向量回归有个容忍偏差
ϵ
ϵ
,即仅当
f(x)
f
(
x
)
与y差值大于
ϵ
ϵ
时才计算损失。
2. sklearn实战
选取了机器学习实战第6课的数据进行实验,相关数据和代码可前往:
https://github.com/AugusXJ/scikit_learn/tree/master/SVM
from sklearn import metrics
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
import numpy as np
# 读取数据
X = []
Y = []
fr = open("testSetRBF.txt")
index = 0
for line in fr.readlines():
line = line.strip()
line = line.split('\t')
X.append(line[:2])
Y.append(line[-1])
plt.scatter(np.array(X)[:,0],np.array(X)[:,1])
plt.show()
#归一化
scaler = MinMaxScaler()
X = scaler.fit_transform(X)
# 交叉分类
train_X,test_X, train_y, test_y = train_test_split(X,
Y,
test_size=0.2) # test_size:测试集比例20%
# KNN模型,选择3个邻居
model = SVC(kernel='rbf', degree=2, gamma=1.7)
model.fit(train_X, train_y)
print(model)
expected = test_y
predicted = model.predict(test_X)
print(metrics.classification_report(expected, predicted)) # 输出分类信息
label = list(set(Y)) # 去重复,得到标签类别
print(metrics.confusion_matrix(expected, predicted, labels=label)) # 输出混淆矩阵信息