以下内容转自 数析学院,只节选了部分,有需要的同学可以直接查看原文
在 Python 中如何利用 Scikit-Learn 等工具库构建并使用支持向量机模型
- %matplotlib inline
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy import stats
- # 调用 seaborn ,并将其设置为绘图默认配置
- import seaborn as sns; sns.set()
利用 make_blobs 函数生成本节示例数据——两组有明显集群特征的随机样本点:
- 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);
支持向量机中,几何间隔是分类器的重要属性,可以通过如下方法在二维空间中绘制分类平面的几何间隔:
- xfit = np.linspace(-1, 3.5)
- plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
- 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);
准备工作就绪,接下来我们导入 Scikit-Learn 的支持向量机工具包 SVC ,并对模型进行构建与训练:
- from sklearn.svm import SVC # "支持向量分类器"
- model = SVC(kernel='linear', C=1E10)
- model.fit(X, y)
SVC(C=10000000000.0, cache_size=200, class_weight=None, coef0=0.0, decision_function_shape=None, degree=3, gamma='auto', kernel='linear', max_iter=-1, probability=False, random_state=None, shrinking=True, tol=0.001, verbose=False)
利用以上演示过的内容,构建如下函数 plot_svc_decision_function ,用于描绘我们训练的支持向量分类器在二维空间中的分类边界:
- def plot_svc_decision_function(model, ax=None, plot_support=True):
- """绘制一个二维支持向量分类器的分类边界"""
- if ax is None:
- ax = plt.gca()
- xlim = ax.get_xlim()
- ylim = ax.get_ylim()
-
- # create grid to evaluate model
- x = np.linspace(xlim[0], xlim[1], 30)
- y = np.linspace(ylim[0], ylim[1], 30)
- Y, X = np.meshgrid(y, x)
- xy = np.vstack([X.ravel(), Y.ravel()]).T
- P = model.decision_function(xy).reshape(X.shape)
-
- # 绘制 decision boundary 和 decision margins
- ax.contour(X, Y, P, colors='k',
- levels=[-1, 0, 1], alpha=0.5,
- linestyles=['--', '-', '--'])
-
- # 绘制支持向量
- if plot_support:
- ax.scatter(model.support_vectors_[:, 0],
- model.support_vectors_[:, 1],
- s=300, linewidth=1, facecolors='none');
- ax.set_xlim(xlim)
- ax.set_ylim(ylim)
对于本节的示例数据,模型训练得出的分类边界如下所示:
- plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
- plot_svc_decision_function(model);
通过模型的 support_vectors_ 属性,我们可以查看模型中的支持向量:
- model.support_vectors_
以上内容节选自 数析学院,后文还有介绍 其他核函数分类器以及人脸识别实例等,内容较多,先搬运到这,有需要的同学可以先直接到 数析学院 查看原文


雷达卡





京公网安备 11010802022788号







