监督学习——支持向量机(Support Vector Machine--SVM)

版权声明:本文是原创文章,转载需注明出处。 https://blog.csdn.net/laboirousbee/article/details/89004950

目录

 

距离最小化

误差最小化

感知器算法

分类误差

边际误差

误差函数

边际误差计算

误差函数

C参数

多项式内核

RBF核函数

slearn中的支持向量机

超参数


距离最小化

离线最近的点到线的距离,然后这些最近的点中哪个离线距离更远,选择距离大的那个,简单来说,这是支持向量机工作原理。

误差最小化

用两种方法测量下面图片的模型:一种是看它误分类了多少点,另一种是看间隔有多宽。 总误差=分类误差+边际误差,将此误差最小化,有助于学习支持向量机的算法。

感知器算法

下面的模型误差为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=w1​x1​+w2​x2​.

请注意,在这里我们有三条线,方程如下:

  • Wx+b=1Wx+b=1
  • Wx+b=0Wx+b=0
  • Wx+b=-1Wx+b=−1

由于这三条线为等距平行线,要想确定第一条线和第三条线之间的距离,我们只需要计算前两条线之间的距离,接着将这个数字乘以二。这也就是说我们需要确定图 1 中前两条线之间的距离。

                                                                                                 图 1

请注意,由于我们只需计算线条之间的距离,因此也可以将线条平移,直到其中一条线与原点相交(图 2)。这时得到的方程如下:

  • Wx=0Wx=0
  • Wx=1Wx=1

                                                                                                图 2

现在,第一条线的方程为 Wx=0Wx=0,这意味着它与标记为红色的向量(图 3) W = (w_1, w_2)W=(w1​,w2​) 垂直。

                                                                                          图 3

该向量与方程为 Wx=1Wx=1 的线条相交于蓝点(图 4)。假设该点的坐标为 (p,q)(p,q)。那么我们可以得到下面两个结果:

  • w_1p + w_2q = 1w1​p+w2​q=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​+w22​1​=∣W∣21​。这也就是说,蓝点表示向量 \frac{W}{|W|^2}∣W∣2W​,如图 4 所示。

                                                                                          图 4

现在,两条线之间的距离是蓝色向量的范数。由于分母是一个标量,向量 \frac{W}{|W|^2}∣W∣2W​ 的范数正是 \frac{|W|}{|W|^2}∣W∣2∣W∣​,与 \frac{1}{|W|}∣W∣1​(图 5)相同。

                                                                                           图 5

最后,最终距离是这连续两条平行线(图 6)之间的距离之和。由于每两条线之间的距离为 \frac{1}{|W|}∣W∣1​,那么总距离为 \frac{2}{|W|}∣W∣2​。

                                                                                        图 6

误差函数

误差 = 分类误差 + 边际误差,用梯度下降法获取最小的误差。

C参数

C参数只是分类误差之前的一个常数,需要将分类误差乘以这个常数。为了正确调整C的值,使用网格搜索等技巧。

多项式内核

有些分类无法用直线简单的分开,采用一些非线性或者增加维度的方法将数据分类,采用的某种方法叫做某种核。

RBF核函数

径向基函数 (Radial Basis Function 简称 RBF),

径向基函数是选择陡峭的还是平缓的,通过超参数伽马参数(\gamma), \gamma越大,曲线越陡,\gamma越小,曲线月平缓。

在高维度下,一个大的\gamma参数呈现顶尖状态的山型,如果\gamma参数较小,就比较平缓。

从下面的图可以看出,\gamma值过大导致过拟合,\gamma值过小导致欠拟合

\gamma\sigma是互为相反数,\gamma越大,\sigma越小,图形越陡;\gamma越小,\sigma越大,图形越平缓,

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)

猜你喜欢

转载自blog.csdn.net/laboirousbee/article/details/89004950
今日推荐