“分割带”代表了模型划分样本点的能力或可信度,“分割带”越宽,说明模型能够将样本点划分得越清晰,进而保证模型泛化能力越强,分类的可信度越高;反之,“分割带”越窄,说明模型的准确率越容易受到异常点的影响,进而理解为模型的预测能力越弱,分类的可信度越低。
线性可分的 所对应的函数间隔满足 的条件,故 就等于 。所以,可以将目标函数 等价为如下的表达式:
假设存在一个需要最小化的目标函数 ,并且该目标函数同时受到 的约束。如需得到最优化的解,则需要利用拉格朗日对偶性将原始的最优化问题转换为对偶问题,即:
分割面的求解
分割面的表达式
对于非线性SVM模型而言,需要经过两个步骤,一个是将原始空间中的样本点映射到高维的新空间中,另一个是在新空间中寻找一个用于识别各类别样本点线性“超平面”。
假设原始空间中的样本点为 ,将样本通过某种转换 映射到高维空间中,则非线性SVM模型的目标函数可以表示为:
其中,内积 可以利用核函数替换,即 。对于上式而言,同样需要计算最优的拉格朗日乘积 ,进而可以得到线性“超平面” 与 的值:
假设原始空间中的两个样本点为 ,在其扩展到高维空间后,它们的内积 如果等于样本点 在原始空间中某个函数的输出,那么该函数就称为核函数。
线性核函数的表达式为 ,故对应的分割“超平面”为:
多项式核函数的表达式为 ,故对应的分割“超平面”为:
高斯核函数的表达式为 ,故对应的分割“超平面”为:
Sigmoid 核函数的表达式为 ,故对应的分割“超平面”为:
在实际应用中, SVM 模型对核函数的选择是非常敏感的,所以需要通过先验的领域知识或者交叉验证的方法选出合理的核函数。大多数情况下,选择高斯核函数是一种相对偷懒而有效的方法,因为高斯核是一种指数函数,它的泰勒展开式可以是无穷维的,即相当于把原始样本点映射到高维空间中。
output_13_0.png
这是一个多元支持向量机回归的模型,以下是一个参考的实现代码:import numpy as npimport matplotlib.pyplot as pltfrom sklearn import svmfrom sklearn.metrics import r2_score
# 模拟数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(80, 1), axis=0)
y = np.sin(X).ravel()
y[::5] += 3 * (0.5 - np.random.rand(16))
# 分割数据
train_X = X[:60]
train_y = y[:60]
test_X = X[60:]
test_y = y[60:]
# 模型训练
model = svm.SVR(kernel='rbf', C=1e3, gamma=0.1)
model.fit(train_X, train_y)
# 预测结果
pred_y = model.predict(test_X)# 计算R2r2 = r2_score(test_y, pred_y)
# 对比图
plt.scatter(test_X, test_y, color='darkorange', label='data')
plt.plot(test_X, pred_y, color='navy', lw=2, label='SVR model')
plt.title('R2={:.2f}'.format(r2))
plt.legend()
plt.show()
上面的代码将数据分为训练数据和测试数据,使用SVR模型对训练数据进行训练,然后对测试数据进行预测。计算预测结果与真实值的R2,最后将结果画出对比图,以评估模型的效果。