zoukankan      html  css  js  c++  java
  • svm之核函数(斯坦福machine learning week 7)

    1. 核函数 I

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    这里写图片描述

    首先让我们来看看第一个标记:

    f1=similarity(x,l(1))=exp(||xl(1)||22σ2)=exp(nj=1(xjl(1)j)22σ2)

    假设,如果xapprox l^{(1)},即x与其中一个标记点非常接近,那么这个欧氏距离||x-l^{(1)}||就会接近0,因此:

    f1exp(022σ2)1

    相反的,如果x离l^{(1)}很远,那么会有:

    f1exp((large number)22σ2)0

    这些特征变量的作用是度量x到标记l(1)的相似度的,并且如果x离l非常接近,那么特征变量f就接近1;如果x离标记l(1)非常远,那么特征变量f就接近于0。

    1.1 深入理解核函数

    1.1.1 x对f的值的影响

    图片描述

    1.1.2 σ2对f的值的影响

    σ2=1 σ^2=0.5 σ^2=3
    图片描述 图片描述 图片描述

    1.2 获取预测函数

    假设我们已经找到了一个学习算法,并且假设我已经得到了这些参数的值,比如如果:

    θ0=0.5θ1=1θ2=1θ3=0

    这里写图片描述

    那么:

    θ0+θ1f1+θ2f2+θ3f3=θ0+θ11+θ20+θ30=0.5+1=0.50

    这里写图片描述

    如果将这个训练样本x带入之前相同的计算,你发现f1f2f3都接近于0。

    因此,我们得到θ0+θ1f1+θ2f2+θ3f3=0.5,因为θ0=0.5,并且f1f2f3都为0,因此最后结果是-0.5,小于0。因此这个点,我们预测的y值是0。

    你最后得到的结果是:对于接近l(1)l(2)的点,我们的预测值是1,对于远离l^{(1)}和l(2)的点,我们最后预测的结果是等于0的。

    因此这就是一个我们如何通过标记点,以及核函数,来训练出非常复杂的非线性判别边界的方法。

    这就是核函数这部分的概念,以及我们如何在支持向量机中使用它们。我们通过标记点和相似性函数来定义新的特征变量从而训练复杂的非线性分类器。

    目前还有一些问题我们并没有做出回答,其中一个是我们如何得到这些标记点;另一个是其他的相似度方程(核函数)是什么样的,如果有其他的话,我们能够用其他的相似度方程来代替我们所讲的这个高斯核函数吗?在下一个视频中我们会回答这些问题,然后把所有东西都整合到一起来看看支持向量机如何通过核函数的定义 有效地学习复杂非线性函数。

    2. 核函数 II

    2.1 如何选取标记点(landmark)

    给定m个训练样本:

    (x(1),y(1)),(x(2),y(2)),,(x(m),y(m)),

    我将选取与m个训练样本精确一致的位置作为我的标记点:

    l(1)=x(1),l(2)=x(2),,l(m)=x(m).

    当输入样本x(样本x可以属于训练集,也可以属于交叉验证集,也可以属于测试集),我们可以计算这些特征,即:

    f1=similarity(x,l(1))f2=similarity(x,l(2))

    这里的
    l(1)=x(1)l(2)=x(2)

    最终我们能得到一个特征向量,我们将特征向量记为f:

    f=f1f2fm

    此外,按照惯例,如果我们需要的话,可以添加额外的特征f_0,f_0的值始终为1:

    f=f0f1f2fm

    它与我们之前讨论过的截距x^0的作用相似。


    举个例子,假设我们有训练样本

    (x(i),y(i))
    ,这个样本对应的特征向量可以这样计算:

    给定x^{(i)},我们可以通过相似度函数

    f(i)1=similarity(x(i),l(1))f(i)2=similarity(x(i),l(2))f(i)m=similarity(x(i),l(m))

    在这一列中的某个位置,即第i个元素,有一个特征:

    f(i)i=similarity(x(i),l(i))

    这里的l(i)就等于x(i)

    所以f(i)i衡量的是x(i)与其自身的相似度,如果你使用高斯核函数的话,这一项为:

    f(i)i=similarity(x(i),l(i))=exp(02σ2)=1

    所以,对于这个样本来说,其中的某一个特征等于1。接下来,类似于我们之前的过程,我将这m个特征合并为一个特征向量。于是,相比之前用x(i)来描述样本,x(i)为n维或者n+1维空间。我们现在可以使用这个特征向量f(i)来描述我的特征向量:

    f(i)=f(i)0f(i)1f(i)2f(i)m
    f(i)0=1

    那么这个向量就是我们用于描述训练样本的特征向量。


    如果你已经得到参数θθ并且想对样本x做出预测,我们先要计算特征向量f,f是m+1m+1维的特征向量(这里有m是因为我们有m个训练样本,因此就有m个标记点)。

    怎样得到参数θ呢?
    我们有n=m个特征。有效的特征数量应该等于f的维数,所以nn其实就等于m。
    这里写图片描述

    最后一项与上面式子中的最后一项12nj=1θ2j有细微差别。你并不需要知道这个细节,事实上这个式子已经给你提供了全部需要的原理。
    这一项nj=1θ2j可以被重写为θTθ(θ0),即:

    j=1nθ2j=θTθ

    其中:

    θ=θ1θ2θm  (ignore θ0)

    大多数支持向量机在实现的时候其实是替换掉θTθ的,用θTMθ来代替,其中M是某矩阵,具体是什么矩阵取决于你采用的核函数。这其实是另一种略有区别的距离度量方法。我们用这种略有变化的度量距离的形式来取代对||θ||2θTθnj=1θ2j进行最小化的形式,这是参数向量θ的变尺度形式,这种变化和核函数相关。这个数学细节使得支持向量机能够更有效率的运行。
    你可以直接认为这个具体的实现细节尽管略微的改变了优化目标,但是它主要是为了计算效率,所以你不必要对此有太多担心。
    这里写图片描述

  • 相关阅读:
    590. N-ary Tree Postorder Traversal
    C++——指针3
    C++——指针2-指向数组的指针和指针数组
    C++——指针1
    C++——二维数组和对象数组
    C++——一维数组
    C++——程序的结构
    C++——类与对象
    C++——函数
    C++——简单程序设计
  • 原文地址:https://www.cnblogs.com/zswbky/p/8454063.html
Copyright © 2011-2022 走看看