基于经典的支持向量机算法完成鸢尾花的分类问题( 三 )



基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
代码执行结果为:
基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
根据代码的可视化执行结果及下面的预测类别和实际类别比较发现 , 有一个样本预测出现了问题 , 准确度是90% 。

  • 正如我们所见 , kernel=''linear''(线性和函数)给了我们线性的决策边界:两类之间的分离边界是直线 。
  • 多分类的工作方式就是''one versus one'' :在任意两类样本之间设计一个SVM , 因此k个类别的样本就需要设计k(k-1)/2个SVM 。 当对一个未知样本进行分类时 , 最后得票最多的类别即为该未知样本的类别 。
  • 线性支持向量分类器(LinearSVC):对于线性核函数 , 有一个新的对象LinearSVC, 它使用了不同的算法 。 在某些数据集上运行地更快(比如稀疏数据集 , 文本挖掘就是典型的例子) 。 它对于多分类采用的是''one versus all''策略 。 线将一个类别和其它类别做一个分类 , 以此类推 。
代码上体现一对多的分类就是:
svc = svm.LinearSVC()
效果为:
基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
我们分类边界是根据一些样本点来确定的 , 不是全部 , 这些样本点我们称为支持向量 , 那么在当前案例中究竟哪些点为支持向量呢?
支持向量:就是最靠近分离边界的样本点 。 支持向量机的工作方式就是找到这些支持向量 , 它们被认为是在二分类问题中最具代表性的样本点 。 为了更方便的可视化 , 我们选择二分类问题 , 也就是只考虑鸢尾花数据集中的1类和2类样本 。 这两类不是线性可分的 , 我们查找此时的支持向量支持向量的坐标可以通过方法support_vectors_来找到 。 我们在图中将对它们着重标记 。 我们将所有的训练数据都在图中表示出来 , 其中哪个样本属于支持向量 , 我将其白色表示 。
基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
这个代码的意思为
x_train, y_train = x_train[np.in1d(y_train, [1, 2])], y_train[np.in1d(y_train, [1, 2])]plot_estimator(svc,x_train, y_train)pl.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=cmap_bold)pl.axis('tight')pl.axis('off')pl.tight_layout()pl.scatter(svc.support_vectors_[:, 0], svc.support_vectors_[:, 1], s=5, facecolors='white')pl.show()
np.in1d(A , B)的意思是在序列A中寻找与序列B相同的值 , 并返回一逻辑值(True,False)或逻辑值构成的向量,上面代码的意思就是在y_train中查找[1,2]这两个类别 , 是的化就为true , 不是就是false , 最终的x_train,y_train就是类别1 , 2的样本了 , 就把类别为0的给过滤了 。
下面就是拟合这部分数据
然后画出训练数据的散点图
然后将支持向量画在图中 , 大小s为5 , 填充颜色为white , 这样就可以方便我们看出哪些样本是支持向量了 , 效果为:
基于经典的支持向量机算法完成鸢尾花的分类问题
本文插图
正则化:
只考虑支持向量其实就是一种正则化的形式 。 实际上 , 它强迫模型在处理样本特征的时候变得更加简单 。 正则项可以通过调整系数 C 来决定:小的C值:将会有很多支持向量 。 决策边界=类别A的平均值-类别B的平均值 , 它会忽略一些样本的影响大的C值:将会有较少的支持向量 。 决策边界是被大多数支持向量所决定 , 它会尽量满足每一个样本 。


推荐阅读