【机器学习与R语言】9- 支持向量机
1.理解支持向量机(SVM)
1)SVM特点
- 支持向量机和神经网络都是“黑箱模型”的代表:潜在的模型基于复杂的数学系统,而且结果难以解释。
- SVM的目标是创建一个平面边界(“超平面”),使得任何一边的数据划分都是均匀的。结合了kNN和线性回归。
- 几乎适用于所有的学习任务,包括分类和数值预测。
2)用超平面分类
- 线性可分:可以由一条直线或一个平面进行划分

- 最大间隔超平面(MMH):很多线都能对数据点进行分类,但要寻找能使类形成最大间隔的那条线(因为在边界附近点位置的微小变化可能导致某些点落在线之外),支持向量就是每个类中最接近最大间隔超平面的点。所以单独使用支持向量,就能定义最大间隔超平面。

- 线性可分条件下,最大间隔超平面要尽可能远离两组数据点的外边界(“凸包”),最大间隔超平面就是两个凸包之间的最短距离直线的垂直平分线,可通过“二次优化”算法实现。

- 非线性可分:数据不是线性可分的条件下,使用一个“松弛变量”来创建一个软间隔,允许一些点落在线不正确的一边。

- 非线性可分中的成本参数C:即所有违反约束的点,试图使总成本最小,而非寻找最大间隔。修改C将调整对于落在超平面错误一边的案例的惩罚。C越大,实现100%分离的优化就越困难。较小的C将把重点放在更宽的整体边缘。
3)对非线性空间使用核函数
- 另一种处理非线性问题的方法,就是使用“核技巧”的处理将问题映射到一个更高维的空间,这样非线性关系可能会变为完全线性。

- 从本质上讲,核技巧涉及一个添加能够表述度量特征之间数学关系新特征的过程。
- 非线性核SVM的特点:

- 核函数:线性核函数(特征的点积),多项式核函数(加一个非线性数据变换),S形核函数(类似神经网络的S形激活函数),高斯RBF核函数(类似RBF神经网络)。多数情况下,核函数的选择是任意的,因为性能可能只有轻微的变化。
2. 支持向量机应用示例
使用SVM进行光学字符识别(OCR图像处理):通过将印刷或手写文本转换为电子形式,保存在数据库种来处理纸质文件。
难点:
- 图像的规则模式很难严格定义
- 图像数据往往是噪声数据
1)收集数据
数据集包含26个大写英文字母的2000个案例,使用20种不同的随机重塑和扭曲的黑斯和白色字体印刷。
假设当图像字符被扫描到计算机,转换为像素,有16个统计属性(如水平垂直尺寸,黑色像素比例等)。

数据下载:
链接: https://pan.baidu.com/s/1q8zHWkMZcapwnX90PA4hOg 提取码: eaqt
2)探索和准备数据
SVM需要所有特征都是数值型的,而且每一个特征需要缩小到一个相当小的区间内。所以不要有因子,而且要做标准化。这里略过没做。
## Example: Optical Character Recognition ----
## Step 2: Exploring and preparing the data ----
# read in data and examine structure
letters <- read.csv("letterdata.csv")
str(letters)
# divide into training and test data
letters_train <- letters[1:16000, ] #80%
letters_test <- letters[16001:20000, ] #20%
3)训练数据
SVM的R包有e1071,klaR和kernlab等,这里用kernlab(与caret连用,允许SVM使用各种自动化方法进行训练和评估)。
kernlab::ksvm(target~predictors,
data=mydata,
kernel="rbfdot", #隐非线性映射,rbfdot/polydot/tanhdot/vanilladot
c=1) #违法约束条件的惩罚,较大的c值导致较窄的边界
训练:
## Step 3: Training a model on the data ----
# begin by training a simple linear SVM
library(kernlab)
letter_classifier <- ksvm(letter ~ ., data = letters_train,
kernel = "vanilladot") #默认使用高斯RBF核函数,这里用线性函数
# look at basic information about the model
letter_classifier

4)评估模型
letter_predictions <- predict(letter_classifier, letters_test)
head(letter_predictions)
table(letter_predictions, letters_test$letter)

# look only at agreement vs. non-agreement
# construct a vector of TRUE/FALSE indicating correct/incorrect predictions
agreement <- letter_predictions == letters_test$letter
table(agreement)
prop.table(table(agreement))

识别的准确度大概为84%。
5)提高性能
可以使用一个更复杂的核函数,将数据映射到更高维的空间,获得一个较好的模型拟合度。如试试高斯RF核函数,或者修改成本约束参数C值来修正决策边界的宽度。
## Step 5: Improving model performance ----
set.seed(12345)
letter_classifier_rbf <- ksvm(letter ~ ., data = letters_train, kernel = "rbfdot") #高斯RBF核函数
letter_predictions_rbf <- predict(letter_classifier_rbf, letters_test)
agreement_rbf <- letter_predictions_rbf == letters_test$letter
table(agreement_rbf)
prop.table(table(agreement_rbf))

