目录
距离最小化
离线最近的点到线的距离,然后这些最近的点中哪个离线距离更远,选择距离大的那个,简单来说,这是支持向量机工作原理。
误差最小化
用两种方法测量下面图片的模型:一种是看它误分类了多少点,另一种是看间隔有多宽。 总误差=分类误差+边际误差,将此误差最小化,有助于学习支持向量机的算法。
感知器算法
下面的模型误差为6(1+2+0.5+2.5),通过梯度下降法最小化误差,从而找到理想的W和b,找到最优分割,这就是感知机算法。
分类误差
边际误差
大的间隔小的误差,小的间隔大的误差,想要惩罚较小的间隔,以获得尽可能大间隔的模型。
误差函数
例子:
边际误差:即向量w模的平方,和L2正则化中的正则化项一样。
边际误差计算
在本选修部分,我们将会计算 SVM 中两个间隔之间的距离。
首先,W = (w_1, w_2)W=(w1,w2) ,x = (x_1,x_2)x=(x1,x2),并且 Wx = w_1x_1 + w_2x_2Wx=w1x1+w2x2.
请注意,在这里我们有三条线,方程如下:
- Wx+b=1Wx+b=1
- Wx+b=0Wx+b=0
- Wx+b=-1Wx+b=−1
由于这三条线为等距平行线,要想确定第一条线和第三条线之间的距离,我们只需要计算前两条线之间的距离,接着将这个数字乘以二。这也就是说我们需要确定图 1 中前两条线之间的距离。
请注意,由于我们只需计算线条之间的距离,因此也可以将线条平移,直到其中一条线与原点相交(图 2)。这时得到的方程如下:
- Wx=0Wx=0
- Wx=1Wx=1
现在,第一条线的方程为 Wx=0Wx=0,这意味着它与标记为红色的向量(图 3) W = (w_1, w_2)W=(w1,w2) 垂直。
该向量与方程为 Wx=1Wx=1 的线条相交于蓝点(图 4)。假设该点的坐标为 (p,q)(p,q)。那么我们可以得到下面两个结果:
- w_1p + w_2q = 1w1p+w2q=1 (由于该点位于这条线上),并且
- 由于该点位于向量 W = (w_1, w_2)W=(w1,w2) 上,(p,q)(p,q) 是 (w_1, w_2)(w1,w2) 的倍数。
我们可以这样求解这个方程:对于某个 k 值而言,有 (p,q) = k(w_1, w_2)(p,q)=k(w1,w2)。那么我们的第一个方程将被转换为 k(w_1^2 + w_2^2) = 1.k(w12+w22)=1.。因此,k = \frac{1}{w_1^2+w_2^2} = \frac{1}{|W|^2}k=w12+w221=∣W∣21。这也就是说,蓝点表示向量 \frac{W}{|W|^2}∣W∣2W,如图 4 所示。
现在,两条线之间的距离是蓝色向量的范数。由于分母是一个标量,向量 \frac{W}{|W|^2}∣W∣2W 的范数正是 \frac{|W|}{|W|^2}∣W∣2∣W∣,与 \frac{1}{|W|}∣W∣1(图 5)相同。
最后,最终距离是这连续两条平行线(图 6)之间的距离之和。由于每两条线之间的距离为 \frac{1}{|W|}∣W∣1,那么总距离为 \frac{2}{|W|}∣W∣2。
误差函数
误差 = 分类误差 + 边际误差,用梯度下降法获取最小的误差。
C参数
C参数只是分类误差之前的一个常数,需要将分类误差乘以这个常数。为了正确调整C的值,使用网格搜索等技巧。
多项式内核
有些分类无法用直线简单的分开,采用一些非线性或者增加维度的方法将数据分类,采用的某种方法叫做某种核。
RBF核函数
径向基函数 (Radial Basis Function 简称 RBF),
径向基函数是选择陡峭的还是平缓的,通过超参数伽马参数(), 越大,曲线越陡,越小,曲线月平缓。
在高维度下,一个大的参数呈现顶尖状态的山型,如果参数较小,就比较平缓。
从下面的图可以看出,值过大导致过拟合,值过小导致欠拟合
和是互为相反数,越大,越小,图形越陡;越小,越大,图形越平缓,
slearn中的支持向量机
>>> from sklearn.svm import SVC
>>> model = SVC()
>>> model.fit(x_values, y_values)
>>> print(model.predict([ [0.2, 0.8], [0.5, 0.4] ]))
[[ 0., 1.]]
超参数
当我们定义模型时,可以指定超参数。正如在此部分中看到的,最常见的超参数包括:
C
:C 参数。kernel
:内核。最常见的内核为 'linear'、'poly' 和 'rbf'。degree
:如果内核是多项式,则此参数为内核中的最大单项式次数。gamma
:如果内核是径向基函数,则此参数为 γ 参数。
例如:
>>> model = SVC(kernel='poly', degree=4, C=0.1)
练习:
# Import statements
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
# Read the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y.
X = data[:,0:2]
y = data[:,2]
# TODO: Create the model and assign it to the variable model.
# Find the right parameters for this model to achieve 100% accuracy on the dataset.
model = SVC(kernel='rbf', gamma=27)
# TODO: Fit the model.
model.fit(X, y)
# TODO: Make predictions. Store them in the variable y_pred.
y_pred = model.predict(X)
# TODO: Calculate the accuracy and assign it to the variable acc.
acc = accuracy_score(y, y_pred)