当前位置: 首页 > news >正文

图文详解核方法——以核支持向量机KVSM为例

目录

  • 0 写在前面
  • 1 为什么需要核方法?
  • 2 常用核函数总结
  • 3 KSVM的python实现
    • 3.1 设计核函数
    • 3.2 KSVM与SVM的对比

0 写在前面

机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。

🚀详情:机器学习强基计划(附几十种经典模型源码合集)

1 为什么需要核方法?

说到核方法必须介绍一下线性可分的概念。所谓线性可分就是在 n n n维特征空间中可以用 n − 1 n-1 n1维超平面划分开正、负两个样本集,例如下图所示采用一条直线分开了二维平面上的正负样本

在这里插入图片描述
但现实情况下并非所有的数据都是线性可分的,比如

在这里插入图片描述

这种情况采用线性的机器学习模型,比如SVM是不可能取得很好的泛化能力的。这时候我们就思考:线性不可分的样本在其他维度的投影难道也是不可分的吗?

幸运的是,有这样一个定理

定理:若原始样本空间是有限维,则必存在一个高维特征空间使样本线性可分。

也就是说,理论上总存在划分超平面 π : w T ϕ ( x ) + b = 0 \pi : \boldsymbol{w}^T\phi \left( \boldsymbol{x} \right) +b=0 π:wTϕ(x)+b=0,其中 ϕ ( ⋅ ) \phi \left( \cdot \right) ϕ()是原始样本空间 X \mathcal{X} X到高维特征空间 F \mathcal{F} F的映射。比如之前线性不可分的样本集,在投影到更高维度的空间后就具有线性可分的性质。核方法就是一类把低维空间的非线性可分问题,转化为高维空间的线性可分问题的方法。

在这里插入图片描述

2 常用核函数总结

在实际问题中,由于不知晓怎样的 F \mathcal{F} F是合适的高维特征空间,即无法显式地确定 ϕ ( ⋅ ) \phi \left( \cdot \right) ϕ(),因此引入核函数(Kernel Function)

κ ( x i , x j ) = < ϕ ( x i ) , ϕ ( x j ) > = ϕ ( x i ) T ϕ ( x j ) \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\left< \phi \left( \boldsymbol{x}_i \right) ,\phi \left( \boldsymbol{x}_j \right) \right> =\phi \left( \boldsymbol{x}_i \right) ^T\phi \left( \boldsymbol{x}_j \right) κ(xi,xj)=ϕ(xi),ϕ(xj)=ϕ(xi)Tϕ(xj)

常见的核函数如表所示

名称表达式
线性核 κ ( x i , x j ) = x i T x j \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) ={\boldsymbol{x}_i}^T\boldsymbol{x}_j κ(xi,xj)=xiTxj
多项式核 κ ( x i , x j ) = ( x i T x j ) d \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\left( {\boldsymbol{x}_i}^T\boldsymbol{x}_j \right) ^d κ(xi,xj)=(xiTxj)d
高斯核 κ ( x i , x j ) = exp ⁡ ( − ∣ x i − x j ∣ 2 2 2 σ 2 ) \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\exp \left( -\frac{\left| \boldsymbol{x}_i-\boldsymbol{x}_j \right| _{2}^{2}}{2\sigma ^2} \right) κ(xi,xj)=exp(2σ2xixj22)
拉普拉斯核 κ ( x i , x j ) = exp ⁡ ( − ∣ x i − x j ∣ σ ) \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\exp \left( -\frac{\left| \boldsymbol{x}_i-\boldsymbol{x}_j \right|}{\sigma} \right) κ(xi,xj)=exp(σxixj)
Sigmoid核 κ ( x i , x j ) = tanh ⁡ ( β x i T x j + θ ) \kappa \left( \boldsymbol{x}_i,\boldsymbol{x}_j \right) =\tanh \left( \beta {\boldsymbol{x}_i}^T\boldsymbol{x}_j+\theta \right) κ(xi,xj)=tanh(βxiTxj+θ)

核函数不仅可以隐式地将 X \mathcal{X} X映射到高维特征空间 F \mathcal{F} F,还可以避免直接计算 ϕ ( x i ) T ϕ ( x j ) \phi \left( \boldsymbol{x}_i \right) ^T\phi \left( \boldsymbol{x}_j \right) ϕ(xi)Tϕ(xj),因为 ϕ ( x ) \phi \left( \boldsymbol{x} \right) ϕ(x)的维度可能很高而引发维数灾难。比如对于线性核

