核方法计算

2023-11-16

什么是核方法?

往简单里说,核方法是将一个低维的线性不可分的数据映射到一个高维的空间、并期望映射后的数据在高维空间里是线性可分的。我们以异或数据集为例:在二维空间中、异或数据集是线性不可分的;但是通过将其映射到三维空间、我们可以非常简单地让其在三维空间中变得线性可分。比如定义映射:

该映射的效果如下图所示:

可以看到,虽然左图的数据集线性不可分、但显然右图的数据集是线性可分的,这就是核工作原理的一个不太严谨但仍然合理的解释

从直观上来说,确实容易想象、同一份数据在越高维的空间中越有可能线性可分,但从理论上是否确实如此呢?1965 年提出的 Cover 定理从理论上解决了这个问题,我们会在文末附上相应的公式,这里暂时按下不表

至此,似乎问题就转化为了如何寻找合适的映射、使得数据集在被它映射到高维空间后变得线性可分。不过可以想象的是,现实任务中的数据集要比上文我们拿来举例的异或数据集要复杂得多、直接构造一个恰当的[公式]的难度甚至可能高于解决问题本身。而核方法的巧妙之处就在于,它能将构造映射这个过程再次进行转化、从而使得问题变得简易:它通过核函数来避免显式定义映射[公式]。往简单里说,核方法会通过用能够表示成[公式]的核函数[公式]替换各算式中出现的内积[公式]来完成将数据从低维映射到高维的过程。换句话说、核方法的思想如下:

  • 将算法表述成样本点内积的组合(这经常能通过算法的对偶形式实现)
  • 设法找到核函数,它能返回样本点[公式][公式][公式]作用后的内积
  • 用替换[公式]、完成低维到高维的映射(同时也完成了从线性算法到非线性算法的转换)

当然了,不难想象的是,并不是所有的函数都能够对应一个映射(亦即不是所有的[公式]都能拆成[公式];比如说,显然[公式]至少需要是一个对称函数)。幸运的是,1909 年提出的 Mercer 定理解决了这个问题,它的具体叙述会在文末给出

Mercer 定理为寻找核函数带来了极大的便利。可以证明如下两族函数都是核函数:

  • 多项式核
     
  • 径向基(Radial Basis Function,常简称为 RBF)核:
     

那么核方法的应用场景有哪些呢?在 2002 年由 Scholkopf 和 Smola 证明的表示定理告诉我们它的应用场景非常广泛。定理的具体内容同样会附在文末,这里就暂时按下不表

核模型的表现

还是用 GIF 来说明问题最为形象。当我们对感知机应用核方法后,它就能对非线性数据集(比如螺旋线数据集)进行分类了,训练过程将如下:

怎么应用核方法?

简单来说,就是把算法中涉及到样本(

)的地方都通过某种变换、弄成样本的内积形式(

)。以感知机为例,感知机的原始损失函数为

为了让损失函数中的样本都变成内积形式,考虑令

(也有令

的)

在此之上应用核方法是平凡的:设核函数为,只需把所有的[公式]换成[公式]即可:

于是优化问题变为

预测步骤则变为

对于 LinearSVM 而言,用同样的手法不难得出其核形式:

预测步骤则仍然是

(有没有发现核形式和对偶形式很像?( σ'ω')σ)

如何训练核模型?

【注意:为简洁,从此往后的推导和实现均以核感知机为例,核 SVM 的相关讨论会放在下一章介绍 SMO 算法时进行】

简洁起见,我们还是用梯度下降法来进行训练,为此我们需要进行求导工作。假设当前模型参数为,[公式]在参数[公式]下的预测值为[公式],则:


[公式]

为了加速训练,我们需要将该算式向量化,为此我们需要定义核矩阵。假设现在我们有两组样本:和[公式],那么它们的核矩阵即为

对于训练过程而言,我们关心的是训练样本之间的核矩阵

利用它,不难写出相应的向量化代码:

# 假设 k_mat 存储着原样本之间的核矩阵
# 1、计算损失
err = -y * (k_mat.dot(alpha) + b)
# 2、找出使得损失不小于 0 的样本
mask = err >= 0
# 3、进行相应梯度下降,lr 是学习速率
delta = lr * y[mask]
alpha += np.sum(delta[..., None] * k_mat[mask], axis=0)
b += np.sum(delta)

对于预测过程,我们关心的是原样本和新样本之间的核矩阵。假设新样本为,则

那么预测过程即为

于是关键就在于如何定义计算核矩阵的核函数了。对于多项式核来说,核函数的实现是直观的:

