SVM算法—原理讲解

article/2025/10/1 3:25:34

原文作者:奔跑的前浪

原文地址:svm算法 最通俗易懂讲解

 

最近在学习svm算法,借此文章记录自己的学习过程,在学习时很多处借鉴了z老师的讲义和李航的统计,若有不足的地方,请海涵;svm算法通俗的理解在二维上,就是找一分割线把两类分开,问题是如下图三条颜色都可以把点和星划开,但哪条线是最优的呢,这就是我们要考虑的问题

首先我们先假设一条直线为 W•X+b =0 为最优的分割线,把两类分开如下图所示,那我们就要解决的是怎么获取这条最优直线及W 和 b 的值;在SVM中最优分割面(超平面)就是:能使支持向量和超平面最小距离的最大值;我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距

如上面假设蓝色的星星类有5个样本,并设定此类样本标记为Y =1,紫色圈类有5个样本,并设定此类标记为 Y =-1,共 T ={(X₁ ,Y₁) , (X₂,Y₂) (X₃,Y₃) .........} 10个样本,超平面(分割线)为wx+b=0;  样本点到超平面的几何距离为:

     

此处要说明一下:函数距离和几何距离的关系;定义上把 样本| w▪x₁+b|的距离叫做函数距离,而上面公式为几何距离,你会发现当w 和b 同倍数增加时候,函数距离也会通倍数增加;简单个例子就是,样本 X₁ 到 2wX₁+2b =0的函数距离是wX₁ +b =0的函数距离的 2倍;而几何矩阵不变;

下面我们就要谈谈怎么获取超平面了?!超平面就是满足支持向量到其最小距离最大,即求:max [支持向量到超平面的最小距离] ;那只要算出支持向量到超平面的距离就可以了吧 ,而支持向量到超平面的最小距离可以表示如下公式:

故最终优化的的公式为:

 根据函数距离和几何距离可以得知,w和b增加时候,几何距离不变,故怎能通过同倍数增加w和 b使的支持向量(距离超平面最近的样本点)上样本代入 y(w*x+b) =1,而不影响上面公式的优化,样本点距离如下:如上图其r1函数距离为1,k1函数距离为1,而其它样本点的函数距离大于1,及是:y(w•x+b)>=1,把此条件代入上面优化公式候,可以获取新的优化公式1-3:

公式1-3见下方:优化最大化分数,转化为优化最小化分母,为了优化方便转化为公式1-4

 

为了优化上面公式,使用拉格朗日公式KTT条件优化公式转化为:

对于上面的优化公式在此说明一下:比如我们的目标问题是 。可以构造函数:

此时 与 是等价的。因为 ,所以只有在 的情况下 才能取得最大值,因此我们的目标函数可以写为。如果用对偶表达式:,由于我们的优化是满足强对偶的(强对偶就是说对偶式子的最优值是等于原问题的最优值的),所以在取得最优值 的条件下,它满足 :,

结合上面的一度的对偶说明故我们的优化函数如下面,其中a >0

现在的优化方案到上面了,先求最小值,对 w 和 b 分别求偏导可以获取如下公式:

把上式获取的参数代入公式优化max值:

化解到最后一步,就可以获取最优的a值:

 

以上就可以获取超平面!

但在正常情况下可能存在一些特异点,将这些特异点去掉后,剩下的大部分点都能线性可分的,有些点线性不可以分,意味着此点的函数距离不是大于等于1,而是小于1的,为了解决这个问题,我们引进了松弛变量 ε>=0; 这样约束条件就会变成为:

故原先的优化函数变为:

对加入松弛变量后有几点说明如下图所以;距离小于1的样本点离超平面的距离为d ,在绿线和超平面之间的样本点都是由损失的,

其损失变量和距离d 的关系,可以看出 ξ = 1-d , 当d >1的时候会发现ξ =0,当 d<1 的时候 ξ = 1-d ;故可以画出损失函数图,如下图1-7;样式就像翻书一样,我们把这个损失函数叫做 hinge损失; 

下面我们简单的就来讨论一下核函数:核函数的作用其实很简单就是把低维映射到高维中,便于分类。核函数有高斯核等,下面就直接上图看参数对模型的影响,从下图可以了解,当C变化时候,容错变小,泛化能力变小;当选择高斯核函数的时候,随时R参数调大,准确度提高,最终有过拟合风险

下面就直接上代码了(鸢尾花SVM二特征分类):

