Why 核函数

目的是为了解决线性不可分问题.

核心思想是升维. 当样本点在低维空间不能很好地分开的时候, 可以考虑将样本通过某种映射(就是左乘一个矩阵) 到高维空间中, 然后在高维空间就容易求解一个平面 \(w^Tx +b\) 将其分开了.

想法是很美滋滋, 但立马就有一个问题,计算量大, 升到几百几千维, 内存怕是受不了. 这就立马联想到PCA 降维. 我在上大学的时候, 做客户细分,和用户画像(ps, 我是市场营销专业嘛), 通常是会用到降维技术, 然后提取主成分或做因子分析, 目的都是为了降维和使数据具有可解释性. 结果核函数却要升维度, 感觉是费力费力搞了半天, 又回去了.

低高维

  • 维度的理解应从向量空间去理解(构成该空间的基是几个),要从数学概念上理解. 这个什么"三维空间, 四维时间" 的物理概念是不一样的. 千万不要混淆什么时间,空间, 还有举个栗子, 如果连基本的抽象思维都没有, 那确实有些尴尬

映射(变换)

  • 数据的值大小肯定跟原来的是不一样了呀. 在形式上就是左乘一个矩阵, \(X' = PX\), 可理解矩阵本质是一个特殊的函数, 特殊在于它更像是咱们写代码时 自定义函数 可以完成咱自定义的功能, 如对样本进行 旋转, 拉伸(特征分解), 或拉伸旋转(SVD 分解) 等. 这些内部代码, 就封装在你定义的矩阵中.

PCA降维

  • 就是对原输入样本X(矩阵) 左乘一个旋转矩阵P, 是的 PX 的方差尽可能逼近 X, 即丢掉一些方差贡献小的维度,这样就降维了呀( 注: PX 是对原X 进行线性组合了呀(加和数乘) 数据也改变了, 已经不是原来的狗子哦

真的要在高维度中进行计算?

不存在的. 天才的人类哦, 想出了所谓的 kernel trick, 核心思想是大致这样的:

在低维和高维的关系上, 构造出一一个函数, 这个函数满足, 在低维空间下对样本进行计算的结果 跟在高维中计算的结果是相近的, 果然是小小的核(壳), 大大的梦想!

这简直不要太美, 真的是事半功倍呀. 能满足这样的函数, 就是我们平时谈的核函数, 过然很 trick 呀.

进入正题, 根据之前推导出的 SVM 的dual 形式:

\(max_w \ f(a) = \sum \limits _{i=1}^n a_i - \frac {1}{2} \sum \limits_{i=1}^n \sum \limits_{j=1}^n y_i y_j a_i a_j <x_i, x_j> \\ s.t.\)

\(0<= a_i \le C \\ \sum \limits_{i=1}^n a_i y_i = 0​\)

我们引入一个函数 k, 用 \(K(x_i, x_j)\) 代替 \(<x_i, x_j>\)

于是原来的dual变为了:

\(max_w \ f(a) = \sum \limits _{i=1}^n a_i - \frac {1}{2} \sum \limits_{i=1}^n \sum \limits_{j=1}^n y_i y_j a_i a_j K(x_i, x_j)\)

这就叫做带核函数的SVM, 跟之前的区别在于,样本在做点积的时候经过了一个函数去映射, 当然, 其实对应的a_i 跟原来不带核的也是变化了的.

\(k(x_i, y_j) = <\phi(x_i), \phi(x_j)>\)

将原始特征映射到更高维

假设升维的映射是:

\(\Phi: \ X \rightarrow X' = \Phi (X) = X^2\)

则:

\(\Phi([x_{i1}, x_{i2}]) = [x_{i1}, x_{i2}, x_{i1} x_{i2}, x_{i1}^2, x_{i2}^2]\)

这样就升高维度了哦.

Kernel Function

支持向量机通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x) ⋅φ( x′) > 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数 K(x, x′) 直接得到非线性变换的内积,使大大简化了计算。这样的函数 K(x, x′) 称为核函数。

Kernel 的 Mercer's Theorem

一个函数(矩阵) 要能成为核函数, 在数学上已经证明, 必须满足 Mercer 定理(后面再证吧)

Mercer 定理

如果函数是 \(R^n * R^n \rightarrow n\) 上的映射 , 该函数是核函数,当且仅当, 对于训练样本点 经过映射后的,值构成的矩阵是半正定的.

半正定

对于一个对称矩阵A, \(\forall \ x, 都满足 x^TAx \ge 0\) , 有很多优良的性质, 嗯,这里先空着吧, 后面专门来整整.

接着上面svm讨论:

\(K(x_i, x_j) = <\Phi(x_i), \Phi(x_j)>\)

需要计算一波称为 Gram 矩阵的东西:

\(G_{i,j} = K(x_i, x_j)\)

即样本 \(x_i, x_j\) 做了K映射后的值,作为矩阵 G 的第 i 行, 第 j 列元素值 , 必须满足:

  • G 是对称矩阵
  • G 是 半正定矩阵, 即( \(z^TGz \ge 0, \ z \in R^n\))

这样的话, K 就是一个核函数了.

常用的Kernel

就是为了方调 API提高工作效率, 当然是在前人的基础之上的. 不可能每个都去自己造轮子. 我也是, 基本上从不生产代码, 只是API的搬运工.

Polynomial Kernel (多项式核)

\(K(x_i, x_j) = (<x_i, x_j> +c)^d, \ 其中c,d 都为常量\)

  • 当 c = 0, d=1 时, 就成为线性核, 即无核SVM \(K(x_i, x_j) = <x_i, x_j>\)

c 用来控制低阶项的长度

case1: \(K(x_i, x_j) = (<x_i, x_j> +0)^2\)

原来样本: \(X_i = [x_{i1}, x_{i2}]^T , \ X_j = [x_{j1}, x_{j2}]^T\)

kernel: \(K(X_i, X_j) = <X_i, X_j)^2\)

\(=(x_{i1} x_{j1} + x_{i2} x_{j2})^2\)

\(= x_{i1}^2 x_{j1}^2 + x_{i2}^2 x_{j2}^2 + 2x_{i1} x_{j1} x_{i2} x_{j2} \\ =\ <\Phi(X_i), \Phi(X_j)>\)

其中, 样本的变换为:

\(\Phi(X_i) = [x_{i1}^2, x_{i2}^2, \sqrt {2} x_{i1} x_{i2}] \\ \Phi(X_j) = [x_{j1}^2, x_{j2}^2, \sqrt {2} x_{j1} x_{j2}\)

从本例,也就是说, 该 kernel 函数实现了等价的高维映射计算 & 包含的升维 是从 2维 -> 3维

高斯核(rbf)

Gaussian Kernel 也被称为 Radial Basis Function Kernel. (咋翻译呢? 嗯, 椭圆图?) 就是在调包时候的参数 'rbf'.

\(K(X_i, X_j) = e^(- \frac {||X_i - X_j||_2^2} {2 \sigma^2})\)

  • \(\sigma\) 可以用样本方差估计总体得出哦
  • \(X_i = X_j\) 时, 值为1
  • 随着 \(X_i 与 X_j\) 距离增加, 值倾向于0 (因为\(\sigma\) 变大了嘛, 钟图平缓了)

  • 使用高斯核之前需要先将特征标准化

case 高斯核svm

假设通过之前svm 的dual形式下训练出的 a 为:

\(a = [-0.5, 1,1, 1]\)

工作的原理就是, 通过新输入的一个样本x', 与其余样本看相似度

$y = a_0 + a_1K(x_1, x_2) + a_1K(x_1, x_2+a_2K(x_1, x_2)+a_3K(x_1, x_2)) $ 的正负号

假设 x' 距离x1 特别近(近1, 远0), 里其他相对远,则:

\(y= -0.5 + 1*1 + 1*0 + 1*0 + 1*0 = 0.5 \ge 0\) 则x'被分为 正类

Sigmoid Kernel

激活函数核

\(K(x_i, x_j) = arc \ tan(m x_i^T x_j + c)\)

此时的SVM就相等于一个没有隐含层(Hidden Layer) 的简单神经网络哦

Cosine Similarity Kernel

余弦相似度核

\(K(x_i, x_j) = \frac {x_i^T x_j}{||x_i|| ||x_j||}\)

常用于衡量两段文字的相似性. 文本处理嘛 ,首先就是要词向量化. "相似" 的计算, 其实就是计算两个词向量的向量夹角的余弦值, 越靠近,值越接近1嘛.

Chi-squared Kernel

卡方检验核 (哎呀, 是在是不知道怎么翻译, 就是统计里的 卡方检验嘛), 跟上面差不多的

\(K(x_i, x_j) = \frac {x_i^T x_j}{||x_i|| ||x_j||}\)

这个在图像处理可能会用, 用于衡量概率分布的相似性,ML我倒是没有用. 卡方检验 嗯, 在我上大三的时候, 就是市场调研的数据分析, 因为要经常做假设检验 会用得多一点, 在分类样本的相关性方面.

卡方检验

  • 统计样本的实际观测值与理论推断值之间的偏离程度.

  • 实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;

  • 二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。

前面推导了这么多, 就是为了得到这么一个东西:

\(max_w \ f(a) = \sum \limits _{i=1}^n a_i - \frac {1}{2} \sum \limits_{i=1}^n \sum \limits_{j=1}^n y_i y_j a_i a_j K(x_i, x_j)\)

因此, 怎么理论落地, 用写代码的方式求解, 这就有点东西了, 其实, 写为上面的形式, 个人感觉就是为了写代码求解 a 做准备哦.

小结(svm)理论

  • convex (KKT)

  • max margin
  • svm primal
  • svm dual (lagrange)
  • slack svm
  • kernel svm

还有就是求解 smo , 多分类应用这些了.主要理论其实到这里感觉就差不多了.对于来说.

ML- 核函数(Kernel) 的 SVM的更多相关文章

  1. 机器学习——支持向量机(SVM)之核函数(kernel)

    对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...

  2. SVM: 使用kernels(核函数)的整个SVM算法过程

    将所有的样本都选做landmarks 一种方法是将所有的training data都做为landmarks,这样就会有m个landmarks(m个trainnign data),这样features就 ...

  3. 核函数(kernel function)

    百度百科的解释: 常用核函数: 1.线性核(Linear Kernel): 2.多项式核(Polynomial Kernel): 3.径向基核函数(Radial Basis Function),也叫高 ...

  4. SVM中径向基函数与高斯核的区别 Difference between RBF and Gaussian kernel in SVM

    Radial Basis Functions (RBFs) are set of functions which have same value at a fixed distance from a ...

  5. [白话解析] 深入浅出支持向量机(SVM)之核函数

    [白话解析] 深入浅出支持向量机(SVM)之核函数 0x00 摘要 本文在少用数学公式的情况下,尽量仅依靠感性直觉的思考来讲解支持向量机中的核函数概念,并且给大家虚构了一个水浒传的例子来做进一步的通俗 ...

  6. 机器学习——SVM详解(标准形式,对偶形式,Kernel及Soft Margin)

    (写在前面:机器学习入行快2年了,多多少少用过一些算法,但由于敲公式太过浪费时间,所以一直搁置了开一个机器学习系列的博客.但是现在毕竟是电子化的时代,也不可能每时每刻都带着自己的记事本.如果可以掏出手 ...

  7. 【机器学习】SVM核函数

    知识预备 1. 回顾:logistic回归出发,引出了SVM,即支持向量机[续]. 2.  Mercer定理:如果函数K是上的映射(也就是从两个n维向量映射到实数域).那么如果K是一个有效核函数(也称 ...

  8. 6. 支持向量机(SVM)核函数

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  9. svm核函数的理解和选择

    https://blog.csdn.net/leonis_v/article/details/50688766 特征空间的隐式映射:核函数    咱们首先给出核函数的来头:在上文中,我们已经了解到了S ...

随机推荐

  1. django ORM CRUD

    一.增加数据-Create 1.类名.objects.create(属性=值,属性=值) Myomodel.objects.create(name=) 2.d={"属性":&quo ...

  2. NOIP2013-2014提高组题目浅析

    1.前言 迎接NOIP的到来...在这段闲暇时间,决定刷刷水题.这里只是作非常简单的一些总结. 2.NOIP2014 <1> 生活大爆炸之石头剪刀布(模拟) 这是一道考你会不会编程的题目. ...

  3. 【BZOJ3837】[PA2013]Filary

    [BZOJ3837][PA2013]Filary 题面 darkbzoj 题解 考虑到模数为\(2\)时答案至少为\(\frac n2\),这是我们答案的下界. 那么我们对于任意的一个数,它们答案集合 ...

  4. 原生 JS 实现最简单的图片懒加载

    懒加载 什么是懒加载 懒加载其实就是延迟加载,是一种对网页性能优化的方式,比如当访问一个页面的时候,优先显示可视区域的图片而不一次性加载所有图片,当需要显示的时候再发送图片请求,避免打开网页时加载过多 ...

  5. Unable to resolve service for type 'Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider' while attempting to activate 'Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMid

    System.InvalidOperationException HResult=0x80131509 Message=Unable to resolve service for type 'Micr ...

  6. OpenCV4.1.2 QRCode解码体验测评(附源码+支持中文)

    目前官方Release的OpenCV最新版本为4.1.2,偶然看到更新信息里面QRCode解码性能有提升,所以迫不及待想尝试一下,因为上次测试了4.0版本的效果不太好. 下载和配置OpenCV的步骤此 ...

  7. k8s+Jenkins+GitLab-自动化部署项目

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 此文阅读目录: 1.闲聊 ...

  8. 由一个问题引起的思考:WEB开发中,使用JSON-RPC好,还是RESTful API好?

    起因: 研究zabbix的API设计风格.查看zabbix官网API文档,可以看到使用的是json-rpc:2.0 随后搜索到知乎上的一个问题讨论:https://www.zhihu.com/ques ...

  9. memcached源码分析一-slab

    Slab作为一种内存管理方案,其作用主要有以下2点: a) 避免频繁的内存分配释放造成的内存碎片 b) 减少内存分配操作产生的性能开销 Linux内核数据结构中也有slab的设计,Linux提供了一套 ...

  10. .NET下使用HTTP请求的正确姿势

    来源:Lewis.Zou cnblogs.com/modestmt/p/7724821.html 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的 ...