@staticmethod
def _poly(x, y, p):
    return (x.dot(y.T) + 1) ** p

但对于 RBF 来说就没那么直观了,用到了 Numpy 的高级实用技巧之一——升维:

@staticmethod
def _rbf(x, y, gamma):
    return np.exp(-gamma * np.sum((x[..., None, :] - y) ** 2, axis=2))

当然直接用 for 来实现也是可以的,不过那将会非常非常慢……

核模型的实现

如果思路能够整理清楚,那么核模型相比原模型来说只有如下两点改变:

  • 需要定义核函数并计算出核矩阵
  • 计算预测值时不是,而是[公式],其中
    • 在训练时,[公式]为原样本之间的核矩阵
    • 在测试时,[公式]为原样本和新样本的核矩阵

所以实现起来的话会有许多重复代码,这里就只展现其中最核心的部分(仍以核感知机为例):

# 训练代码
def fit(...):
    ...
    self._alpha = np.zeros(len(x))
    self._b = 0.
    self._x = x
    # self._kernel 即为核函数,能够计算两组样本的核矩阵
    k_mat = self._kernel(x, x)
    for _ in range(epoch):
        err = -y * (self._alpha.dot(k_mat) + self._b)
        if np.max(err) < 0:
            continue
        mask = err >= 0
        delta = lr * y[mask]
        self._alpha += np.sum(delta[..., None] * k_mat[mask], axis=0)
        self._b += np.sum(delta)

# 预测代码
def predict(self, x, raw=False):
    x = np.atleast_2d(x).astype(np.float32)
    # 计算原样本与新样本的核矩阵并根据它来计算预测值
    k_mat = self._kernel(self._x, x)
    y_pred = self._alpha.dot(k_mat) + self._b
    if raw:
        return y_pred
    return np.sign(y_pred).astype(np.float32)

相关数学理论

1)Cover 定理

若设 d 维空间中 N 个点线性可分的概率为,那么就有:

其中

证明从略(也就是说我不会)(喂),但是不难从中看出,它证明了当空间的维数 d 越大时、其中的 N 个点线性可分的概率就越大,这构成了核方法的理论基础之一

2)Mercer 定理

若是对称函数(亦即[公式])的话,那么它具有 Hilbert 空间中内积形式的充要条件有以下两个:

  • 对任何平方可积的函数、满足
    [公式]
  • 对含任意 N 个样本的数据集,核矩阵:
    [公式]
    是半正定矩阵

【注意:通常我们会称满足这两个充要条件之一的函数为 Mercer 核函数而把核函数定义得更宽泛。不过如果不打算在理论上深入太多的话,将 Mercer 核函数简称为核函数是可以的。此外,虽说 Mercer 核函数确实具有 Hilbert 空间中的内积形式、但此时的 Hilbert 空间并不一定具有“维度”这么好的概念(或说、可以认为此时 Hilbert 空间的维度为无穷大;比如说 RBF 核,它映射后的空间就是无穷维的)】

3)表示定理

设为核函数[公式]对应的映射后的空间(RKHS),[公式]表示[公式][公式]的范数,那么对于任意单调递增的函数[公式]和任意非负损失函数[公式]、优化问题

的解总可以表述为核函数的线性组合