iris_feature = u'花萼长度', u'花萼宽度', u'花瓣长度', u'花瓣宽度'if __name__ == "__main__":path = 'iris.data'  # 数据文件路径data = pd.read_csv(path, header=None)x, y = data[range(4)], data[4]y = pd.Categorical(y).codesx = x[[0, 1]]x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)# 分类器clf = svm.SVC(C=0.3, kernel='linear', decision_function_shape='ovo')clf.fit(x_train, y_train.ravel())# 准确率print clf.score(x_train, y_train)  # 精度print '训练集准确率:', accuracy_score(y_train, clf.predict(x_train))print clf.score(x_test, y_test)print '测试集准确率:', accuracy_score(y_test, clf.predict(x_test))x1_min, x2_min = x.min()x1_max, x2_max = x.max()x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j]  # 生成网格采样点grid_test = np.stack((x1.flat, x2.flat), axis=1)  # 测试点print 'grid_test = \n', grid_testZ = clf.decision_function(grid_test)Z = Z[:,0].reshape(x1.shape)print "decision_function:",Zgrid_hat = clf.predict(grid_test)grid_hat = grid_hat.reshape(x1.shape)mpl.rcParams['font.sans-serif'] = [u'SimHei']mpl.rcParams['axes.unicode_minus'] = Falsecm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])plt.figure(facecolor='w')plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)plt.scatter(x[0], x[1], c=y, edgecolors='k', s=50, cmap=cm_dark)      # 样本plt.scatter(x_test[0], x_test[1], s=120, facecolors='none', zorder=10)     # 圈中测试集样本plt.xlabel(iris_feature[0], fontsize=13)plt.ylabel(iris_feature[1], fontsize=13)plt.xlim(x1_min, x1_max)plt.ylim(x2_min, x2_max)plt.title(u'鸢尾花SVM二特征分类', fontsize=16)plt.grid(b=True, ls=':')plt.show()
最后画图如下: 


http://chatgpt.dhexx.cn/article/V7d9UYLg.shtml

相关文章

SVM --从“原理”到实现

零. 本文所有代码均能在我 github上的 DML 找到&#xff0c;顺便求点Star 一.引入 从一开始接触机器学习&#xff0c;就感觉SVM&#xff08;支持向量机 Support Vector Machine&#xff09;就是高端大气上档次的代名词啊&#xff0c;在深度学习出来之前一直都力压ANN一头&…

SVM算法详解

Support Vector Machine 终于&#xff0c;我们来到了SVM。SVM是我个人感觉机器学习中最优美的算法&#xff0c;这次我们要来非常细致地介绍。SVM是一类有监督的分类算法&#xff0c;它的大致思想是&#xff1a;假设样本空间上有两类点&#xff0c;我们希望找到一个划分超平面&…

SVM简介

SVM 文章目录 SVM一. 什么是SVM1. 简介2.SVM分类 二. 详细介绍1. 线性可分SVM1.1 支撑点&#xff0c;支撑向量1.2 分割超平面与间隔最大化1.3 线性可分SVM的目标函数以及相关算法1.4 线性可分SVM的简单举例 2.线性SVM2.1 为什么需要线性SVM2.2 线性SVM相关理论2.3 线性SVM算法 …

Svm算法原理及实现

Svm&#xff08;support Vector Mac&#xff09;又称为支持向量机&#xff0c;是一种二分类的模型。当然如果进行修改之后也是可以用于多类别问题的分类。支持向量机可以分为线性核非线性两大类。其主要思想为找到空间中的一个更够将所有数据样本划开的超平面&#xff0c;并且使…

SVM 原理详解,通俗易懂

看了该作者的文章&#xff0c;瞬间膜拜了&#xff01;讲得太好了&#xff01; 转自&#xff1a;http://www.blogjava.net/zhenandaci/category/31868.html &#xff08;一&#xff09;SVM的简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的&…

机器学习笔记6:SVM基本原理

SVM的基本原理&#xff1a; 1、最大间隔原则 2、对偶表示 3、KKT条件 SVM(Support Vector Machine)&#xff0c;又称支持向量机&#xff0c;在分类问题上&#xff0c;除了logistic分类回归外&#xff0c;还有另一种实现方式&#xff0c;那就是使用SVM原则。那么什么是SVM 呢。…

SVM原理

我们先认识一下SVM&#xff1a; &#xff08;1&#xff09;支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种对数据进行二分类的广义线性分类器&#xff0c;其分类边界是对学习样本求解的最大间隔超平面。 &#xff08;2&#xff09;SVM使用铰链损失函数…

