硬间隔:硬间隔 SVM 假设数据是线性可分的,找到一个最大化间隔的超平面,不允许分类错误
软间隔:允许一定量的样本分类错误;优化函数包括两个部分,一部分是点到平面的间隔距离,一部分是误分类的损失个数;C是惩罚系数,误分类个数在优化函数中的权重值;权重值越大,误分类的损失惩罚的越厉害。误分类的损失函数可分为hinge损失,指数损失,对率损失。而经常使用的或者说默认的是使用了损失函数为hinge损失的软间隔函数。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
# 生成示例数据
X, y = make_blobs(n_samples=100, centers=2, random_state=6)
y = np.where(y == 0, -1, 1) # 将标签转换为 -1 和 1
# 硬间隔 SVM
hard_margin_svm = svm.SVC(kernel='linear', C=1e10) # C 值非常大,接近硬间隔
hard_margin_svm.fit(X, y)
# 软间隔 SVM
soft_margin_svm = svm.SVC(kernel='linear', C=0.01) # C 值较小,允许分类错误
soft_margin_svm.fit(X, y)
# 绘制决策边界
def plot_svm(svm, X, y, title):
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='bwr', alpha=0.7)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = svm.decision_function(xy).reshape(XX.shape)
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
ax.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='k')
plt.title(title)
plt.show()
# 绘制硬间隔 SVM 的决策边界
plot_svm(hard_margin_svm, X, y, "Hard Margin SVM")
# 绘制软间隔 SVM 的决策边界
plot_svm(soft_margin_svm, X, y, "Soft Margin SVM")