svm算法原理_机器学习——分类算法(1)

c85e7b9afda9dff75b5e3d89e88c3cd0.png

一、 K近邻

KNN算法的基本思想就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

其中在计算距离时采用欧氏距离或曼哈顿距离:

b1c300b231ee14bbe16fd43bd5bb17c0.png

k值的选择:当k值较小时,预测结果对近邻的实例点非常敏感,容易发生过拟合;如果k值过大模型会倾向大类,容易欠拟合;通常k是不大于20的整数

优点:精度高,对异常值不敏感

缺点:k值敏感,空间复杂度高(需要保存全部数据),时间复杂度高(平均O(logM),M是训练集样本数)

二、感知机

PLA全称是Perceptron Linear Algorithm,即线性感知机算法,属于一种最简单的感知机(Perceptron)模型。它是支持向量机和神经网络的基础。感知机模型是机器学习二分类问题中的一个非常简单的模型。它的基本结构如下图所示:

4ac96a33a622d687f95390c027559355.png

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正实例点和负实例点完全正确分开的分离超平面。如果是非线性可分的数据,则最后无法获得超平面。所以感知机的目标函数为一条直线或者一个超平面,其输出为:

cabe830dc8c6efd9e9935483a1ca9cbd.png

其中wx+b表示空间中的一点的坐标,我们的目标取找到合适的w和b,使得f(x)和真实的y值相符合,当然不可能达到完全符合,所以应当是尽可能多的点被正确分类。换句话说就是让那些分错类的点越接近边界线越好。这时我们就可以用距离来定义损失函数了:损失值=错误的点到边界的距离的总和。优化的对象便是让这个距离之和最小。

由点到平面的距离公式我们可以得到任意一点距离我们上面定义的模型的距离为:

ea2ff4c22dbffc29f9168b3bb56a5010.png

有了计算距离的方式,我们来看看损失函数究竟怎么定义。这里需要注意的是我们的目标是那些分错类的点,而不是所有点,因此不能直接将距离作为损失函数,所以我们需要找出那些分错类的点,建立他们的损失函数。这里正好可以利用绝对值来进行区分正确点和错误点。对于模型来说,在分类错误的情况下,若wxi+b>0,去掉绝对值不变,则实际的yi应该是等于-1,为了使原式保持正值,则添加一个负号。而当wxi+b<0时,去掉绝对值加负号,此时yi等于1,上式为正值。因此由这个特性我们可以去掉上面的绝对值符号,将公式转化为:

2c3864007ecba781261a010f7b0fba93.png

去掉||w||后得到最终的损失函数为:

57fcfeb63be6103dc2dc43e5be09fb85.png

这里求最小值采用的是随机梯度下降算法,因为我们每次取一个点来判断他是不是错误点,然后才能带入优化。

三、支持向量机SVM

支持向量机与感知机相似。他的目的也是取寻找一条直线或一个超平面将数据进行二分类。只不过感知机的原理是到边界的距离最小,而SVM的原理则是“间隔最大化”。

f19b95c46d24c8f0c4258df9343da593.png

从上图可以看出,如果数据集线性可分,那么这样的直线又无数条,但是我们的目标是找到一条容忍度最好的直线,即黄色的那条。

  1. 为什么要间隔最大呢?

一般来说,一个点距离分离超平面的远近可以表示分类预测的确信度,如图中的A B两个样本点,B点被预测为正类的确信度要大于A点,所以SVM的目标是寻找一个超平面,使得离超平面较近的异类点之间能有更大的间隔,即不必考虑所有样本点,只需让求得的超平面使得离它近的点间隔最大

9f9ee408b5b12fd9386421163bedcefa.png

2. 怎么计算间隔

f(x)=wTx+b 表示空间中一点的坐标。当f(x) 等于0的时候,x便是位于超平面上的点,而f(x) 大于0的点对应 y=1 的数据点,f(x)小于0的点对应y=-1的点。这里的y=1和-1都是可以随意指定的,相当于两种label,为了方便计算就取1和-1了。

根据上述原理我们可以总结为一个表达式:

d6039f0d74d8c0ec373fa53971d5b04f.png

实际上该公式等价于yi(WTxi+b)≥ +1。这就是最大间隔假设

3. 什么是支持向量

