zoukankan      html  css  js  c++  java
  • 机器学习-SVM-核函数

    SVM-核函数

    在研究了一天的SVM核函数后,我顿悟了一个道理:

    研究和使用核函数的人,从一开始的目的就是把data分开而已。高维和映射,都是原来解释操作合理性的,但根本不是进行这一操作的原因

    我为什么会这么想?我们举一个例子,就说径向基函数核(RBF)吧,按理来说,它的映射应该是和高斯分布或者径向基函数有点关系吧,事实也的确是这样,知乎上有位大神真的推导出来了这个无线维的函数(https://www.zhihu.com/question/24627666,优达学城),我把结果贴一下:

    [公式]

    其中,[公式]

    你们看这个函数的样子,再看看径向基函数核函数的样子:

    [公式]

    你和我说发明这个方法的人是先想到了要得到上面的这个函数,然后才写出了这个核函数,我是不太信的。

    所以我觉得,真相就是,他们在发明的时候没有想过“径向基函数会把样本映射到怎样的一个特征空间中,我们的样本因为有怎样的特征所以使用这种方法就是线性可分了”,他们想的可能是,(这里引用知乎”谢锴“的话,我觉得很精辟):

    整个story可以这么说:那些搞svm,ridge regression的人,发现自己的算法对数据集的效果不好,他们认为这可能是因为数据集线性不可分。另外他们发现他们搞出的式子里,出现的都是两个数据点的内积。他们想,我们要是把原始数据集映射到高维可能就线性可分啦,但是这可是内积啊,而且怎么找映射函数呢?这时候Mercer Theorem出现了,简直就是黑暗中的一缕阳光啊!好的,那就构造一个kernel function吧,根据Mercer Theorem,那些原始维度的内积转换到高维内积只需要把数据点带进核函数就ok啦。这不就简单了?结果在数据集上居然很好!!!然后这种方法就有很多时髦名称了。大家都follow么。

    可以看到,可能他们一开始唯一想到的,就是”怎么找一个对高维空间的映射,爱咋分布咋分布,maybe works”,我甚至有点怀疑之所以普遍使用径向基函数的原因就是因为它是无限维、维度够高。

    还有两个人说的也比较直白:

    1571324614504

    我们如果想进行原本就线性不可分的数据集进行分割,那么选项一是容忍错误分类,即引入Soft Margin;选项二是我们可以对Input Space做Feature Expansion,把数据集映射到高维中去,形成了Feature Space。我们几乎可以认为(引用Caltech的课堂用语“We are safe but not certain”)原本在低维中线性不可分的数据集在足够高的维度中存在线性可分的超平面。
    作者:知乎用户链接:https://www.zhihu.com/question/24627666/answer/28460490来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    数据集的分布应该是没法提前选择的对吧,都是给定了数据集再去发掘其中价值。我见过的一种说法是,根本不care你数据集最后能否分开,我只要暴力应用SVM,最后投射回到低维空间,看看label到底分得对不对就知道它原本可不可分了。

    所以最终的结论是,映射的结果并不是最主要的,唯一用来检验这个核函数好不好的就是它能不能将样本线性分开,这往往和它的维度有关,和具体的分布规律还真没什么关系。

    那决策边界是怎么画出来的?理论上,应该是先在高维空间求得决策平面、再映射回来。但是有问题是:

    1. 映射不一定是可逆的,数据能映射过去,不一定能映射回来
    2. 即使可逆,像上面说的RBF的映射函数,这个怎么求逆,那可是无限维的。

    所以真相往往赤裸裸,我们看到的图像上的决策边界,其实是:

    来源,知乎王赟

    从概念上说,低维空间中的这个非线性判决边界,就是高维空间中的线性判决边界映射回来的结果。

    但从实际操作上来说,如果你想画出低维空间中的这个非线性判决边界,其实很简单,用不着去想高维空间:只要用一定密度的格点在低维空间中采样,把每一个样本进行分类,一类染成红色,一类染成蓝色,判决边界就自然显现出来了。

    没错,就是一个点一个点画出了的。

    还有一个问题,李航的书中提到,一个核函数对应的其实是不止一个映射和特征空间。

    1571324615504

    那为什么他们的分类表现是一样的呢?要解释这个问题,就要用我们上面刚刚说了是马后炮的映射来举例子了,想象在一个特征空间上有一个决策平面和一些样本,我们将他们映射到另外一个维度的特征空间上,他们的相对位置总不能变吧,所以对数据的判定也会维持原样。

    懂了,不纠结了,老老实实用就行了。每次各种核函数试一遍,选表现最好的。

  • 相关阅读:
    c++ isdigit函数
    c++ swap函数
    1.2Hello, World!的大小
    1.2整型与布尔型的转换
    1.2打印ASCII码
    leetcode[170]Two Sum III
    leetcode[167]Two Sum II
    leetcode[1]Two Sum
    leetcode[2]Add Two Numbers
    leetcode[3]Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/jiading/p/11695870.html
Copyright © 2011-2022 走看看