支持向量机
与逻辑回归和神经网络相比,支持向量机(SVM)在学习复杂的非线性方程时会提供一种更为清晰、更为强大的方式。
1、支持向量机的代价函数
从逻辑回归的代价函数来推导支持向量机的代价函数,已知逻辑回归的代价函数如下:
J( θ )=−1m∑mi=1[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
由于参数 1/m 不影响代价函数大小的比较,这里只看 Cost 函数:
Cost = −(y logh θ (x)+(1−y)log(1−h θ (x)))
=−y log11+e− θ TX−(1−y)log(1−11+e− θ TX)
当y=1时,这时需要 θ TX≫0 ,Cost 函数中的第二项为 0,Cost=− log11+e− θ TX ;
当y=0时,这时需要 θ TX≪0,Cost 函数中的第一项为 0,Cost=− log(1−11+e− θ TX) 。
z= θ TX 和 Cost 函数的曲线如下:
图中的黑线是逻辑回归 Cost 函数的曲线,在此基础上修改曲线得到支持向量机的 Cost 函数。
如左图所示,使用两条直线来近似黑线,两条直线的拐点是z=1这一点,标记为 Cost1(z);右图也是使用两条直线来近似黑线,两条直线的拐点是z=-1这一点,标记为 Cost0(z),由此得到粉线是支持向量机的 Cost 函数的曲线。可以看出粉色的线与黑色的线非常类似,却更简洁,所以它可以做和逻辑回归中类似的事情,也能在计算上有很大的优势。不需要考虑粉色线函数表达形式,这里只是讲解它近似的思想。
因此我们得到支持向量机的代价函数:
minθC∑mi=1[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+12∑nj=1θ2j
这里的参数 C 没有明确的定义,可以把它考虑成 1⁄λ ,它和 1⁄λ 扮演相同的角色。因此,它的选择也和 1⁄λ 类似。当 C 值过大时,会导致过拟合的问题,使支持向量机达不到更好的效果。当 C 选值比较合适时,它可以忽略掉一些异常点的影响 得到更好的决策界。甚至当数据不是线性可分的时候,支持向量机也可以给出好的结果。
和逻辑回归的输出概率不同,当最小化代价函数得到参数θ 时,支持向量机是使用θ 来直接预测y的值是1还是0。当θ^T X 大于等于0时,假设函数会预测y=1。
支持向量机也被称为大间距分类器,为了获得更大的间距,这里使用假设函数预测 y 等于 1 还是 0 的决策边界不再是 θ TX=0,而是进行了进一步的优化。
这是 Cost 函数的图像,我们可以直观的看到,当 z≥1 时,Cost1(z)=0;当z≤-1 时,Cost0(z)=0 。
因此这里改变假设函数为:
这样,最后的到的决策边界会有大一点的间距,会比较有趣。
2、核函数
为了选取更好的更合适的特征向量,引入了核函数,这里采用的是高斯核函数。新的特征向量为:
f1=similarity(x,l(1))=e(−∥x−l(1)∥22σ2)
其中 ∥x−l(1)∥2=∑nj=1(xj−l(1)j)2,为训练样本 X 中的所有特征与 l 之间的距离和。l 是标记点,这里直接将所有的训练样本选为标记点。
如果训练样本与标记点的距离近似为0,新的特征 f=e−0=1;
如果训练样本与标记点的距离比较远,新的特征 f=e−较大值=0。
上式中的 σ 2 的值决定了随着x的改变 f 值改变的速率。
由上图可以看到,当 σ 2 较大时,等高线的圆会变得比较发散,f值的改变速率会变慢,导致高方差、过拟合。当 σ 2 较小时,等高线的圆会变得比较密集,会导致高偏差、欠拟合。
这里给出了使用核函数构造新的特征向量后的假设函数 和代价函数:
![]()
minθC∑mi=1[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+12∑n=mj=1θ2j
如果我们使用高斯核函数,那么在使用之前必须要进行归一化。
支持向量机也可以不使用核函数,不使用核函数又称为线性核函数。除了高斯核函数之外,也可以使用别的核函数,例如:多项式核函数、字符串核函数等,这些核函数需要满足Mercer’s定理,才能被支持向量机的优化软件正确处理。
如何选择是使用逻辑回归、高斯核函数的支持向量机还是线性核函数的支持向量机呢?
- 当训练集的特征数 n 远远大于训练样本数 m 时,训练集的数据不够支持我们训练一个复杂的非线性模型,应该选用逻辑回归模型或者线性核函数的支持向量机。
- 如果特征数 n 较小,训练样本数 m 大小适中,则使用高斯核函数的支持向量机。
- 如果特征数 n 较小,训练样本数 m 较大,应该增加更多的特征,然后使用逻辑回归或者线性核函数的支持向量机。
神经网络在以上的三种情况下都可能会有较好的表现,但是训练神经网络可能非常慢,选择支持向量机的原因是它的代价函数是凸函数,不存在局部最小值。