凌云时刻 · 技术

导读:核函数是机器学习算法中一个重要的概念。简单来讲,核函数就是样本数据点的转换函数。这一节我们来看看应用非常广泛的一个核函数,高斯核函数。

作者 | 计缘

来源 | 凌云时刻(微信号:linuxpk)

高斯核函数

高斯核函数的名称比较多,以下名称指的都是高斯核函数:

  • 高斯核函数。

  • RBF(Radial Basis Function Kernel)。

  • 径向基函数。

对于多项式核函数而言,它的核心思想是将样本数据进行升维,从而使得原本线性不可分的数据线性可分。那么高斯核函数的核心思想是将每一个样本点映射到一个无穷维的特征空间,从而使得原本线性不可分的数据线性可分。

我们先来回顾一下多项式特征,如下图所示,有一组一维数据,两个类别,明显是线性不可分的情况:

然后通过多项式将样本数据再增加一个维度,假设就是  ‍‍,样本数据就变成这样了:

此时原本线性不可分的样本数据,通过增加一个维度后就变成线性可分的状态。这就是多项式升维的意义。

下面我们先来认识一下高斯核函数的公式:

上面公式中的  ‍‍就是高斯核函数的超参数。然后我们再来看看高斯核函数使线性不可分的数据线性可分的原理。

为了方便可视化,我们将高斯核函数中的  ‍‍取两个定值‍‍  ‍‍核  ‍‍,这类点称为地标(Land Mark)。那么高斯核函数升维过程就是假如有两个地标点,那么就将样本数据转换为二维,也就是将原本的每个  ‍‍值通过高斯核函数和地标,将其转换为2个值,既:

下面我们用程序来实践一下这个过程:

import numpy as np
import matplotlib.pyplot as plt# 构建样本数据,x值从-4到5,每个数间隔为1
x = np.arange(-4, 5, 1)
x# 结果
array([-4, -3, -2, -1,  0,  1,  2,  3,  4])# y构建为0,1向量,且是线性不可分的
y = np.array((x >= -2) & (x <= 2), dtype='int')
y# 结果
array([0, 0, 1, 1, 1, 1, 1, 0, 0])# 绘制样本数据
plt.scatter(x[y==0], [0]*len(x[y==0]))
plt.scatter(x[y==1], [0]*len(x[y==1]))
plt.show()

可以看到我们构建的样本数据是明显线性不可分的状态。下面我们来定义高斯核函数:

def gaussian(x, l):# 这一节对gamma先不做探讨,先定为1gamma = 1.0# 这里x-l是一个数,不是向量,所以不需要取模return np.exp(-gamma * (x - l)**2)# 将每一个x值通过高斯核函数和l1,l2地标转换为2个值,构建成新的样本数据
l1, l2 = -1, 1
X_new = np.empty((len(x), 2))
for i, data in enumerate(x):X_new[i, 0] = gaussian(data, l1)X_new[i, 1] = gaussian(data, l2)# 绘制新的样本点
plt.scatter(X_new[y==0, 0], X_new[y==0, 1])
plt.scatter(X_new[y==1, 0], X_new[y==1, 1])
plt.show()

可以看到通过高斯函数将原本的一维样本数据转换为二维后,新样本数据明显成为线性可分的状态。

上面的示例中,我们将高斯核函数中的  ‍‍取定了两个值‍‍  ‍‍和‍‍  ‍‍。在实际运用中,是需要真实的将每个  ‍‍值带进去的,也就是每一个样本数据中的  ‍‍都是一个地标,那么可想而知,原始样本数据的行数就是新样本数据的维数,既原始  ‍‍的样本数据通过高斯核函数转换后成为  ‍‍的数据。当样本数据行数非常多的话,转换后的新样本数据维度自然会非常高,这也就是为什么在这节开头会说高斯核函数的核心思想是将每一个样本点映射到一个无穷维的特征空间的原因。

 高斯核函数中的Gamma

