支持向量机的直观理解

支持向量机是监督学习算法的一种,有时也被称为大间距分类器。法广泛的应用于工业界和学术界。
接下来将用一个例子来说明:

如图,对于这样一个数据集,其中既有正样本,也有负样本,可以看出这个数据集是线性可分的,也就是,存在一条直线把正负样本分开。当然,这样的直线有很多条 ,比如:

这些直线都可以将正负样本分开,但是绿线和粉线多多少少看起来不是很自然,所以支持向量机的作用就是在这些直线中选择这个黑色的决策边界。之所以选择黑线,是因为其决策界和训练样本之间有更大的最短距离,如图:

但是,有时数据集会出现一些异常点,如下图:

如果为了将样本用最大间距分开,最终就会得到这条粉线,但是仅仅基于一个异常点和样本,就将决策界从黑线变成粉线,显然是不明智的。所以支持向量机为了应对这种情况,会进行正则化参数C,C的作用类似于1/λ,当C不是很大的时候,它可以忽略掉一些异常点的影响,得到更好的决策边界。
上述描述的只是其中一种情况,还有一种需要通过使用高级数的多项式模型来解决无法用直线进行分隔的分类问题,如图:

为了用SVM找出一个非线性的决策边界,我们首先要实现高斯核函数。我可以把高斯核函数想象成一个相似度函数,用来测量一对样本的距离
这里用sklearn自带的svm中的核函数即可。

代码实现

一.线性分类
1.导入数据,可视化画出散点图,根据y的0和1区分颜色。其中,大多数SVM的库会自动帮你添加额外的特征 x 0已经 θ 0,所以无需手动添加。

mat = loadmat('./data/ex6data1.mat')
print(mat.keys())
# dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
X = mat['X']
y = mat['y']def plotData(X, y):plt.figure(figsize=(8,5))plt.scatter(X[:,0], X[:,1], c=y.flatten(), cmap='rainbow')  #X第0列为x坐标,第1列为y坐标,c颜色按照y的0和1来区分。根据'rainbow'对应数字颜色plt.xlabel('X1')plt.ylabel('X2')plt.legend()
plotData(X, y)
plt.show()


2.画出网格线和边界线,通过改变C值,观察边界线的变化。
其中:
np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。
np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等。

def plotBoundary(clf, X):   #clf是指训练好的模型(已经求好theta)'''plot decision bondary'''x_min, x_max = X[:,0].min()*1.2, X[:,0].max()*1.1y_min, y_max = X[:,1].min()*1.1,X[:,1].max()*1.1xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500),np.linspace(y_min, y_max, 500))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape)plt.contour(xx, yy, Z)
#定义SVM的C值,然后根据X和y训练两个模型,包含在clfs中
models = [svm.SVC(C, kernel='linear') for C in [1, 100]]
clfs = [model.fit(X, y.ravel()) for model in models]    #flatten是返回一份拷贝,对原始矩阵没影响。ravel对原始有影响
#调用定义的函数画出边界线图
title = ['SVM Decision Boundary with C = {} (Example Dataset 1'.format(C) for C in [1, 100]]
for model,title in zip(clfs,title): plt.figure(figsize=(8,5))plotData(X, y)plotBoundary(model, X)plt.title(title)plt.show()



可以从上图看到,当C比较小时模型对误分类的惩罚增大,比较严格,误分类少,间隔比较狭窄。

当C比较大时模型对误分类的惩罚增大,比较宽松,允许一定的误分类存在,间隔较大。
二.非线性分类
(1)数据二
1.导入数据,可视化画出散点图。

mat = loadmat('./data/ex6data2.mat')
X2 = mat['X']
y2 = mat['y']
plotData(X2, y2)
plt.show()


2.计算高斯核函数

def gaussKernel(x1, x2, sigma):return np.exp(- ((x1 - x2) ** 2).sum() / (2 * sigma ** 2))gaussKernel(np.array([1, 2, 1]),np.array([0, 4, -1]), 2.)  # 0.32465246735834974

3.通过高斯核函数画出边界图。

sigma = 0.1
gamma = np.power(sigma,-2.)/2
modle = svm.SVC(C=1, kernel='rbf', gamma=gamma)  #
clf = modle.fit(X2, y2.flatten())
plotData(X2, y2)
plotBoundary(modle, X2)  #这里用modle或clf都行,只要之前用modle.fit训练过就行了。
plt.show()


(2)数据三
1.导入数据,可视化画出散点图。

mat3 = loadmat('data/ex6data3.mat')
X3, y3 = mat3['X'], mat3['y']
Xval, yval = mat3['Xval'], mat3['yval']    #指测试验证集,用于计算f1score来评估模型好坏
plotData(X3, y3)
plt.show()


2.接下来选一个合适的C和sigma做准备

Cvalues = (0.01, 0.03, 0.1, 0.3, 1., 3., 10., 30.)
sigmavalues = Cvalues
best_pair, best_score = (0, 0), 0#找到最适C和sigma
for C in Cvalues:for sigma in sigmavalues:gamma = np.power(sigma,-2.)/2model = svm.SVC(C=C,kernel='rbf',gamma=gamma)model.fit(X3, y3.flatten())this_score = model.score(Xval, yval)if this_score > best_score:best_score = this_scorebest_pair = (C, sigma)
#打印出找到的结果
print('best_pair={}, best_score={}'.format(best_pair, best_score))
# best_pair=(1.0, 0.1), best_score=0.965

