算法四:支持向量机 说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了
这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”
不过我还是打算写写SVM的基本想法与 libSVM中R的接口
一、SVM的想法 回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大
那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢
要回答这个问题,我们首先必须思考如何确定点的代表性
我想关于代表性至少满足这样一个条件:无论非代表性点存在多少,存在与否都不会影响我们的决策结果
显然如果仍旧使用 KNN算法的话,是不会存在训练集的点不是代表点的情况
那么我们应该选择一个怎样的“距离”满足仅依靠代表点就能得到全体点一致的结果
我们先看下面一个例子:假设我们的训练集分为正例与反例两类,分别用红色的圆圈与蓝色的五角星表示,现在出现了两个未知的案例,也就是图中绿色的方块,我们如何去分类这两个例子呢
在KNN算法中我们考虑的是未知样例与已知的训练样例的平均距离,未知样例与正例和反例的“距离”谁更近,那么他就是对应的分类
同样是利用距离,我们可以换一个方式去考虑:假设图中的红线是对正例与反例的分类标准(记为 w x+b=0),那么我们的未知样例与红线的“距离”就成了一个表示分类信度的标准,而 w y+b(y为未知样例的数据)的符号则可以看成是分类的标识
但是遗憾的是我们不知道这样的一条分类标准(分类线)是什么,那么我们一个比较自然的想法就是从已知的分类数据(训练集)里找到离分割线最近的点,确保他们离分割面尽可能的远
这样我们的分类器会更稳健一些
从上面的例子来看,虚线穿过的样例便是离分割线最近的点,这样的点可能是不唯一的,因为分割线并不确定,下图中黑线穿过的训练样例也满足这个要求: