机器学习实战 SVM python3实现 R语言实现

本文介绍了SVM(支持向量机)的基本理念和应用场景,并通过一个有趣的故事来阐述其核心思想。文章详细讲解了线性可分与线性不可分的情况,以及感知器和SVM的区别。最后,提供了R语言实现SVM的代码示例。
摘要由CSDN通过智能技术生成

我很少说原理,但是一些有趣的,可以帮助我们理解算法的小故事再喜欢不过了。这里引用了一个知乎的回答,太让人喜欢了。觉得把高深的东西讲的小孩子都懂得才是真正的大神。

这里附上R语言的SVM代码,感兴趣的同学们可以看一下。(在最后面哦。)


1.引例

在学习SVM时在知乎上看到了一篇有趣的SVM介绍。下面我把它复制过来作为SVM算法的引入案例。

作者:简之
链接:https://www.zhihu.com/question/21094489/answer/86273196
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在很久以前的情人节,大侠要去救他的爱人,但魔鬼和他玩了一个游戏。

魔鬼在桌子上似乎有规律放了两种颜色的球,说:“你用一根棍分开它们?要求:尽量在放更多球之后,仍然适用。”

 

于是大侠这样放,干的不错?

 

然后魔鬼,又在桌上放了更多的球,似乎有一个球站错了阵营。

 

 

SVM就是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。

 

现在即使魔鬼放了更多的球,棍仍然是一个好的分界线。

 

然后,在SVM 工具箱中有另一个更加重要的 trick 魔鬼看到大侠已经学会了一个trick,于是魔鬼给了大侠一个新的挑战。

 

现在,大侠没有棍可以很好帮他分开两种球了,现在怎么办呢?当然像所有武侠片中一样大侠桌子一拍,球飞到空中。然后,凭借大侠的轻功,大侠抓起一张纸,插到了两种球的中间。

 

现在,从魔鬼的角度看这些球,这些球看起来像是被一条曲线分开了。

 

再之后,无聊的大人们,把这些球叫做 data」,把棍子 叫做 classifier」, 最大间隙trick 叫做optimization」 拍桌子叫做kernelling」(核函数), 那张纸叫做hyperplane」(超平面)

SVM应用的一般框架

1. 收集数据:可以使用任何方法

2. 准备数据:需要数值型数据

3. 分析数据:有助于可视化分隔超平面

4. 训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优

5. 测试算法:十分简单的计算过程就可以实现

6. 使用算法:几乎所有的分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器,对多类问题应用SVM需要对代码做一些修改。

支持向量机的基本理念

基于支持向量机的分类器是一种有监督学习的分类方式,属于一般化的线性分类器,主要用于文本和超文本的分类,在解决小样本、高纬的模式识别有较好的优势。

1.线性可分与线性不可分

(1) 线性可分

如引例中所描述的那样,如下图,即为线性分类。斜线即为超平面。一般平面内的点距离超平面的距离可以作为愤怒类预测的准确程度评判依据。若某一超平面是支持向量机需要的最大的间隔值,这个平面也称为最大间隔超平面。

 

2-1   支持向量机简单超平面示例

2)线性不可分

 

2-2  支持向量机简单线性不可分示例

线性不可分的数据映射到高维空间会带来一定的问题,维度越高计算越复杂。因此有了核函数的产生,它的价值在于核函数将特征由低维转换到高维,但是它的计算依然在低维计算。因此支持向量机对于非线性分类有很好的优势。

2.感知器

感知器是分类模型中最为简单和可理解的分类方式,是一种二分类模型,只要针对线性可分的样本,输入是样本的特征向量,输出的是样本所属的类型。

感知器是一种有监督的学习方式,通过样本数据的训练形成感知器模型,通过模型对测试样本进行分类预测。感知器有时也称作线性分类,它主要针对线性可分的模型,同理也对应着线性不可分。

3.支持向量机

支持向量机也称为最大边缘区分类器,属于一般化线性分类器。线性分类器的特点是,他们可以同时将禁言误差最小化和集合边缘最大化。支持向量机分类资料点的方法主要是构建一个或多个高维,这样可以减低分类器的泛化误差。支持向量机的目标就是找出间隔最大的超平面来作为分类边界。其中的间隔是指分类边界与最近的训练资料点之间的距离。支持向量机中的支持向量指的就是与分类边界距离最近的训练资料点。

from numpy import *
from time import sleep

def loadDataSet(fileName):
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr = line.strip().split('\t')
        dataMat.append([float(lineArr[0]), float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat,labelMat

def selectJrand(i,m):   
 #i

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值