3.#用得到的参数训练模型,画出边界线

model = svm.SVC(C=1., kernel='rbf', gamma = np.power(.1, -2.)/2)
model.fit(X3, y3.flatten())
plotData(X3, y3)
plotBoundary(model, X3)
plt.show()

机器学习--SVM支持向量机相关推荐

  1. 支持向量机python代码_Python机器学习SVM支持向量机算法理论 | kTWO-个人博客

    PS:这篇文章讲的是SVM的算法的基础理论知识,因为博主也是刚学习没多久,对SVM的数学思想了解的不是很深,所以这篇文章就简单介绍一下什么是SVM以及SVM是怎么工作的. 1.什么是支持向量机(SVM ...

  2. 详解SVM支持向量机算法(四:坐标上升和SMO算法)

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 背景 坐标上升算法 定义 过程 举个求解的栗子 基于坐标上升的SMO算法 SMO ...

  3. 机器学习之支持向量机(SVM)总结

    文章目录 1.知道SVM相关的各种概念 2.知道目标函数.损失函数.正则项的意义 2.1.目标函数 2.2.损失函数 2.3.正则化(添加噪音避免过拟合) 3.了解SVM算法原理 4.知道SVM的目标 ...

  4. 机器学习——SVM(支持向量机)与人脸识别

    目录 系列文章目录 一.SVM的概念与原理 1.SVM简介 2.SVM基本流程 3.SVM在多分类中的推广 二.经典SVM运用于图像识别分类 三.SVM运用于人脸识别 1.预处理 1.1 数据导入与处 ...

  5. 机器学习(MATLAB实现)——SVM支持向量机(一)

    SVM支持向量机 支持向量机理论概述 二分类支持向量机 多分类支持向量机 libsvm工具箱使用简介 训练函数 预测函数 libsvm参数实例 一点拓展 参考文献 支持向量机理论概述 核函数用于将支持 ...

  6. 机器学习:SVM支持向量机理解

    SVM应该是机器学习过程中第一个特别复杂的算法了,其中大量的数学推导公式和优化算法,对小白真的太不友好了.这篇文章参考了许多优秀博文,主要是了解一下SVM,尽量少涉及复杂的公式推导,有些直接给出结论. ...

  7. 基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)

    基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类) 一.数据集说明 训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中 ...

  8. 机器学习05|一万五字:SVM支持向量机02 【jupyter代码详解篇】

    文章目录 Jupyter实现 任务一 从DataSet.txt中导入数据,获得训练集以及标签. 任务二 调整alpha的值 任务三 上述原理过程中,需要计算真实值与预测值之间的误差,定义一个函数Com ...

  9. 吴恩达《机器学习》——SVM支持向量机

    SVM支持向量机 1. 线性SVM 1.1 从Logistic回归出发 1.2 大边界分类与SVM 1.3 调整正则化参数 2. 非线性SVM(高斯核函数) 2.1 高斯核 2.2 非线性分类 2.3 ...

  10. Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines)

    Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Support Vector Machines) 文章目录 Ex6_机器学习_吴恩达课程作业(Python):SVM支持向量机(Su ...

最新文章

  1. java ado连接mysql_【转】Java JDBC对应C# ADO连接数据库之区别
  2. C# .net core 解决ToLower中缺少CultureInfo格式重载
  3. 关于批量插入数据之我见(100万级别的数据,mysql) (转)
  4. python运行方式特点_编程必修课:一文弄懂python的运行机制
  5. python图灵测试_最前沿:基于GAN和RL的思想来训练对话生成,通过图灵测试可期!...
  6. Tesseract Ocr文字识别
  7. php 几个比较实用的函数
  8. MySQL中使用adddate函数产生随机日期+时间
  9. 关于SRTM精度的讨论[文摘]
  10. Tensorflow2.0学习(八) — tf.dataset自定义图像数据集
  11. 硬盘绝密维修资料(2)
  12. 脉冲神经网络 神经元模型-HH模型(1)
  13. win10电脑怎么将html网页做成壁纸,win10系统怎么在电脑桌面上创建网页的快捷方式...
  14. 网络资源下载操作及其原理学习: 如迅雷与百度网盘
  15. android摄像头(camera)之buffer管理
  16. 2020年美国新冠肺炎疫情数据分析
  17. SolidWorks频繁闪退,可能是(百度)输入法引起的
  18. Java体系知识之ElementUI
  19. NYOJ:71-独木舟上的旅行
  20. 会议平板怎么选?智能会议平板功能大全,购前必阅

热门文章

  1. 员工“风清扬”感慨:为公司裁员结果把自己裁了,网友:真够狠的
  2. 一文2500字Robot Framework自动化测试框架超强教程
  3. Unity 图片字体制作
  4. matlab 图中图
  5. 工业物联网的实际应用案例以及技术分析
  6. 摘抄“GPU Programming And Cg Language Primer 1rd Edition” 中文名“GPU编程与CG语言之阳春白雪下里巴人”
  7. 【下载工具】哔哩哔哩视频下载器——(Downkyi)下载姬v1.3.3
  8. BAT某公司的一套面试题
  9. pandas系列学习(七):数据透视表
  10. 纯新手Java奋斗500天进腾讯,我给自己先来碗毒鸡汤