contourf参数 python_Python机器学习(六)
3.4 使用支持向量机最大化分类间隔
0 引子
支持向量机(SVM)可以看做感知器的拓展。感知器算法中,我们可以最小化分类误差。而在SVM中,我们的优化目标是最大化分类间隔。此处间隔是指两个分离的超平面的距离,而最靠近超平面的训练样本被称作支持向量。
1 对分类间隔最大化的直观认识
其实就是确定了决策边界的系数之后,移动决策边界(超平面),使得平行的两个超平面在保持依然为决策边界的前提下,距离最大化。
注:在实践中,通过二次规划的方法很容易得到我们想得到的最值。
2 使用松弛变量解决非线性可分问题
- 原因
对于非线性可分的数据来说,需要放松线性约束条件,以保证在适当的罚项成本下,对错误分类的情况进行优化时能够收敛。
- SVM与logistic回归
logistic回归优点:
logistic回归会尽量最大化训练数据集的条件似然,这使得它比支持向量机更易于处理离群点;
logistic回归模型简单更容易实现;
logistic回归模型更新方便,当应用于流数据分析时,这是非常具备吸引力的。
SVM优点:
支持向量机更关注接近决策边界的点。
3 使用scikit-learn实现SVM
前面章节用到了scikit-learn中的Perception和LogisticRegression类,它们都使用了LIBINEAR库,LIBLINEAR是高度优化的C/C++库。类似的,用于训练SVM模型的SVC类使用了LIBSV M库。
与使用原生python代码实现线性分类器相比,使用 LIBLINEAR和LIBSVM库实现由其优点:在用于大型数据时,可以获得极高的训练速度,然而有时候数据集很大导致没办法加载到内存中,针对这种情况,scikit-learn提供了SGDClassifier类供用户选择,这个类还通过partial_fit方法支持在线学习。SGDClassifier类背后的概念类似于第2章中实现的随机梯度算法。我们可以使用默认参数以如下方式分别初始化基于随机梯度下降的感知器、logistic回归以及支持向量机模型。
from sklearn.linear import SGDClassifier
ppn = SGDClassifier(loss = 'perception')
lr = SGDClassifier(loss='log')
svm = SGDClassifier(loss='hinge')
3.5 使用核SVM解决非线性问题
0 引子
支持向量机可以很容易的使用“核技巧”来解决非线性可分问题。在讨论SVM的基本概念之前,先通过一个例子来认识一下所谓的非线性可分问题到底是什么。
1 例子
通过如下代码,我们使用Numpy中的logical_xor函数创建了一个经过异或操作的数据集,其中100个样本属于类别1,另外的100个样本属于类别-1
import numpy as np
import matplotlib.pyplot as pltnp.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1')
plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1')
plt.ylim(-3.0)
plt.legend()
plt.show()
执行上述代码可以得到一个异或数据集,其图像为:
显然通过之前的SVM和logistic回归模型是不能把它线性分类的,从图里面也看不出明显的线性决策边界。
而核方法处理此类非线性可分数据的基本理念就是:通过映射函数把样本的原始特征映射到一个使样本线性可分的更高维空间中。就这里例子来说,我们可以将二维数据集通过下列映射转换到新的三维特征空间中,从而使样本可分。
这使的我们可以将图中的两个类别通过线性超平面进行分割。然后如果我们把此超平面映射会原始特征空间,则可先行分割两类数据的超平面就变成非线性的了。
2 使用背景
为了使用SVM解决非线性问题,我们通过一个映射函数将训练数据映射到更高维度的特征空间,并在新的特征空间上训练一个线性SVM模型。然后将同样的映射函数应用于新的、未知数据上。进而使用新特征空间上的线性SVM模型对其进行分类。
但是这种思路是有问题的。
构建新的特征空间带来非常大的计算成本,特别是在处理高维数据的时候。这是就用到了我们称作核技巧的方法。
3 使用
下面使用核技巧来对之前给的异或数据来进行分类。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from matplotlib.colors import ListedColormapdef plot_decision_regions(X, y, classifier, test_idx=None, resolution=0.02):# setup marker generator and color mapmarkers = ('s', 'x', 'o', '^', 'v')colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')cmap = ListedColormap(colors[:len(np.unique(y))])# plot the decision surfacex1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1# 生成两个个二维的矩阵xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) # .T是求转置Z = Z.reshape(xx1.shape)plt.contourf(xx1, xx2, Z, alpha = 0.4, cmap = cmap)plt.xlim(xx1.min(), xx1.max())plt.ylim(xx2.min(), xx2.max())# plot all samplesX_test, y_test = X[test_idx, :], y[test_idx]for idx, c1 in enumerate(np.unique(y)):plt.scatter(x=X[y == c1, 0], y =X[y == c1, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=c1)# highlight test samplesif test_idx:X_test, y_test = X[test_idx, :], y[test_idx]plt.scatter(X_test[:, 0], X_test[:, 1], c='', alpha=1.0, linewidth=1, marker='o', s=55, label='test set')np.random.seed(0)
X_xor = np.random.randn(200, 2)
y_xor = np.logical_xor(X_xor[:, 0] > 0, X_xor[:, 1] > 0)
y_xor = np.where(y_xor, 1, -1)plt.scatter(X_xor[y_xor==1, 0], X_xor[y_xor==1, 1], c='b', marker='x', label='1')
plt.scatter(X_xor[y_xor==-1, 0], X_xor[y_xor==-1, 1], c='r', marker='s', label='-1')
plt.ylim(-3.0)
plt.legend()
plt.show()svm = SVC(kernel='rbf', random_state=0, gamma=0.10, C=10.0)
svm.fit(X_xor, y_xor)
plot_decision_regions(X_xor, y_xor, classifier=svm)
plt.legend(loc='upper left')
plt.show()
其中svm中gamma的值会影响图像的拟合程度。越大拟合的越好。
contourf参数 python_Python机器学习(六)相关推荐
- 数据挖掘机器学习[六]---项目实战金融风控之贷款违约预测
相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据挖掘机器学习---汽车交易价格预测详细版本[二]{EDA-数据探索性分析} 数据挖掘机器学习 ...
- python逻辑回归的主要参数_python机器学习(六)回归算法-逻辑回归
逻辑回归 同步更新在个人网站:http://www.wangpengcufe.com/machinelearning/pythonml-pythonml6/ 一.概述 1.1.概念 是一种名为&quo ...
- barplot参数 python_Python零基础入门Python数据分析最好的实战项目
数据初探 首先导入要使用的科学计算包numpy,pandas,可视化matplotlib,seaborn,以及机器学习包sklearn. import pandas as pd import nump ...
- 入门机器学习(六)--课后作业解析-logistics回归(python实现)
相关资料: 逻辑回归Python实现源码与数据集下载 吴恩达机器学习课件与课后习题下载 编程作业2 logistic_regression(逻辑回归) 推荐运行环境:python 3.6 建立一个逻辑 ...
- 【参数辨识】六关节机械臂动力学参数辨识(上)
导语:两周的动力学参数辨识,使我学到很多,但遇到的问题更多,在网上有很多六关节动力学参数辨识的资料,但大家对于最小惯性参数集的推导都不详细,不能得到最小惯性参数集的系数和对应的回归矩阵,很多东西都是直 ...
- 均值方差模型python_Python机器学习之“选择最优模型”
关键问题是:假如模型效果不好,应该如何改善?答案可能有以下几种.用更复杂 / 更灵活的模型. 用更简单 / 更确定的模型. 采集更多的训练样本. 为每个样本采集更多的特征. 问题的答案往往与直觉相悖. ...
- 写给人类的机器学习 六、最好的机器学习资源
六.最好的机器学习资源 原文:The Best Machine Learning Resources 作者:Vishal Maini 译者:飞龙 协议:CC BY-NC-SA 4.0 用于制定人工智能 ...
- 数字验证识别python_Python机器学习!识别图中最难的数字!验证码?验证码是小儿科!-站长资讯中心...
进群:548377875即可获取数十套PDF哦!是分开私信哦! 现在我们看看digits数据集统计性信息 #一共有1797个数据和1797标签 print('照片数据形状(维度): ', digits ...
- 机器学习(六):朴素贝叶斯及拉普拉斯修正
一.前言 2022年的第一篇博客,<机器学习>这个专栏去年由于自己的时间原因,更新的不勤,乘最近稍微有点时间准备开始陆陆续续更新,今天先来一道开胃菜:带拉普拉斯修正的朴素贝叶斯,话不多说请 ...
最新文章
- docker 安装使用 solr
- 【每日一算法】使用二分法解决x 的平方根问题
- 【每日DP】day14、P2016 战略游戏(树形DP模板)难度⭐⭐⭐
- 原子智库 | 刘伟:人工智能快追上人类思维?答案可能让你失望
- python好学吗 老程序员-今天面试了一个34岁大龄程序员,有感而发
- 全国计算机等级考试题库二级C操作题100套(第27套)
- libaio.so.1 mysql_libaio.so.1()(64bit) is needed by MySQL-server
- 【LeetCode笔记】48. 旋转图像(Java、矩阵、偏数学、原地算法)
- Rich feature hierarchies for accurate object detection and semantic segmentation(理解)
- 【资料】《数字电子技术基础》阎石第五版
- 驱动实验一(第一个驱动程序创建)
- matlab信号处理——数据处理基础
- Windows下Appium环境搭建小结
- TD回撤/斐波那契回撤
- PowerWeChat 微信SDK 介绍
- A870省电内核超频内核编译及制作
- 【开发环境】 Ubuntu14.04 安装Skyeye 1.3.5过程
- 2020 CM-BERT: Cross-Modal BERT for Text-Audio Sentiment Analysis
- mysql印度时区_一次 JDBC 与 MySQL 因 “CST” 时区协商误解导致时间差了 14 或 13 小时的排错经历...
- 浮云API免费开放接口
热门文章
- ABAP web service运行时的细节调试
- 如何查看已经archive过的product信息
- SAP ABAP实用技巧介绍系列之 ABAP XSLT match keyword
- How to Use Command to Execute Git Push with Review from Sean
- sql 列转行_SQL面试题:如何行列互换?一个万能模板
- miui12怎么自定义开机动画_MIUI12正式官宣,5天后发布!网友:发布是发布,12月才能更新?...
- 交换机工作原理_交换机的作用是什么?
- python 调用控制台并获取返回结果_Java调用Python脚本并获取返回值
- c字符串截取一部分字符串_Python如何截取一段字符串?
- linux var目录满了,Linux入门教程:/var/spool/clientmqueue 占满根目录