kernlab中的rbfKernel方程与标准不同?
Posted
技术标签:
【中文标题】kernlab中的rbfKernel方程与标准不同?【英文标题】:Equation of rbfKernel in kernlab is different from the standard? 【发布时间】:2014-08-28 18:11:15 【问题描述】:我观察到 kernlab 使用 rbfkernel 作为,
rbf(x,y) = exp(-sigma * euclideanNorm(x-y)^2)
但是根据这个wiki link,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】:我也遇到了这种差异,我最终深入研究了源代码,以确定文档中是否存在拼写错误,或者究竟发生了什么,因为高斯上下文中的 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 or sigma ??
的评论中观察到,他们可能对采用的约定有点困惑,/2
的存在将与标准偏差形式/(2*sigma)
一致,但我不得不推测关于这个发现。
现在另一个确凿的证据在? rbfdot
的帮助页面中,内容为...
sigma 高斯拉普拉斯算子使用的逆核宽度, Bessel 和 ANOVA 核
这与他们在分子中使用 sigma 的形式是一致的,因为在分母中它会与高斯右的宽度成比例地缩放。所以看起来他们确实确定了***文章中描述为伽马形式的约定,他们说
一个等价但更简单的定义涉及一个参数 gamma = -1/(2*sigma^2)
所以差异似乎只是采用不同但等效的约定。特定约定的一个动机(有人可能会在评论中确认)可能来自代码重用和一致性问题,如您所见,该参数被其他三种内核形式使用,它们的参数可能更传统地设置在分子中。不过,我不确定这一点,因为我从未使用过这些备用内核并且对每个都不熟悉。
【讨论】:
以上是关于kernlab中的rbfKernel方程与标准不同?的主要内容,如果未能解决你的问题,请参考以下文章
在内核k-means(R中的kernlab包)中将新数据点分配给集群?
R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法
R语言使用kernlab包中的ksvm函数构建支持向量机SVM模型(Support vector machines)使用RBF核函数使用table函数计算混淆矩阵评估分类模型性能