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

Posted

技术标签:

【中文标题】带 RBF 的 SVM:决策值往往等于偏远测试样本的偏差项的负值【英文标题】:SVM with RBF: Decision values tend to be equal to the negative of the bias term for faraway test samples 【发布时间】:2016-05-06 01:46:53 【问题描述】:

在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】:

你的意思是偏置项而不是逆项吗?

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

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

【讨论】:

以上是关于带 RBF 的 SVM:决策值往往等于偏远测试样本的偏差项的负值的主要内容,如果未能解决你的问题,请参考以下文章

手动计算SVM的决策函数

SVM+核函数选择

SVM 参数调优

将带有 rbf 内核的 sklearn SVC 移植到 java

#测试两种不同的SVM,rbf的核真是太棒了(一种会拐弯的边界)

Lasvm 文档和信息 [关闭]