距离超平面最近的这几个样本点满足yi(WTxi+b)=1,它们被称为“支持向量”。虚线称为边界,两条虚线间的距离称为间隔(margin)所谓的支持向量,就是使得上式等号成立,即最靠近两条虚边界线的向量。如果WTxi+b>1,那就说明更加支持了。

82e53a8a6b159be1902f177ae8949296.png

所以我们在计算最大间隔的时候,其实关注的是支持向量到超平面的距离。

749921e658ed030a412ab310f9a13158.png

e7cba8fff2eac1b02f2ea51593363368.png

e9599fac4369b147b7384a84fe2889d9.png

由上述两式联立可得

3f3fc34b2ac48042fea4f8e3536b9099.png

对于支持向量,WTxi+b=1或-1,所以最大间隔变为:

012473304b2fd61787b8ddbe2409e818.png

这样我们们便确定了目标函数

3a143481e65fcccaa16dbab020b8d11c.png

等价于:

43e5e8ac833976a86b498fe0c990c4cd.png

SVM函数的求解属于凸二次规划问题,采用拉格朗日乘数法求解。添加拉格朗日乘子 αi≥0,则整个拉格朗日函数可写成:

5d557fb5cae0e685596b20baa360064f.png

4. 非线性支持向量机与核函数技

对于非线性分类问题,显然无法用一个线性分离超平面来把不同的类别的数据点分开,那么可以用以下思路解决这个问题:

  • 首先使用一个变换 z=ϕ(x)将非线性特征空间x映射到新的线性特征空间z
  • 在新的z特征空间里使用线性SVM学习分类的方法从训练数据中学习分类模型

但是,这里有一个问题: ϕ(xi)⋅ϕ(xj)计算起来要分两步,先映射x到z空间,然后在z空间(一般是较高维度)作高维度的內积zi⋅zj。

为了简化这个运算过程,如果我们找到一个核函数K(xi,xj), 即K是关于x的函数,其运算在低维空间上进行,然后使得K(xi,xj)=ϕ(xi)⋅ϕ(xj),那么只需要计算一个比较好计算的核函数K(xi,xj),就可以避免先映射,再在高维空间內积的复杂运算。

常见的核函数有:二次多项式核、高斯核

5. 软间隔

我们一直假设训练样本在样本空间或特征空间食线性可分的,即存在一个超平面能将不同类的样本完全划分开。然而,在现实任务中往往很难确定合适的核函数使得训练样本在特征空间中线性可分;退一步说,即便恰好找到了某个核函数使训练样本在特征空间中线性可分,也很难断定这个貌似线性可分的结果不是由于过拟合造成的缓解该问题的一个方法是允许支持向量机在一些样本上出错,为此要引入“软间隔”的概念。当然我们还要限制这些分错的样本个数应当越少越好

1cecd3c9711e9e06e167c9e96f5c28e9.png

之前做了一个最大间隔的假设,即所有样本都满足:

eecfed608fc26088e34db290dff9dc59.png

也就是说所有的样本都得被分对,这称之为“硬间隔”,而软间隔则允许某些样本不满足约束条件,于是,目标函数可写为

8c888afdbc62c97b87b559ffaeab6c1c.png

其中C是常数,L0/1是0/1的损失函数:

f592dc1c6759fa8dabc0ad6d02be449a.png

当C越大,模型的容忍程度就越小,边界越瘦,C越小,边界越胖,越多的样本被分错,所以C为无穷大时迫使所有样本都得满足约束

直接使用0/1的损失函数求解不好求,一般都是将其变为hinge损失函数:

c69c307a6c24f8c3077ffd71bfd9d4a4.png

此时,我们的优化目标函数也就变成了:

c1140e2500ec8434153a9e6693ff3e61.png

引入一个变量ξn=1− yi(Wx+b),我们成为“松弛因子”,如果yi(Wx+b)<1,带入hinge损失中,损失值大于0,说明样本被分错,因此ξn代表犯了多少错。优化的目标函数最终变为:

e31a9f4f1ef0da8773219dbd677fbe61.png

5. LR和SVM不同点

  • LR采用log损失,SVM采用合页(hinge)损失

逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值(基于统计的,其损失函数是人为设定的凸函数) 。支持向量机基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面.(有严格的推导)

  • LR对异常值敏感,SVM对异常值不敏感

支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用,虽然作用会相对小一些)。LR模型找到的那个超平面,是尽量让所有点都远离他,而SVM寻找的那个超平面,是只让最靠近中间分割线的那些点尽量远离,即只用到那些支持向量的样本。

  • 对非线性问题的处理方式不同

