一、SVM代价函数
支持向量机(SVM, Support Vector Machines)是一种非常流行与强大的监督算法。
SVM 的代价函数与逻辑回归的代价函数很相似。
逻辑回归与 SVM 的代价函数
现在定义 分别为当 y=1 的分类代价,当 y=0时的分类代价。
SVM 代价函数演化过程
其中,参数 C 相当于 。当算法过拟合时,C 应该减小;当算法欠拟合时,C 应该增加。
SVM 代价函数最终形态
如果你有一个正样本,即, 则只有在 时,。换句话说,如果你有一个正样本,我们会希望 ;
反之,如果有一个负样本,即,则只有在 时,。
SVM 优化目标
最后,SVM 的假设函数 不再代表 的概率,而是直接输出预测值0或1
SVM 假设函数
二、大边距分类器
在SVMs中,决策边界有一个特殊的属性:尽可能远离正样本和负样本。决策边界与离便觉最近样本的距离称为边距。 由于 SVM 最大化此边距,因此通常称为「大边距分类器」。
大边距分类器
SVM 需要尽可能最大化边距,那么只有参数 C 值很大才能实现大边距。
因为参数 C 值很大,想要 ,我们必须选择满足 的参数 。这样,我们的优化目标:
2.2 数学解释:SVM 为何被称为大边距分类器?
解释之前需要讲解向量内积的知识:
向量内积数学含义
为了方便讲解,令 前者方便可视化,后者使决策边界过原点。
之前讲想要最小化代价函数时,我们得到如下结论:
如果 y = 1,我们希望
如果 y = 0,我们希望
根据向量内积,得 ,就有
如果 ,我们希望
如果 ,我们希望
因为只有参数 C 值很大才能实现大边距。
三、核函数(Kernels)
核函数允许 SVM 制作复杂的非线性分类器。
给定特征 ,根据与标志 的接近度计算出新的特征 ,即
对应的,SVM 代价函数变为
其中,函数就是核函数。SVM 有很多核函数,不同核函数运用场景也不同。常见的核函数是「高斯核函数」,如下图所示。
高斯核函数
高斯核函数有如下的特点如下图所示。换句话说,当特征 与标志 越接近,新特征 越接近 1;当特征 与标志 越远,新特征 越接近 0。
高斯核函数的特点
3.1 高斯核函数如何选取标志 呢?
这里提供一种方法:让每一个样本 等于每一个标志 ,即
那么,就有了 ,可以理解为
3.2 参数 C 与 的取值对高斯核函数的影响
核函数的参数
2.3 核函数的选取原则
不是所有的函数都能作为核函数,核函数必须满足一个技术性要求「默塞尔定理」,需要这个条件的原因是 SVM 算法或者 SVM 实现函数有许多熟练的数值优化技巧,为了有效求解参数 ,在最初的假设,这些决策都是用于把我们的注意力仅仅限制于可以满足「默塞尔定理」的核函数,这个定理的所做就是确保所有的 SVM 软件包能够使用大类的优化方法从而快速求解参数 。
四、SVM 的使用
现在已经有很多编写并优化过的 SVM 库可供直接调用,如 'liblinear' 和 'libsvm' 。 在实际应用中,应该调用 SVM 库,而不是自己编程实现 SVM 算法。
还需要注意两点:
选用高斯核函数时,要先对原特征 进行特征缩放;
并非所有相似性函数都是有效的核函数。 它们必须满足“Mercer定理”,这保证了 SVM 包中对核函数优化的运行正确。
Tips:大部分 SVM 软件包会自动增加特征 ,对于这类 SVM 软件包就不需要人工在数据集中增加特征 。最好,在使用某个 SVM 软件包之前,查看是否需要人为增加特征 。
五、逻辑回归与 SVM 选择
n = 特征数量( )
m = 样本数量
当 时,选用 逻辑回归模型;
当 较小, 适中时,选用高斯核函数的 SVM (比如n = 1~1000,m = 10~10,000);
当 时,就需要先增加特征后,再选用逻辑回归模型;
Tips:神经网络都能很好地应对上面几种情况,但是神经网络训练速度较慢
总结
SVM 实现步骤:
提取特征;
选择核函数,如果是高斯函数,还需要先进行特征缩放;
调用 SVM 软件包;
使用训练集训练模型,调整参数 C 和 执行 SVM;
用验证集计算模型误差率;
选择产生最小误差率的参数 C 和 。
% X, y, Xval, Yval 分别是训练集特征向量、训练集标签、验证集的特征向量、验证集标签C_list = [0.01,0.03,0.1,0.3,1,3,10,30]; sigma_list = [0.01,0.03,0.1,0.3,1,3,10,30]; min = [-1,0,0];for i = 1:size(C_list(:),1) for j = 1:size(sigma_list(:),1) model= svmTrain(X, y, C_list(i), @(x, l) gaussianKernel(x, l, sigma_list(j))); predictions = svmPredict(model, Xval); error = mean(double(predictions ~= yval)); if min(1) == -1 || min(1) > error min = [error, C_list(i), sigma_list(j)]; end endfor endfor
作者:数据搬瓦工
链接:https://www.jianshu.com/p/a2b23d501ca3
共同学习,写下你的评论
评论加载中...
作者其他优质文章