具有 RBF 的 SVM:决策值往往等于远处测试样本的偏差项的负数

SVM with RBF: Decision values tend to be equal to the negative of the bias term for faraway test samples

在SVM中使用RBF核,为什么远离训练样本的测试样本的决策值往往等于偏差项的负数b?

一个后果是,一旦生成SVM模型,如果我将偏差项设置为0,远离训练样本的测试样本的决策值趋于0。为什么会这样?

使用LibSVM,偏置项 b rho。 决策值是到超平面的距离

我需要了解是什么定义了这种行为。有人明白吗?

运行 下面的 R 脚本,你可以看到这个行为:

library(e1071)
library(mlbench)
data(Glass)
set.seed(2)

writeLines('separating training and testing samples')
testindex <- sort(sample(1:nrow(Glass), trunc(nrow(Glass)/3)))
training.samples <- Glass[-testindex, ]
testing.samples <- Glass[testindex, ]
writeLines('normalizing samples according to training samples between 0 and 1')
fnorm <- function(ran, data) {
    (data - ran[1]) / (ran[2] - ran[1])
}
minmax <- data.frame(sapply(training.samples[, -10], range))
training.samples[, -10] <- mapply(fnorm, minmax, training.samples[, -10])
testing.samples[, -10] <- mapply(fnorm, minmax, testing.samples[, -10])
writeLines('making the dataset binary')
training.samples$Type <- factor((training.samples$Type == 1) * 1)
testing.samples$Type <- factor((testing.samples$Type == 1) * 1)
writeLines('training the SVM')
svm.model <- svm(Type ~ ., data=training.samples, cost=1, gamma=2**-5)
writeLines('predicting the SVM with outlier samples')
points = c(0, 0.8, 1,                         # non-outliers
  1.5, -0.5, 2, -1, 2.5, -1.5, 3, -2, 10, -9) # outliers
outlier.samples <- t(sapply(points, function(p) rep(p, 9)))
svm.pred <- predict(svm.model, testing.samples[, -10], decision.values=TRUE)
svm.pred.outliers <- predict(svm.model, outlier.samples, decision.values=TRUE)

writeLines('')                          # printing
svm.pred.dv <- c(attr(svm.pred, 'decision.values'))
svm.pred.outliers.dv <- c(attr(svm.pred.outliers, 'decision.values'))
names(svm.pred.outliers.dv) <- points
writeLines('test sample decision values')
print(head(svm.pred.dv))
writeLines('non-outliers and outliers decision values')
print(svm.pred.outliers.dv)
writeLines('svm.model$rho')
print(svm.model$rho)

writeLines('')
writeLines('<< setting svm.model$rho to 0 >>')
writeLines('predicting the SVM with outlier samples')
svm.model$rho <- 0
svm.pred <- predict(svm.model, testing.samples[, -10], decision.values=TRUE)
svm.pred.outliers <- predict(svm.model, outlier.samples, decision.values=TRUE)

writeLines('')                          # printing
svm.pred.dv <- c(attr(svm.pred, 'decision.values'))
svm.pred.outliers.dv <- c(attr(svm.pred.outliers, 'decision.values'))
names(svm.pred.outliers.dv) <- points
writeLines('test sample decision values')
print(head(svm.pred.dv))
writeLines('non-outliers and outliers decision values')
print(svm.pred.outliers.dv)
writeLines('svm.model$rho')
print(svm.model$rho)

关于代码的评论:

你是说偏置项的negative而不是inverse?

SVM的决策函数为sign(w^T x - rho),其中rho为偏置项,w为权重向量,x为输入。但那是原始的 space / 线性形式。 w^T x 被我们的核函数取代,在本例中是 RBF 核。

RBF 内核定义为。因此,如果两个事物之间的距离非常大,那么它就会被平方——我们得到一个巨大的数字。 γ 是一个正数,所以我们正在使我们的巨大巨值成为巨大的负值。 exp(-10) 已经达到 5*10^-5 的数量级,因此对于较远的点,RBF 内核将变为基本为零。如果 sample 对您的所有训练数据知之甚远,那么所有内核产品都将接近于零。这意味着 w^T x 将几乎为零。所以你剩下的基本上是 sign(0-rho),即:你的偏差项的 negative