基于经典的支持向量机算法完成鸢尾花的分类问题( 三 )
本文插图
本文插图
代码执行结果为:
本文插图
根据代码的可视化执行结果及下面的预测类别和实际类别比较发现 , 有一个样本预测出现了问题 , 准确度是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值:将会有较少的支持向量 。 决策边界是被大多数支持向量所决定 , 它会尽量满足每一个样本 。
推荐阅读
- 泰迪小公举|原定演员临时辞演,找了个满口东北话的新人救场,却意外成就经典
- 娱乐圈|为何吴京要说女孩不要混娱乐圈?杨幂的例子太经典,柳岩却最无奈
- 卢伟冰|月销44万台,力压华为P40 Pro成老大,卢伟冰这波操作堪称经典
- 壁纸|支持 iOS 14 系统,隐藏 Dock 栏壁纸分享
- 西安王老师聊教育|饮食养生,当以何书为经典?
- 辣妹盘点酱|Hz高刷+鸿蒙OS华为Mate40,华为Mate30白菜价直呼残暴,支持144
- 移动信息IT杂谈三星Galaxy Note 20 Ultra:不支持100倍变焦,最高到50倍
- 追着幸福跑|两只“量子柴郡猫”交换笑脸
- 那年初夏|MIUI 12稳定版正式推送!率先支持13款机型,看看有你的吗?
- 游戏葡萄说|与妻儿聚少离多!17年23个世界冠军还差一纪录,马龙感谢家人支持
