kernlab中的rbfKernel公式与标准公式不同?

4

我注意到kernlab使用rbfkernel作为,

rbf(x,y) = exp(-sigma * euclideanNorm(x-y)^2)

但是根据这个维基链接,rbf内核应该是这种形式。
rbf(x,y) = exp(-euclideanNorm(x-y)^2/(2*sigma^2))

当sigma值较大时,两个相似度高的样本会更加接近,这种情况更加直观。

我不确定e1071 svm使用的是什么(原生代码libsvm?)

希望有人能给我解释其中差异的原因。我最初使用的是e1071,但后来切换到ksvm,发现两者结果不一致。以下是一个小例子供比较:

set.seed(123)
x <- rnorm(3)
y <- rnorm(3)
sigma <- 100

rbf <- rbfdot(sigma=sigma)
rbf(x, y)
exp( -sum((x-y)^2)/(2*sigma^2) )

我希望核值接近1(因为x,y来自sigma = 1,而核sigma = 100)。这只在第二种情况下观察到。

1个回答

2
我也遇到了这个差异,最后我深入源代码中查找,以弄清楚文档中是否存在错别字或者其他问题。因为在高斯函数的上下文中,sigma通常作为标准差出现在分母中,对吧?以下是相关源代码。
**kernlab\R\kernels.R**
## Define the kernel objects,
## functions with an additional slot for the kernel parameter list.
## kernel functions take two vector arguments and return a scalar (dot product)


rbfdot<- function(sigma=1)
  {

    rval <- function(x,y=NULL)
    {
      if(!is(x,"vector")) stop("x must be a vector")
      if(!is(y,"vector")&&!is.null(y)) stop("y must a vector")
      if (is(x,"vector") && is.null(y)){
        return(1)
      }
      if (is(x,"vector") && is(y,"vector")){
        if (!length(x)==length(y))
          stop("number of dimension must be the same on both data points")
        return(exp(sigma*(2*crossprod(x,y) - crossprod(x) - crossprod(y))))  
        # sigma/2 or sigma ??
      }
    }
     return(new("rbfkernel",.Data=rval,kpar=list(sigma=sigma)))
  }

你可以从他们对sigma/2或sigma ??的评论中观察到,他们可能对采用的惯例有些困惑,/2的存在与标准偏差形式/(2*sigma)一致,但我不得不猜测这个发现。现在另一个证据支持在? rbfdot的帮助页面中阅读到的内容...

sigma 逆高斯核宽度,用于拉普拉斯、贝塞尔和ANOVA核函数

这与他们在分子中使用sigma的形式是一致的,因为在分母中它会与高斯函数的宽度成比例缩放。因此,它确实看起来像他们采用了维基百科文章中描述的伽马形式的惯例,其中他们说:

一个等价但更简单的定义涉及参数gamma = -1 /(2 * sigma ^ 2)

因此,差异似乎只是采用不同但等效的惯例的问题。采用特定惯例的一个动机(某人可以在评论中确认)可能源于代码重用和一致性的问题,因为你可以看到该参数被三种其他核形式使用,这些核可能会在分子中更传统地设置其参数。但是,我不确定这一点,因为我从未使用过这些备选核并且对每个核都不熟悉。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接