LR主要靠特征构造,必须组合交叉特征,特征离散化。SVM也可以这样,还可以通过kernel(因为只有支持向量参与核计算,计算复杂度不高)。(由于可以利用核函数,。SVM则可以通过对偶求解高效处理。LR则在特征空间维度很高时,表现较差。)

  • 正则化不同

SVM的损失函数就自带正则(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因,而LR必须另外在损失函数上添加正则项

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

svn复制出来的java_从svn下载的项目(或从别处拷贝来的)报错的可能情况以及解决经验...

1、sdk版本不符合。举个栗子&#xff1a;如果svn上的项目是用sdk10的&#xff0c;但是你电脑上最低sdk是14的&#xff0c;那么这时候就会报错。解决办法&#xff1a;a、鼠标点击项目&#xff0c;b、快捷键“altenter”&#xff0c;c、左侧点击“Android”&#xff0c;右侧选中一…

spring揭秘_被问到了! Spring 和 Spring Boot 之间到底有啥区别?

相信很多小伙伴和我一样&#xff0c;常用Spring 和Spring Boot 但是就是没有研究二者之间到底有什么区别&#xff1f;今天就来大揭秘 ↓概述对于 Spring和 SpringBoot到底有什么区别&#xff0c;我听到了很多答案&#xff0c;刚开始迈入学习 SpringBoot的我当时也是一头雾水&am…

mysql多表查询sql语句怎么写_MySQL基本SQL语句之单表查询、多表查询和子查询

一、简单查询&#xff1a;基本语法&#xff1a;SELECT * FROM tb_name;查询全部SELECT field1,field2 FROM tb_name; 投影SELECT [DISTINCT] * FROM tb_name WHERE qualification; 选择说明&#xff1a;FROM子句&#xff1a; 要查询的关系 表、多个表、其它SELECT语句WHERE子句…

sql 删除最低分数_软件测试从业者:必备SQL语句21天打卡,前10天

一、价值&#xff1a;1. 根据这些年的经验&#xff0c;帮软件测试从业者精选出&#xff1a;1)日常工作中&#xff0c;需要用到的SQL语句&#xff1b;2)软测面试中&#xff0c;笔试 / 面试 &#xff0c;需要用到的 SQL问题 & 答案 &#xff1b;2. SQL这种硬技能 &#xff0c…

php两个手机号正则表达式_php 手机号码验证正则表达式

php 手机号码验证正则表达式比较简洁的代码一&#xff1a;$str ;$isMatched preg_match(/^0?(13|14|15|17|18)[0-9]{9}$/, $str, $matches);var_dump($isMatched, $matches);代码二//正则表达式$tel "15558530459"; //作者的手机号码,如果有疑问可以电话联系我,或…

python defaultdict函数_Python中defaultdict与lambda表达式用法

这篇文章主要介绍了Python中defaultdict与lambda表达式用法&#xff0c;在这里分享给大家&#xff0c;需要的朋友可以参考下本文实例讲述了Python中defaultdict与lambda表达式用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;从教程中看到defaultdict是一个类&…

python中下拉菜单大小_自动化测试——Selenium+Python之下拉菜单的定位

1.通过selenium.webdriver.support.ui的Select进行定位下拉菜单如下图&#xff1a;定位代码(选择Male)&#xff1a;from selenium.webdriver.support.ui import Select# 通过index进行选择Select(driver.find_element_by_id("gender")).select_by_index(1)# 通过valu…

JAVA可不可以编写应用程序_编写一个java应用程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼另附Arith类&#xff1a;public class Arith {//默认除法运算精度小数点后面的位数private static final int DEF_DIV_SCALE 2;//这个类不能实例化private Arith() {}/*** 提供精确的加法运算。** param v1 被加数* param v2 加数…

ssms没有弹出服务器验证_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞

SQL Server Management Studio 17.4或更高版本的SSMS中提供了SQL Server漏洞侦测(VA)功能&#xff0c;此功能允许SQL Server扫描您的数据库以查找潜在的安全漏洞&#xff0c;并且可以针对SQL Server 2012或更高版本运行。如果您还没有使用SSMS上的较新版本&#xff0c;请不要担…

驱动api_消费者驱动契约已死?

吐槽文一篇。契约的一些问题在实践前后端分离的这些年来&#xff0c;已经诞生了一些技术与工具让前后端进行沟通&#xff1a;契约的 Mock 服务&#xff08;Mock Server&#xff09;。用于模拟一个服务器&#xff0c;为特定的接口返回特定的值。契约测试。对前后端协定的 API 进…

php表单提交邮箱_最全实现dede订单表单提交发送到指定邮箱(附前台设置)

打造销售型网站的订单系统。不是所有销售都有权限登陆网站后台查看订单&#xff0c;特别是外地出差时&#xff0c;用户下了订单后不能及时服务用户&#xff0c;可能会造成订单丢失。但dedecms默认的订单提交后只能在后台看到的&#xff0c;每次都要登陆到后台去查看很麻烦。以下…

鸢尾花python贝叶斯分类_机器学习-利用三种分类器实现鸢尾花分类

利用决策树&#xff0c;KNN和朴素贝叶斯三种分类器&#xff0c;对鸢尾花数据集进行分类。下面是具体的流程和代码&#xff1a;1、 数据读取&#xff1a;实验数据是直接加载的sklearn内置的鸢尾花数据集&#xff0c;共150条数据&#xff0c;包含4个特征&#xff0c;而且是一个三…

用php创建一相册文件_php文件创建

PHP-创建文件在您可以做任何一份档案&#xff0c;它已存在&#xff01;在这一课您将学习如何建立一个档案使用PHP 。广告Tizag.comPHP的-制造混乱在PHP中&#xff0c;某个文件创建使用的命令也被用来打开文件。这似乎有点混乱&#xff0c;但我们会努力澄清这一难题。在PHP的打开…

python编辑邮件格式_python发送邮件模板

python发送邮件(不带附件)模板import smtplibfrom email.mime.text import MIMETextfrom email.header import Headersender xxxxxxxxx163.comreceiver xxxxxx126.comsubject 报警username xxxxxxxx163.compassword xxxxmsg MIMEText(strs, plain, utf-8)msg[Subject] H…

php ckeditor 配置,Laravel5.6框架使用CKEditor5相关配置详解

本文实例讲述了Laravel5.6框架使用CKEditor5相关配置。分享给大家供大家参考&#xff0c;具体如下&#xff1a;Laravel 相关配置文件的上传与存储参考文档&#xff1a;创建符号链接php artisan storage:linkproject/public/storage -> project/storage/app/public修改配置文…

python通讯录运用的知识点_案例驱动式Python学习--通讯录存取

驱动案例通讯录&#xff1a;要求打印出企业全部十名员工通讯录。(要求有文件相关操作)内置函数自定义函数函数指被封装起来的、实现某种功能的一段代码。Python安装包、标准库中自带的函数统称为内置函数&#xff0c;用户自己编写的函数称为自定义函数&#xff0c;不管是哪种函…

udp怎么保证不丢包_在 Flink 算子中使用多线程如何保证不丢数据?

分析痛点笔者线上有一个 Flink 任务消费 Kafka 数据&#xff0c;将数据转换后&#xff0c;在 Flink 的 Sink 算子内部调用第三方 api 将数据上报到第三方的数据分析平台。这里使用批量同步 api&#xff0c;即&#xff1a;每 50 条数据请求一次第三方接口&#xff0c;可以通过批…

php 没有libmysql.dll,PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰

有朋友下载了PHP5.3&#xff0c;PHP5.4版本想加载mysql支持的时候发现没有libmysql.dll文件&#xff0c;无法完成mysql配置&#xff0c;其实PHP5.3版本开始&#xff0c;使用mysqlnd库&#xff0c;不再使用libmysql.dll用来访问MySQL数据库&#xff0c;大大提升了PHP的数据库访问…

堆排序时间复杂度_图解堆结构、堆排序及堆的应用

前言这次我们介绍另一种时间复杂度为 O(nlogn) 的选择类排序方法叫做堆排序。我将从以下几个方面介绍&#xff1a;堆的结构堆排序优化的堆排序原地堆排序堆的应用堆的结构什么是堆&#xff1f;我给出了百度的定义&#xff0c;如下&#xff1a;堆(Heap)是计算机科学中一类特殊的…

农历php,PHP农历公历转换

/*云南省曲靖师范学院计算机科学与工程学院-杨海熙编写2009-9-3*/class Lunar{private $_SMDay array(1 > 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);//定义公历月分天数private $_LStart 1950 ;//农历从1950年开始private $_LMDay array(//差&#xff1a;该年的…