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. 学习-jdk8 特性

    jdk8新特性 Lambda 表达式 Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中.方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构 ...

  2. ABP 后台调用接口 获取返回的数据

    原文:https://www.cnblogs.com/i3yuan/p/10703500.html insert 简单测试: public void test8() { string url = &q ...

  3. 4.28(TG模拟赛)总结

    1.挖地雷 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任 ...

  4. 在centos系统的/etc/hosts添加了 当前主机的 ‘ NAT分配的IP controller’,RabbitMQ添加用户报错。

    在centos系统的/etc/hosts添加了 当前主机的 ' NAT分配的IP controller',RabbitMQ添加用户报错. rabbitMq添加用户 报错信息如下 [root@contr ...

  5. 10 张图带你深入理解 Docker 容器和镜像

    这篇文章希望能够帮助读者深入理解 Docker 的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中的容器之间的区别. 当我对 Docker 技术还是一知半解的 ...

  6. 快速排序详解(C语言/python)

    快速排序详解 介绍: 快速排序于C. A. R. Hoare在1960年提出,是针对冒泡排序的一种改进.它每一次将需要排序的部分划分为俩个独立的部分,其中一个部分的数比的数都小.然后再按照这个方法对这 ...

  7. 内网服务器离线编译安装mysql5.7并调优

    目录 内网服务器离线编译安装mysql5.7并调优 前言 关于MySQL 一.MySQL安装篇 部署环境 前期准备工具 挂载系统ISO镜像,配置yum源 二.MySQL调优篇 1.对MySQL进行安全 ...

  8. Logstash测试的时候,报Error occurred during initialization of VM,Could not reserve enough space for object heap

    今天配置Logstash的时候,启动输入logstash ‐e 'input { stdin { } } output { stdout {} }'就开始报错了,Error occurred duri ...

  9. lua entry thread aborted: runtime error: /usr/../process.lua:448: attempt to concatenate field 'np_sum_duration' (a userdata value)

    [1]问题场景原代码 引起问题的原代码,访问数据库,汇总数据后,使用汇总结果报异常: local function amount_sum_fee(cycleid) local select_produ ...

  10. Java学习:JDBC各类详解

    JDBC各个类详解 代码实现: //1.导入驱动jar包 //2.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //3.获取数据库连对象 ...