训练时间更长,将准确度提高到了93%。
机器学习与R语言系列推文汇总:
【机器学习与R语言】1-机器学习简介
【机器学习与R语言】2-K近邻(kNN)
【机器学习与R语言】3-朴素贝叶斯(NB)
【机器学习与R语言】4-决策树
【机器学习与R语言】5-规则学习
【机器学习与R语言】6-线性回归
【机器学习与R语言】7-回归树和模型树
【机器学习与R语言】8-神经网络
【机器学习与R语言】9-支持向量机
【机器学习与R语言】10-关联规则
【机器学习与R语言】11-Kmeans聚类
【机器学习与R语言】12-如何评估模型的性能?
【机器学习与R语言】13-如何提高模型的性能?
【机器学习与R语言】9- 支持向量机的更多相关文章
- (转)R语言 SVM支持向量机在 R 语言中的实现和使用
支持向量机是一个相对较新和较先进的机器学习技术,最初提出是为了解决二类分类问题,现在被广泛用于解决多类非线性分类问题和回归问题.继续阅读本文,你将学习到支持向量机如何工作,以及如何利用R语言实现支持向 ...
- 【机器学习与R语言】13- 如何提高模型的性能?
目录 1.调整模型参数来提高性能 1.1 创建简单的调整模型 2.2 定制调整参数 2.使用元学习来提高性能 2.1 集成学习(元学习)概述 2.2 bagging 2.3 boosting 2.4 ...
- 【机器学习与R语言】1-机器学习简介
目录 1.基本概念 2.选择机器学习算法 3.使用R进行机器学习 1.基本概念 机器学习:发明算法将数据转化为智能行为 数据挖掘 VS 机器学习:前者侧重寻找有价值的信息,后者侧重执行已知的任务.后者 ...
- 【机器学习与R语言】12- 如何评估模型的性能?
目录 1.评估分类方法的性能 1.1 混淆矩阵 1.2 其他评价指标 1)Kappa统计量 2)灵敏度与特异性 3)精确度与回溯精确度 4)F度量 1.3 性能权衡可视化(ROC曲线) 2.评估未来的 ...
- 【机器学习与R语言】11- Kmeans聚类
目录 1.理解Kmeans聚类 1)基本概念 2)kmeans运作的基本原理 2.Kmeans聚类应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解Km ...
- 【机器学习与R语言】10- 关联规则
目录 1.理解关联规则 1)基本认识 2)Apriori算法 2.关联规则应用示例 1)收集数据 2)探索和准备数据 3)训练模型 4)评估性能 5)提高模型性能 1.理解关联规则 1)基本认识 购物 ...
- 【机器学习与R语言】8- 神经网络
目录 1.理解神经网络 1)基本概念 2)激活函数 3)网络拓扑 4)训练算法 2.神经网络应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高性能 1.理解神经网络 1) ...
- 【机器学习与R语言】7-回归树和模型树
目录 1.理解回归树和模型树 2.回归树和模型树应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理解回归树和模型树 决策树用于数值预测: 回归树:基于到达 ...
- 【机器学习与R语言】6-线性回归
目录 1.理解回归 1)简单线性回归 2)普通最小二乘估计 3)相关系数 4)多元线性回归 2.线性回归应用示例 1)收集数据 2)探索和准备数据 3)训练数据 4)评估模型 5)提高模型性能 1.理 ...
随机推荐
- SpringBoot整合Prometheus
SpringBoot整合Prometheus 一.需求 二.实现步骤 1.引入jar包 2.application.prometheus文件配置 3.查看指标数据 4.接入到 prometheus 中 ...
- BF算法和KMP算法
这两天复习数据结构(严蔚敏版),记录第四章串中的两个重要算法,BF算法和KMP算法,博主主要学习Java,所以分析采用Java语言,后面会补上C语言的实现过程. 1.Brute-Force算法(暴力法 ...
- 彻底搞通TCP滑动窗口
在我们当初学习网络编程的时候,都接触过TCP,在TCP中,对于数据传输有各种策略,比如滑动窗口.拥塞窗口机制,又比如慢启动.快速恢复.拥塞避免等.通过本文,我们将了解滑动窗口在TCP中是如何使用的. ...
- JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程
/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...
- Zabbix5.0实现监控系统登陆失败告警
环境zabbix5.0,配置思路,通过添加监控项和触发器实现,监控项监控对应的日志文件,触发器过滤日志文件中的关键字,当出现failed时就发出告警. 监控项配置 类型选择zabbix客户端主动式,键 ...
- Docker 18.03 Centos7.6 安装 内网
首先访问https://download.docker.com/linux/centos/7/x86_64/stable/Packages/获取对应版本的rpm包docker包docker-ce-18 ...
- 区块链开发学习第三章:私有链上部署helloBlockchain简单合约
前面讲了部署私有链以及新增账户,现在进行到了部署合约了,此操作真是踩了无数无数无数的坑,到写文章为止确实是已经部署好了,但是还有些坑是还没有解决的! 一.Solidity编译器 开始的时候用的http ...
- Spring一套全通—工厂
百知教育 - Spring系列课程 - 工厂 第一章 引言 1. EJB存在的问题 2. 什么是Spring Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式 轻量级 1. 对于 ...
- Docker进阶一:网络篇
理解Docker0 查看本地ip ip addr [root@VM-0-6-centos ~]# ip addr #本机回环地址 1: lo: <LOOPBACK,UP,LOWER_UP> ...
- idea连接数据库时区:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope
错误界面 IDEA连接mysql,地址,用户名,密码,数据库名,全都配置好了,点测试连接,咔!不成功! 界面是这样的, 翻译过来就是:服务器返回无效时区.进入"高级"选项卡,手动设 ...