这意味着对于任意一个损失函数和一个单调递增的正则化项组成的优化问题、我们都能够对其应用核方法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核方法计算 的相关文章

  • MATLAB 中元胞数组的左连接

    I ve 2 cellMATLAB 中的数组 例如 A jim 4 paul 5 sean 5 rose 1 第二个 B jim paul george bill sean rose 我想做一个 SQL 左连接 这样我就可以得到 B 中的所
  • 与超类和子类构造函数接口

    我在 matlab 文档和之前有关使用 matlab 继承和类构造函数创建接口的问题中找不到帮助 为了使其整洁 放在一个包内 我可以将其压缩如下 而不是拖拽代码 一套 MyPkg有一个超类Super和一些子类Sub1 Sub2 我的大多数属
  • MATLAB 链表

    有哪些可能的方法来实现链表MATLAB http en wikipedia org wiki MATLAB 注意 我问这个问题是为了教学价值 而不是实用价值 我意识到 如果您实际上在 MATLAB 中滚动自己的链表 那么您可能做错了什么 然
  • 在 matlab/octave 中将数据集分成两个子集 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 将数据集分为两个子集 例如 训练 和 测试 其中 训练集包含 80 的数据 测试集包含剩余的 20 分裂的意思是生成一个长度等于的逻辑索引
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 如何读取 10 位原始图像?其中包含 RGB-IR 数据

    我想知道如何从我的 10 位原始 它有 rgb ir 图像数据 数据中提取 RGB 图像 如何使用 Python 或 MATLAB 进行阅读 拍摄时的相机分辨率为 1280x720 室内照片图片下载 https drive google c
  • 估算缺失数据,同时强制相关系数保持不变

    考虑以下 excel 数据集 m r 2 0 3 3 0 8 4 0 1 3 2 1 5 2 2 3 1 9 2 5 1 2 3 0 2 0 2 6 我的目标是使用以下条件填充缺失值 将上述两列之间的成对相关性表示为 R 大约 0 68 将
  • 如何从绘图处理程序中绘图?

    我有绘图的处理程序或图形的处理程序 例子 h plot 1 0 2 10 xx get h xx DisplayName Annotation 1x1 handle Color 0 0 1 LineStyle LineWidth 0 500
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数
  • 优化 MATLAB 代码(嵌套 for 循环计算相似度矩阵)

    我正在 MATLAB 中基于欧几里德距离计算相似度矩阵 我的代码如下 for i 1 N M N is the size of the matrix x for whose elements I am computing similarit
  • 如何在Matlab中将世界坐标转换为像素索引

    我有 512x512x313 体积的 dicom 图像 并且我有一个以世界坐标表示的点 57 7475 63 4184 83 1515 我如何在 Matlab 中获得该世界坐标的相应像素坐标 我不想戳破你的幻想 但你所要求的是不可能的 我能
  • 为什么 MATLAB 在打印大量 (.png) 图形时速度会变慢?

    我正在将大量数字打印为 png 文件 每个图都是数据矩阵中的一列图 我获取 png 文件并将它们串在一起形成动画 我的问题是 前几百张图像打印得很快 但创建每个新图形的时间却迅速增加 从前几百个 png 文件的约 0 2 秒到第 800 个
  • 从 imread 返回的 ndims

    我正在从文件夹中选取图像 尺寸为128 128 为此 我使用以下代码行 FileName PathName uigetfile jpg Select the Cover Image file fullfile PathName FileNa
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 在Matlab中选择图像上的像素时,索引指的是什么?

    当在Matlab中查看图像的单个像素时 该索引指的是什么 X Y 指的是像素的坐标 RGB 指的是颜色 但是关于索引是什么有什么想法吗 为了澄清一下 当我在 Matlab 中查看图形并使用数据光标选择一个点时 显示的三行是 X Y 指数 R
  • matlab部署工具到java包javac错误

    我正在尝试将我的程序包装为与 java 一起使用 我首先尝试了一个简单的 hello world 你好世界 m disp 你好世界 我使用了deploytool并选择了java包 当它到达这一行时 执行命令 javac verbose cl
  • 从筛查乳腺 X 光检查数字数据库 (DDSM) 获取数据

    我正在尝试以可读格式获取 DDSM 数据集 有谁有 DDSM heathusf 程序的工作版本 可以在 Linux 或 Windows 上正常运行吗 我知道 DDSM 的 jpeg 程序有一个适用于 linux 的工作版本 位于http w
  • 如何为已编译的 MATLAB 创建安装程序并要求用户接受我们的许可条款?

    我正在 MATLAB 中编写程序分发给 Windows 用户 我使用 MATLAB 编译器和 MATLAB r2014a 版本来创建程序 我可以使用 MATLAB 应用程序编译器创建 Windows 安装程序 并且它的工作效果可以接受 但是