ϕ ( x i ) T ϕ ( x j ) = x i T x j \phi \left( \boldsymbol{x}_i \right) ^T\phi \left( \boldsymbol{x}_j \right)={\boldsymbol{x}_i}^T\boldsymbol{x}_j ϕ(xi)Tϕ(xj)=xiTxj

即高维映射后的样本内积和低维空间中的情况完全一致——因为是线性映射。

有一个问题是:凭什么高维线性可分空间的样本,其内积符合核函数的定义?

所以,核函数的缺陷在于不可解释 ϕ ( ⋅ ) \phi \left( \cdot \right) ϕ(),可能将 X \mathcal{X} X映射到不合适的 F \mathcal{F} F导致模型性能的下降和振荡。对于同一个数据集,应用不同的核函数投影,最终的准确率大概率是不一致的,可能这个数据集符合高斯核函数的投影,而另一个数据集更适应拉普拉斯函数。

3 KSVM的python实现

3.1 设计核函数

在详细推导序列最小优化SMO算法+Python实现中,我们从底层实现了线性软间隔SVM的模型。将其改造为核化SVM很容易:在基类svm_interface中添加一个核函数

def kernel(self, xi, xj):
    xi = xi.reshape(self.d, -1)
    xj = xj.reshape(self.d, -1)
    if self.kernelType == 'linear':
        res = np.dot(xi.T, xj)
        if res.size == 1:
            return np.squeeze(res)
        return res   
    elif self.kernelType == 'gauss':
        res = np.exp(-self.gamma * np.sum((xi - xj)**2, axis=0, keepdims=True)).T
        if res.size == 1:
            return np.squeeze(res)
        return res

这里只实现了线性核与高斯核

3.2 KSVM与SVM的对比

针对如下所示的线性不可分数据集

在这里插入图片描述
使用KSVM的预测准确率为

model = SVM_HEURISTIC(X, y, kernel='gauss', gamma=1.2)
model.train()
model.show()

>>> 准确率为0.97

使用SVM的预测准确率为

model = SVM_HEURISTIC(X, y)
model.train()
model.show()

>>> 准确率为0.6

完整源码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《机器人原理与技术》
  • 《机器学习强基计划》
  • 《计算机视觉教程》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

相关文章:

  • 计算机视觉 Project 1:Image Filtering and Hybrid Images
  • 云计算-Linux文件类型介绍,归属关系,基本权限介绍
  • DVWA靶场环境搭建
  • ES核心概念、IK分词器
  • 【JAVA】总结Java线程的几种状态
  • day009--mysql中的日期函数
  • sql语句 如果为空值显示为0
  • 【MySQL数据库】- 多表查询
  • C++文件服务器项目—数据库表设计 与 后端接口设计—6
  • 聊聊Redis的数据热点问题
  • 猿创征文|瑞吉外卖——管理端_员工管理
  • springcloud springboot nacos版本对应
  • Windows安装Visual Studio2019+OpenCV配置
  • 单片机——硬件系统
  • jenkins一键部署搭建
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 「面试题」如何实现一个圣杯布局?
  • canvas 五子棋游戏
  • C学习-枚举(九)
  • flask接收请求并推入栈
  • If…else
  • Javascript Math对象和Date对象常用方法详解
  • JavaScript学习总结——原型
  • Java教程_软件开发基础
  • leetcode46 Permutation 排列组合
  • PhantomJS 安装
  • REST架构的思考
  • SQLServer之创建显式事务
  • Vue 重置组件到初始状态
  • 阿里研究院入选中国企业智库系统影响力榜
  • 大快搜索数据爬虫技术实例安装教学篇
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 面试总结JavaScript篇
  • 区块链共识机制优缺点对比都是什么
  • 一个完整Java Web项目背后的密码
  • 主流的CSS水平和垂直居中技术大全
  • Linux权限管理(week1_day5)--技术流ken
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #{} 和 ${}区别
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (Note)C++中的继承方式
  • (二)c52学习之旅-简单了解单片机
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net 代码性能 - (1)
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @Responsebody与@RequestBody
  • @Transactional类内部访问失效原因详解