(Scikit-Learn)支持向量机详解 & 人脸识别实战

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns; sns.set()
from sklearn.datasets.samples_generator import make_blobs
X,y = make_blobs(n_samples=50, centers=2, random_state=0, cluster_std=0.60)
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='autumn')

在这里插入图片描述
对于上面两类线性可分的数据。线性判别分类器尝试画一条将数据分成两部分的直线,这样就构成了一个分类模型。对于上图的二维数据来说,这个任务其实可以手动完成。但是我们马上发现一个问题:在这两种类型之间,有不止一条直线可以将它们完美分割

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='autumn')
plt.plot([0.6], [2.1], 'x', color='red', markeredgewidth=2, markersize=10)

for m, b in [(1, 0.65), (0.5, 1.6), (-0.2, 2.9)]:
    plt.plot(xfit, m*xfit + b, '-k')
plt.xlim(-1, 3.5)

在这里插入图片描述
虽然这三个不同的分割器(三条直线)都能完美地判别这些样本,但是选择不同的分割线,可能会让新 的数据点(例如:图中的“X”点)分配到不同的标签。
在众多“完美”的分割线中,如何才能找到最好的一条呢?或者说到底哪一条分割线才是最好的呢?


支持向量机: 边界最大化
对于上面的三条分割线,我们可以使用它们到最近样本点的边界的宽度来衡量它们之间的好坏程度。
在支持向量机中,选择边界最大(即离最近的样本点最远)的那条线是模型的最优解。
支持向量机其实就是一个边界最大化评估器

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:,0], X[:,1], c=y, s=50, cmap='autumn')
plt.plot([0.6], [2.1], 'x', color='red', markeredgewidth=2, markersize=10)

for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
    yfit = m * xfit + b
    plt.plot(xfit, yfit, '-k')
    plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none', color='#AAAAAA', alpha=0.4)
plt.xlim(-1, 3.5)

在这里插入图片描述
如上图所示,就三面三条分割线而言,中间一条的边界(宽度d)最大,是最好的。


1. 拟合支持向量机
用 Scikit-Learn 的支持向量机分类器在数据上训练一个 SVM 模型。这里用一个线性核函数,并将参数 C 设置为一个很大的数(这个参数我们在后面会介绍)

from sklearn.svm import SVC
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值