随机推荐

  • C++模板实参类型推导

    1 什么是模板 C 特性之一 批量生成代码的手段 2 模板有什么应用 1 泛型编程 例如 std vector 2 模板元编程 利用模板的特化等特性 在编译期计算出结果 例如 3 模板实参类型推导 虽然模板这么牛逼 但是今天我们不讲上述两个
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • 解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 20.2.1 is available.

    一开始遇到这个问题在网上找了很多发现解决不了问题的根本 一开始我以为是网络的问题 后来一直是这样 然后有大佬告诉我你可能python版本太高了 他说卸载了换3 7的 3 8的很多功能都用不了 不过这样是很麻烦的 因为之前也安装了一些库 如果
  • 云服务器上Wamp搭建网站

    说明 想要在云服务器搭建网站 且需要被外网访问浏览的苦逼程序员可以参考本文 前提是你已经购买好了服务器以及公网IP 近一个月买了3次服务器 使用wamp搭建了3次网站了 本以为最后一次会轻车熟路 但是东搞西搞还是花了1个多小时 看来还是要把
  • (附源码)python+mysql+基于协同过滤算法的书籍推荐 毕业设计101555

    摘 要 21世纪的今天 随着社会的不断发展与进步 人们对于信息科学化的认识 已由低层次向高层次发展 由原来的感性认识向理性认识提高 管理工作的重要性已逐渐被人们所认识 科学化的管理 使信息存储达到准确 快速 完善 并能提高工作管理效率 促进
  • “晓白”学python-科普篇(3)-那些和python相关的岗位之python-web开发工程师

    老袁啊 python有这么广泛的应用 那我学好python能不能找到一份和python相关的工作呢 晓白问道 老袁听了回答道 你这个问题太笼统了 实际上你想问的是两个问题 一个就是那个工作岗位和python是相关的 第二个就是这些工作岗位对
  • nginx 正向代理 配置 http 和 https

    nginx 正向代理 配置 http 和 https 应用场景 同学A 所在公司对外网有所限制 借助云服务器nginx正向代理 实现正常浏览公网资料 服务端 云服务器 安装nginx cd usr local wget http nginx
  • Vue3内置组件teleport详解

    teleport的作用 该组件可以将指定内容渲染到特定容器中 而不受 DOM 层级的限制应用场景 当蒙层内容在一个组件中时 蒙层内容是无法遮挡住全部内容的 因此 需要使用teleport将蒙层内容渲染到更全局的组件中 如果不使用telepo
  • python入门(二)——数据类型

    目录 一 数字类型 二 字符串 例题1 凯撒密码 例题2 星号三角形 三 time模块 人家说合格的程序员要养成经常写博客的习惯 嗯 我正在培养中 日积月累 希望自己能坚持下去 一 数字类型 1 整数 与往常的C C 等语言的不同是 pyt
  • python为什么没有指针_Python的指针:有什么意义?

    Python部落 python freelycode com 组织翻译 禁止转载 欢迎转发 目录为什么Python没有指针 Python中的对象 不可变对象和可变对象 了解变量C的变量 Python的名称 关于Python的预实现对象的注释
  • slect( )、poll( )、epoll( )函数详解

    1 slect 函数 1 1 函数原型 include
  • QT 手动建立 带参数的信号槽

    在QT中 如果直接使用UI 在控件上点击槽函数自动建立信号槽及槽函数是非常方便的 但是 有时候 我们会采用全代码 动态建立窗口和控件 这个时候就需要手动方式来建立控件的槽函数 方法如下 1 首先在window h头文件中添加 public
  • Java中多态的实现机制

    多态性是面向对象程序设计代码重用的一个重要机制 我们曾不只一次的提到Java多态性 在Java运行时多态性 继承和接口的实现一文中 我们曾详细介绍了Java实现运行时多态性的动态方法调度 今天我们再次深入Java核心 一起学习Java中多态
  • JavaScript 错误处理

    错误处理 一 What 什么是错误处理 错误是指导致系统不能按照用户意图工作的一切原因 事件 在程序设计过程中 由于某些错误的存在 致使程序无法正常运行 处理这些错误以使程序正确运行就称为错误处理 错误处理功能是衡量编译器性能的重要方面 它
  • elasticsearch 出现 cluster_block_exception read_only_allow_delete问题

    做爬虫的时候 只是简单的存入elasticsearch中 在测试服务器上结果发现老是插入不进去 提示的错误 logstash outputs elasticsearch retrying failed action with respons
  • java数组经典题目:数3退1;每数到3就退出一个人,求最后剩下一个人的编号;

    import java util Arrays public class Tes public static void main String args 数3退1 每数到3就退出一个人 求最后剩下一个人的下标 boolean people
  • 竞赛:STL之vector用法详解(关于vector这一篇就够了!)

    目录 前言 一 什么是vector 二 vector常见的函数 1 函数说明表 2 vector的存储和遍历 构造vector的四种方法 3 vector的插入 删除 insert的几种形式 erase的用法 4 begin函数和front
  • 【目标检测】Fast R-CNN详解

    前言 Fast R CNN是作者Ross Girshick继R CNN后的又一力作 同样使用VGG16作为网络的骨架 在训练速度比R CNN快了近9倍 测试速度快了213倍 在Pascal VOC数据集上accuracy从62 提升至66
  • Java8中Map的遍历方式总结

    public class LambdaMap private Map
  • 核方法计算

    什么是核方法 往简单里说 核方法是将一个低维的线性不可分的数据映射到一个高维的空间 并期望映射后的数据在高维空间里是线性可分的 我们以异或数据集为例 在二维空间中 异或数据集是线性不可分的 但是通过将其映射到三维空间 我们可以非常简单地让其