zoukankan      html  css  js  c++  java
  • SVM – 核函数

      核函数的起源是对于线性不可分的分类情况,其实可以通过p次方多项式,及非线性模型进行分类;然后对于这类非线性多次方的,其实可以按照广义线性模型来进行升维变形,使之成为线性模型,这样就可以放到SVM中来进行处理了(svm只能处理非线性模型)。

      但是升维之后是有维度爆炸现象的(二次方对应6维度,三次方对应19维度),为了解决这个问题,核函数出场了,简单讲核函数就是计算计算是在低维进行,但是形式却是映射到高维。

      SVM的优化目标:

      假设xi和xj都是低维非线性的函数,我们定义映射到高维的函数为φ(x),那么上面的式子可以写成:

      核函数,就是实现了计算在低维计算,返回形式是高维:

    K(x, z) = φ(x) * φ(z)

      但是这种映射并不是容易获取的,需要满足Gram矩阵K = [K(x,z)]是半正定型,也就是说,一个函数想要成为核函数,必须要满足里面任何点的集合形成的Gram矩阵是半正定矩阵。

      这里解释一下,gram矩阵是指n维欧式空间中任意k个向量内积组成的矩阵:

      关于正定矩阵:M是n阶方阵,对于非0向量,z.T *M*z > 0,矩阵的乘法还是矩阵,这里> 0,我理解是因为乘法形式的行列式的值是大于0的。

      半正定矩阵和正定矩阵就是一字之差:z.T * M * z >= 0,半正定允许等于0,所以范围更加宽广,所以血统不那么纯正,所以称之为半正定(越纯正要求越严格)。

      话题再扯回来,如果想要满足核函数,那么函数K的矩阵要满足Gram矩阵是半正定的;这个门槛其实很高的,好在我们数学大佬们已经带我们走出探索的沼泽,并且亲自指出了常用的核函数与:

      线性核函数(Linear Kernel)

      K(x, z) = x·z,线性svm就是使用这个核函数;

      多项式核函数(Polynomial Kernel)

      k(x, z) = (γx·z + r)^d,其中gamma,r以及d需要自己调参;

      高斯核函数(Gaussian Kernel),也称之为径向基和函数(Radial Basis Function,RBF):

      K(x, z)=xp(γ||xz||²)

      Sigmoid核函数:

      K(x,z)=tanh(γxz+r),其中γ和r需要自己调参;

    参考:

    https://www.cnblogs.com/pinard/p/6103615.html 

  • 相关阅读:
    Python全栈day19(函数补充)
    Python全栈day18(三元运算,列表解析,生成器表达式)
    Python全栈day18(迭代器协议和for循环工作机制)
    KVM虚拟化
    Python使用函数实现把字符串转换成整数
    MySQL备份1356错误提示修复办法
    Python全栈day17(文件处理)
    CentOS添加PHP至环境变量
    CentOS7.2编译配置LNMP环境(MySQL5.7.20,PHP7.0.24)
    php查询mysql数据库 查询条件替中文字符串变量时无法查询
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/12053151.html
Copyright © 2011-2022 走看看