通俗易懂SVM原理介绍,适合小白食用

目录 1、SVM概念描述 2、SVM数学表达及相关计算 3、SVM优化问题定义 附&#xff1a;证明区 【证明1】 【计算1】 1、SVM概念描述 如图一所示&#xff0c;存在两个数据集&#xff0c;我们希望通过一个超平面将两个数据集分割开&#xff0c;并且我们希望这个超平面离两个数…

01-Hive创建表

声明&#xff1a;本实验环境是Apache hadoop-2.2.0&#xff0c;zookeeper-3.4.5&#xff0c;mysql Server version: 5.1.73作为元数据库&#xff0c;hive版本是apache-hive-0.9.0-bin&#xff0c;都是apache&#xff0c;不是CDH和其他。本实验集群3台&#xff0c;一个主节点(ha…

hive 中创建表的三种方式

官网地址&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualDDL 通常我们所使用的创建hive表有三种方式 1.create table 首先我们找到官网对创建表的描述如下&#xff1a; ’[]’ 表示可选&#xff0c;’|’ 表示几选一 CREATE [TEMPORARY] [EXT…

hive创建新表——基础

创建基础表 1、创建表&#xff1a; create table if not exists orders 创建一个名叫“orders”的表&#xff0c;“if not exists”可以写可不写&#xff0c;如果相同名字的表已经存在&#xff0c;则抛出异常&#xff0c;可以用 IF NOT EXIST 选项来忽略这个异常。 2、定义表…

HIVE的常用操作-建库和表-插入数据

hive的安装&#xff08;远程模式&#xff09; 点击打开链接 使用hive----------------------- 启动hadoop 启动hive 创建数据库&#xff1a; create database myhive; 查看数据库&#xff1a; hive (default)> show databases; OK database_name default myhive 数…

Hive三种建表语句详解

转载自&#xff1a;https://blog.csdn.net/qq_36743482/article/details/78383964 注&#xff1a;hive其他语法在hive官网有说明&#xff0c;建议初学者&#xff0c;去官网学习一手的资料&#xff0c; 官网&#xff1a;https://cwiki.apache.org/confluence/display/Hive/Home#…

关于hive建表查询语句小记

库相关操作 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; IF NOT EXISTS 也就是没有重复库就创建&#xff0c;有重复就不执行建库 保证了建库…

hive、pg库,建表语句及查询表结构语句

1、hive hive 建表语句 DROP TABLE IF EXISTS tmp_001; CREATE TABLE tmp_001 (etl_time timestamp comment , day_id double comment , subs_id string comment , msisdn int comment ) comment partitioned by…

3、Hive数据仓库——建表语句

文章目录 Hive基本操作Hive查看SQL解析计划Hive建表建表1&#xff1a;全部使用默认建表方式 Hive 内部表 &#xff08;Managed tables&#xff09;指定location (这种方式也比较常用)formatted 查看该表的结构化数据&#xff0c;但并不列出表中的数据将本地数据上传到HDfS上 Hi…

HIVE的三种建表方式

目录 一、直接建表二、as &#xff08;直接使用查询结果插入到一张新表&#xff09;三、like&#xff08;复制表结构&#xff09; 一、直接建表 中括号里面的均为可选项 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name[(col_name data_type [COMMENT col_comment], ...…

Hive学习3:Hive三种建表语句详解

注&#xff1a;hive其他语法在hive官网有说明&#xff0c;建议初学者&#xff0c;去官网学习一手的资料&#xff0c; 官网&#xff1a;https://cwiki.apache.org/confluence/display/Hive/Home#Home-UserDocumentation Create Table 官网说明 Hive建表方式共有三种&#xff…

Hive_ Hive 建表语句详解

参考文章&#xff1a; https://blog.csdn.net/qq_36743482/article/details/78383964 最近博主在编写一个每天定时创建Hive 分区的脚本&#xff0c;其中需要创建Hive表&#xff0c; 开始的时候我以为创建Hive 表的语句顺序是比较宽松的&#xff0c;经过测试发现不然&#xf…

Hive建表语句详解--CREATE TABLE

创建表的三种方法 Hive创建表的方式&#xff08;默认路径/user/hive/warehouse&#xff0c;也可以location指定&#xff0c;主要针对external表&#xff09; 1、使用create命令创建一个新表,带分区 CREATE TABLE mydb.dept( dept_no int, addr string, tel string) par…