在看高斯核函数中的  ‍‍之前,我们先来探讨一个问题,我们以前有学过正态分布,它是一个非常常见的连续概率分布,最关键的是它又名高斯分布,我们再来看看高斯分布的函数:

仔细看这个函数就能发现,它和高斯核函数的公式在形‍‍态上是一致的:

  • 高斯函数  ‍‍前的系数‍‍是‍‍  ‍‍,‍‍  ‍‍指数的系数是‍‍  。

  • 高斯核函数  ‍‍前的系数是1,‍‍  ‍‍指数的系数是  ‍‍。

所以高斯核函数的曲线其实也是一个高斯分布图。

下面再来看看高斯分布图以及‍‍  ‍‍和  ‍‍对分布图的影响:

上图是维基百科对高斯分布解释中的分布图,从图中可以看到:

  • ‍‍‍‍高斯分布曲线的形状都是相似的钟形图。

  • 决定分布图中心的偏移情况。

  • ‍‍  ‍‍决定分布图峰值的高低,或者说钟形的胖瘦程度。

因为高斯函数中的  ‍‍和高斯核函数中‍‍  ‍‍成倒数关系。所以:

  • 高斯函数中‍‍  ‍‍越大、高斯分布峰值越小。‍‍  ‍‍越小、高斯分布峰值越大。

  • 高斯核函数中  ‍‍‍‍越大、高斯分布峰值越大,既钟形越窄。‍‍  ‍‍越小、高斯分布峰值越小,既钟形越宽。‍‍‍‍

 Scikit Learn中的RBF SVM

这一小节来看看如果使用Scikit Learn中封装的RBF SVM。首先还是先构建样本数据,我们使用和多项式SVM相同的数据:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasetsX, y = datasets.make_moons(noise=0.15, random_state=666)plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

然后通过RBF SVM训练数据并绘制决策边界:

from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipelinedef RBFKernelSVC(gamma = 1.0):return Pipeline([("std_scaler", StandardScaler()),("svc", SVC(kernel="rbf", gamma=gamma))])rbf_svc = RBFKernelSVC(gamma=1)
rbf_svc.fit(X, y)

使用RBF SVM和使用多项式SVM其实基本一样,只是将SVC中的kernel参数由之前的poly变更为rbf,然后传入该核函数需要的超参数既可。

接下来绘制决策边界:

def plot_decision_boundary(model, axis):# meshgrid函数用两个坐标轴上的点在平面上画格,返回坐标矩阵X0, X1 = np.meshgrid(# 随机两组数,起始值和密度由坐标轴的起始值决定np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),)# ravel()方法将高维数组降为一维数组,c_[]将两个数组以列的形式拼接起来,形成矩阵X_grid_matrix = np.c_[X0.ravel(), X1.ravel()]# 通过训练好的逻辑回归模型,预测平面上这些点的分类y_predict = model.predict(X_grid_matrix)y_predict_matrix = y_predict.reshape(X0.shape)# 设置色彩表from matplotlib.colors import ListedColormapmy_colormap = ListedColormap(['#0000CD', '#40E0D0', '#FFFF00'])# 绘制等高线,并且填充等高区域的颜色plt.contourf(X0, X1, y_predict_matrix, linewidth=5, cmap=my_colormap)plot_decision_boundary(rbf_svc, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

上图就是当‍‍  为‍‍1时,RBF SVM训练样本数据后的决策边界,我们先来解释一下它的高斯分布有什么关系。

如上图所示,蓝色虚线表示等高线,橘黄色点表示一个样本点,所以上面的图其实是俯视以橘黄色样本点为峰值点的高斯分布图。

对于每个样本点都有围绕它的一个高斯分布图,所以连起来就形成了一片区域,然后形成了决策区域和决策边界:

