带RBF的SVM:对于遥远的测试样本,决策值往往等于偏差项的负值

时间:2016-01-28 15:34:27

标签: machine-learning svm libsvm

在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)

关于代码的评论:

  • 它使用9维的数据集。
  • 它将数据集拆分为训练和测试。
  • 对所有尺寸标准化0到1之间的样本。
  • 它使问题成为二进制。
  • 符合SVM模型。
  • 预测测试样本,获得决策值。
  • 它预测特征空间中[0,1]之外的一些合成(异常值)样本,得到决策值。
  • 它表明异常值的决策值往往是模型生成的偏差项 b 的负值。
  • 它将偏差项 b 设置为0。
  • 预测测试样本,获得决策值。
  • 它预测特征空间中[0,1]之外的一些合成(异常值)样本,得到决策值。
  • 它表明异常值的决策值往往为0。

1 个答案:

答案 0 :(得分:0)

你的意思是偏见词的否定而不是逆?

SVM的决策函数为sign(w^T x - rho),其中rho为偏差项,w为权重向量,x为输入。但那是在原始空间/线性形式。 w^T x被我们的内核函数替换,在这种情况下,它是RBF内核。

RBF内核定义为enter image description here。因此,如果两件事之间的距离非常大,那么它就会变得平方 - 我们得到了一个巨大的数字。 γ是一个正数,因此我们将巨大的巨大价值作为巨大的负值。 exp(-10)已经在5 * 10 ^ -5的数量级,所以对于远点,RBF内核将变为零。如果样本远离所有训练数据,那么所有内核产品将几乎为零。这意味着w^T x几乎为零。所以你剩下的就是sign(0-rho),即你的偏见词的否定