机器学习:SVM(核函数、高斯核函数RBF)
一、核函数(Kernel Function)
1)格式
- K(x, y):表示样本 x 和 y,添加多项式特征得到新的样本 x'、y',K(x, y) 就是返回新的样本经过计算得到的值;
- 在 SVM 类型的算法 SVC() 中,K(x, y) 返回点乘:x' . y' 得到的值;
2)多项式核函数
- 业务问题:怎么分类非线性可分的样本的分类?
内部实现:
- 对传入的样本数据点添加多项式项;
- 新的样本数据点进行点乘,返回点乘结果;
- 多项式特征的基本原理:依靠升维使得原本线性不可分的数据线性可分;
- 升维的意义:使得原本线性不可分的数据线性可分;
例:
- 一维特征的样本,两种类型,分布如图,线性不可分:
- 为样本添加一个特征:x2 ,使得样本在二维平面内分布,此时样本在 x 轴升的分布位置不变;如图,可以线性可分:
3)优点 / 特点
- 不需要每次都具体计算出原始样本点映射的新的无穷维度的样本点,直接使用映射后的新的样本点的点乘计算公式即可;
- 减少计算量
- 减少存储空间
- 一般将原始样本变形,通常是将低维的样本数据变为高维数据,存储高维数据花费较多的存储空间;使用核函数,不用考虑原来样本改变后的样子,也不用存储变化后的结果,只需要直接使用变化的结果进行运算并返回运算结果即可;
- 核函数的方法和思路不是 SVM 算法特有,只要可以减少计算量和存储空间,都可以设计核函数方便运算;
- 对于比较传统的常用的机器学习算法,核函数这种技巧更多的在 SVM 算法中使用;
4)SVM 中的核函数
- svm 类中的 SVC() 算法中包含两种核函数:
- SVC(kernel = 'ploy'):表示算法使用多项式核函数;
- SVC(kernel = 'rbf'):表示算法使用高斯核函数;
- SVM 算法的本质就是求解目标函数的最优化问题;
- 求解最优化问题时,将数学模型变形:
5)多项式核函数
- 格式:
from sklearn.svm import SVC svc = SVC(kernel = 'ploy')
- 思路:设计一个函数( K(xi, xj) ),传入原始样本(x(i) 、 x(j)),返回添加了多项式特征后的新样本的计算结果(x'(i) . x'(j));
- 内部过程:先对 xi 、xj 添加多项式,得到:x'(i) 、 x'(j) ,再进行运算:x'(i) . x'(j) ;
- x(i) 添加多项式特征后:x'(i) ;
- x(j) 添加多项式特征后:x'(j) ;
- x(i) . x(j) 转化为:x'(i) . x'(j) ;
- 其实不使用核函数也能达到同样的目的,这里核函数相当于一个技巧,更方便运算;
二、高斯核函数(RBF)
- 业务问题:怎么分类非线性可分的样本的分类?
1)思想
- 业务的目的是样本分类,采用的方法:按一定规律统一改变样本的特征数据得到新的样本,新的样本按新的特征数据能更好的分类,由于新的样本的特征数据与原始样本的特征数据呈一定规律的对应关系,因此根据新的样本的分布及分类情况,得出原始样本的分类情况。
- 应该是试验反馈,将样本的特征数据按一定规律统一改变后,同类样本更好的凝聚在了一起;
- 高斯核和多项式核干的事情截然不同的,如果对于样本数量少,特征多的数据集,高斯核相当于对样本降维;
- 高斯核的任务:找到更有利分类任务的新的空间。
- 方法:类似 的映射。
- 高斯核本质是在衡量样本和样本之间的“相似度”,在一个刻画“相似度”的空间中,让同类样本更好的聚在一起,进而线性可分。
- 疑问:
- “衡量”的手段 ,经过这种映射之后,为什么同类样本能更好的分布在一起?
2)定义方式
- ;
- x、y:样本或向量;
- γ:超参数;高斯核函数唯一的超参数;
- || x - y ||:表示向量的范数,可以理解为向量的模;
- 表示两个向量之间的关系,结果为一个具体值;
- 高斯核函数的定义公式就是进行点乘的计算公式;
3)功能
- 先将原始的数据点(x, y)映射为新的样本(x',y');
- 再将新的特征向量点乘(x' . y'),返回其点乘结果;
- 计算点积的原因:此处只针对 SVM 中的应用,在其它算法中的应用不一定需要计算点积;
4)特点
- 高斯核运行开销耗时较大,训练时间较长;
- 一般使用场景:数据集 (m, n),m < n;
- 一般应用领域:自然语言处理;
- 自然语言处理:通常会构建非常高维的特征空间,但有时候样本数量并不多;
5)高斯函数
- 正态分布就是一个高斯函数;
- 高斯函数和高斯核函数,形式类似;
6)其它
- 高斯核函数,也称为 RBF 核(Radial Basis Function Kernel),也称为径向基函数;
- 高斯核函数的本质:将每一个样本点映射到一个无穷维的特征空间;
- 无穷维:将 m*n 的数据集,映射为 m*m 的数据集,m 表示样本个数,n 表示原始样本特征种类,样本个数是无穷的,因此,得到的新的数据集的样本也是无穷维的;
- 高斯核升维的本质,使得线性不可分的数据线性可分;
三、RBF 转化特征数据原理
1)转化原理
- x:需要改变维度的样本;
- np.array([l1, l2, ..., lm]) == X == np.array([x1, x2, ... , xm]):Landmark,地标,一般直接选取数据集 X 的所有样本作为地标;(共 m 个)
- 对于 (m, n) 的数据集:转化为 (m, m) 的数据集;将 n 维的样本转化为 m 维的样本;
- 对于原始数据集中的每一个样本 x,也可以有几个地标点,就将 x 转化为几维;
2)主要为两部分
- 先将原始的数据点映射为一种新的特征向量,再将新的特征向量点乘,返回其点乘结果;
- 维度转化:样本 x1 转化 x1' :(e-γ||x1 - x1||**2, e-γ||x1 - x2||**2, e-γ||x1 - x3||**2, ..., e-γ||x1 - xm||**2),同理样本 x2 的转化 x2' ;(地标点就是数据集 X 的样本点)
- 点乘计算:x1' . x2' == K(x1, x2) == e-γ||x1 - x2||**2,最终结果为一个具体值;
3)实例模拟维度转化过程
- 一维升到二维
- 原始样本分布:
- 第一步:选取地标点:L1、L2 ;
- 第二步:升维计算
四、程序模拟
- 目的:将线性不可分的数据变为线性可分;
- 方法:一维数据升到二维;
1)模拟数据集
- x 数据集:每一个样本只有一个特征,且分布规律线性不可分;
- np.arange(m, n, l):将区间 [m, n) 按间距为 l 等分,等分后的数据点包含 m 值,不包含 n;
- [0]*len(x[y==0]):[0] 是一个 list,list * C 表示将列表复制 C 份;
- 如:[0]*5 == [0, 0, 0, 0, 0]
import numpy as np
import matplotlib.pyplot as plt x = np.arange(-4, 5, 1)
y = np.array((x >= -2) & (x <= 2), dtype='int') plt.scatter(x[y==0], [0]*len(x[y==0]))
plt.scatter(x[y==1], [0]*len(x[y==1]))
plt.show()
2)经过高斯核,得到新的数据集
- np.exp(m):表示 e 的 m 次幂;
- np.empty(元组):(元组)=(m, n),生成一个 m 行 n 列的空的矩阵;
- enumerate(iterator):返回可迭代对象的 index 和 value;
- for i, data in enumerate(x):i 存放向量 x 的 index,data 存放向量 x 的 index 对应的元素值;
def gaussian(x, l):
# 此处直接将超参数 γ 设定为 1.0;
# 此处 x 表示一维的样本,也就是一个具体的值,l 相应的也是一个具体的数,因为 l 和 x 一样,从特征空间中选定;
gamma = 1.0
# 此处因为 x 和 l 都只是一个数,不需要再计算模,可以直接平方;
return np.exp(-gamma * (x-l)**2) # 设定地标 l1、l2 为 -1和1
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()
机器学习:SVM(核函数、高斯核函数RBF)的更多相关文章
- 小刘的机器学习---SVM
前言: 这是一篇记录小刘学习机器学习过程的随笔. 正文: 支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法. 在分类问题中,SVM就是要找到一个同时离各个类别尽可能远的决策边界即最 ...
- 机器学习-RBF高斯核函数处理
机器学习-RBF高斯核函数处理 SVM高斯核函数-RBF优化 重要了解数学的部分: 协方差矩阵,高斯核函数公式. 个人建议具体的求法还是看下面的核心代码吧,更好理解,反正就我个人而言,烦躁的公式,还 ...
- SVM: 用kernels(核函数)来定义新的features,避免使用多项式,高斯kernel
应用kernels来进行非线性分类 非线性分类:是否存在好的features的选择(而不是多项式)--f1,f2,f3.... 上图是一个非线性分类的问题,前面讲过,我们可以应用多项式(feature ...
- SVM: 使用kernels(核函数)的整个SVM算法过程
将所有的样本都选做landmarks 一种方法是将所有的training data都做为landmarks,这样就会有m个landmarks(m个trainnign data),这样features就 ...
- SVM为什么需要核函数
生存?还是毁灭?——哈姆雷特 可分?还是不可分?——支持向量机 之前一直在讨论的线性分类器,器如其名(汗,这是什么说法啊),只能对线性可分的样本做处理.如果提供的样本线性不可分,结果很简单,线性分类器 ...
- 机器学习——SVM
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 带核的SVM为什么能分 ...
- 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)
前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...
- 机器学习——SVM讲解
支持向量机(Support Vector Machine) SVM是一类按监督学习方式对数据进行二元分类的广义线性分类器,决策边界是对学习样本求解的最大边距超平面.只需要知道,SVM是一个有监督的分类 ...
- 遵循统一的机器学习框架理解高斯混合模型(GMM)
遵循统一的机器学习框架理解高斯混合模型(GMM) 一.前言 我的博客仅记录我的观点和思考过程.欢迎大家指出我思考的盲点,更希望大家能有自己的理解. 本文参考了网络上诸多资料,特别是B站UPshuhua ...
随机推荐
- 关于view里面xib的问题
[[[NSBundle mainBundle] loadNibNamed:@"NetFailView" owner:self options:nil] lastObject]; 会 ...
- Avoid RegionServer Hotspotting Despite Sequential Keys
n HBase world, RegionServer hotspotting is a common problem. We can describe this problem with a si ...
- Java C++ 比较 – 虚函数、抽象函数、抽象类、接口
[转自]原文 Java – 虚函数.抽象函数.抽象类.接口 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加上virtual关键字就成为虚函数 Java中其实没有虚函数的概念,它 ...
- ANT+JMETER集成1(生成报告)
配置build.xml文件时,网上找了各种版本的代码都会报错, 终于找到个可以生成报告的build源码了 链接: http://www.cnblogs.com/hanxiaomin/p/6731810 ...
- select2 使用
<link href="/plugin/select2/css/select2.min.css" rel="stylesheet" /> <s ...
- Hadoop- Namenode经常挂掉 IPC's epoch 9 is less than the last promised epoch 10
如题出现Namenode经常挂掉 IPC's epoch 9 is less than the last promised epoch 10, 2019-01-03 05:36:14,774 INFO ...
- 使用<s:property value="4"/>是报错
报错的情况是 在jsp中引入标签 <%@ taglib uri="/struts-tags" prefix="s" %> 项目中也有ognl.jar ...
- review03
class XiyoujiRenwu{ float height; float weight; String head; String ear; void speak(String s) { Syst ...
- zeptojs的一些别人的博客
http://www.css88.com/doc/zeptojs/ http://blog.163.com/litianyichuanqi@126/blog/static/11597944120142 ...
- python字典中dict.get()和dict.setdefault()的异同点
相同点: 两者是参数相同:dict.get(key, default=None), dict.setdefault(key, default=None) 如果指定的键不存在时,两者都返回默认值,默认是 ...