‍‍可以看到当  取1时,RBF SVM训练样本数据后的决策边界和多项式SVM的几乎一致。下面我们尝试变化超参数‍‍  来‍‍看看决策边界会有怎样的变化。

先来看看将  ‍‍取较大值后的决策边界:‍‍

# 将gamma取100
rbf_svc100 = RBFKernelSVC(gamma=100)
rbf_svc100.fit(X, y)plot_decision_boundary(rbf_svc100, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

从上图可以看到,决策边界几乎就是围绕着蓝色点的区域,这也印证了高斯核函数中‍‍  越大‍‍、高斯分布峰值越大,既钟形越窄的定义。因为钟形比较窄,所以不足以连成大片区域,就呈现出了上图中的情况。

我们再来看看将  ‍‍取较小值后的决策边界:

rbf_svc01 = RBFKernelSVC(gamma=0.1)
rbf_svc01.fit(X, y)plot_decision_boundary(rbf_svc01, axis=[-1.5, 2.5, -1.0, 1.5])
plt.scatter(X[y==0, 0], X[y==0, 1])
plt.scatter(X[y==1, 0], X[y==1, 1])
plt.show()

可以看到当  ‍‍取0.1后,决策边界几乎成了线性决策边界,说明每个样本点的高斯分布钟形太宽了。所以我们得出结论,‍‍当  取‍‍值比较大时,数据训练结果趋于过拟合,当γγ取值比较小时,数据训练结果趋于欠拟合。

 SVM解决回归问题

SVM解决回归问题的思路和解决分类问题的思路正好是相反的。我们回忆一下,在Hard Margin SVM中,我们希望在Margin区域中一个样本点都没有,即便在Soft Margin SVM中也是希望Margin区域中的样本点越少越好。

而在SVM解决回归问题时,是希望Margin区域中的点越多越好:

也就是找到一条拟合直线,使得这条直线的Margin区域中的样本点越多,说明拟合的越好,反之依然。Margin边界到拟合直线的距离称为  ‍‍是SVM解决回归问题的一个超参数。

在Scikit Learn中有LinearSVRSVR两个类,前者就是使用SVM线性方式解决回归问题的类,后者是SVM使用核函数方式解决回归问题的类。用法和LinearSVCSVC的一致,只不过需要传‍‍入  ‍‍这个超参数既可。

END

往期精彩文章回顾

机器学习笔记(二十七):核函数(Kernel Function)

机器学习笔记(二十六):支撑向量机(SVM)(2)

机器学习笔记(二十五):支撑向量机(SVM)

机器学习笔记(二十四):召回率、混淆矩阵

机器学习笔记(二十三):算法精准率、召回率

机器学习笔记(二十二):逻辑回归中使用模型正则化

机器学习笔记(二十一):决策边界

机器学习笔记(二十):逻辑回归(2)

机器学习笔记(十九):逻辑回归

机器学习笔记(十八):模型正则化

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

机器学习笔记(二十八):高斯核函数相关推荐

  1. 嵌入式系统设计师学习笔记二十八:嵌入式程序设计③——高级程序设计语言

    嵌入式系统设计师学习笔记二十八:嵌入式程序设计③--高级程序设计语言 解释程序和编译程序 编译器的工作阶段示意图 语法错误:非法字符,关键字或标识符拼写错误 语法错误:语法结构出错,if--endif ...

  2. 机器学习(二十八)——Monte-Carlo

    动态规划(续) Value Iteration vk+1(s)=maxa∈A(Ras+γ∑s′∈SPass′vk(s′))vk+1(s)=maxa∈A(Rsa+γ∑s′∈SPss′avk(s′)) v ...

  3. Mr.J-- jQuery学习笔记(二十八)--DOM操作方法(添加方法总结)

    Table of Contents appendTo appendTo(source, target) 源代码 append prependTo ​ ​ ​ ​ prependTo源码 prepend ...

  4. 吴恩达机器学习(二十四)核函数

      我们将改造支持向量机算法,来构造比较复杂的非线性分类器,主要的技巧是称之为核(kernel)的东西,接下来我们看看核函数是什么以及如何使用它.   1.如果有一个这样的训练集,然后希望拟合一个非线 ...

  5. C#(Csharp)笔记二十八——C# 文件的输入与输出

    一丶C# 文件的输入与输出 一个 文件 是一个存储在磁盘中带有指定名称和目录路径的数据集合.当打开文件进行读写时,它变成一个 流. 从根本上说,流是通过通信路径传递的字节序列.有两个主要的流:输入流 ...

  6. 机器学习笔记二十四 中文分词资料整理

    一.常见的中文分词方案 1. 基于字符串匹配(词典) 基于规则的常见的就是最大正/反向匹配,以及双向匹配. 规则里糅合一定的统计规则,会采用动态规划计算最大的概率路径的分词. 以上说起来很简单,其中还 ...

  7. Django笔记二十八之数据库查询优化汇总

    这一篇笔记将从以下几个方面来介绍 Django 在查询过程中的一些优化操作,有一些是介绍如何获取 Django 查询转化的 sql 语句,有一些是理解 QuerySet 是如何获取数据的. 以下是本篇 ...

  8. 吴恩达机器学习(二十八)推荐系统

    文章目录 前言 1.基于内容的推荐算法 2.协同过滤 2.协同过滤算法 3.矢量化:低秩矩阵分解 4.实施细节:均值规范化 前言   机器学习领域的一个伟大思想:对于某些问题,有一些算法可以自动地学习 ...

  9. 立创eda学习笔记二十八:在嘉立创购买pcb板并贴片(smt)

    完整的写一下,分为两部分: 1.下pcb订单 这个可以看之前写的一个博客: 立创eda学习笔记三:pcb购买_Gutie_bartholomew的博客-CSDN博客 补充一下,买pcb可以直接有几个途 ...

  10. 机器学习知识点(二十八)Beta分布和Dirichlet分布理解

    1.二者关系: Dirichlet分布是Beta分布的多元推广.Beta分布是二项式分布的共轭分布,Dirichlet分布是多项式分布的共轭分布. 通常情况下,我们说的分布都是关于某个参数的函数,把对 ...

最新文章

  1. .prop()与.attr()
  2. 2021-06-11 pytorch基本语法
  3. 2020年联通软件研究院校招笔试第三题
  4. java代码解锁华为_如何编写可怕的Java代码?
  5. 在jsx中绑定js表达式以及jsx注释
  6. 剑指offer 重建二叉树
  7. 写个函数用来对二维数组排序
  8. leetcode266. 回文排列
  9. Encapsulate Downcast(封装向下转型)
  10. NG2入门 - 架构
  11. 深层神经网络——激活函数去线性化
  12. mysql闩_MySQL锁概述
  13. 有哪些实用的电脑软件值得推荐?2021电脑装机必备便签软件
  14. Retinanet论文解读
  15. 应届大学生入职的时候首要问公司的主要两个问题是?
  16. 8个LED灯分别以不同频率闪烁
  17. 理解 假阳性(false positive)和假阴性(false negative)概念
  18. 商务与经济统计阅读笔记3
  19. linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路
  20. 关于Spring Security框架 关于单点登录sso

热门文章

  1. 哪些操作符具有副作用?它们具有什么副作用?
  2. spring boot火车票订票系统 毕业设计-附源码171538
  3. html获取请求header,获取HTTP header信息
  4. linux剪贴板管理工具收集
  5. 大一 Java 课程设计实践 - 迷你版画图板(附源代码和设计文档)
  6. PHP+MYSQL新闻系统开发之PHP100视频教程62 修正版
  7. ubuntu安装Theano+cuda
  8. Linux 入门到放弃
  9. 个人目标日历定制制作小工具微信小程序(含源码)
  10. CSS 渐变-阴影-滤镜【值得收藏】