以下代码应使用ksvm
包中的kernlab
函数创建支持向量分类器(带线性内核的SVM):
library(kernlab)
set.seed(1)
x <- rbind(matrix(rnorm(10 * 2, mean = 0), ncol = 2),
matrix(rnorm(10 * 2, mean = 2), ncol = 2))
y <- c(rep(-1, 10), rep(1, 10))
svc <- ksvm(x, y, type = "C-svc", kernel = "vanilladot")
plot(svc, data = x)
结果图:
如果我的理解是正确的,黑色形状是支持向量,它是位于边缘内部或边界上的数据点。
那么最顶端的黑点是什么?有三个开放点(因此不支持向量)更接近决策边界。 (两个在附近,很容易看到。除非你放大图片,否则第三个更难看,但它是最右边的那个。)
这里的实现中存在一个错误,或者我错过了一些关于它应该如何工作的概念。任何见解?
答案 0 :(得分:1)
你的结果没有错。 6个支持向量确实最接近您的决策表面(即您的情况下的行)。我承认你所展示的情节中的阴影看起来有点奇怪。这可能是一个光学人工制品吗?
让我们使用svm
库中的e1071
来重现您的搜索结果(因为我更熟悉e1071
而不是kernlab
)。< / p>
以下是您的示例数据。
# Sample data
set.seed(1)
x <- rbind(matrix(rnorm(10 * 2, mean = 0), ncol = 2),
matrix(rnorm(10 * 2, mean = 2), ncol = 2))
y <- c(rep(-1, 10), rep(1, 10))
df <- data.frame(x = x, y = as.factor(y));
让我们使用svm
作为使用线性内核的分类机器。 scale = FALSE
确保数据不会缩放。
library(e1071);
fit <- svm(y ~ ., data = df, kernel = "linear", type = "C-classification", scale = FALSE);
fit;
#
#Call:
#svm(formula = y ~ ., data = df, kernel = "linear", type = "C-classification",
# scale = FALSE)
#
#
#Parameters:
# SVM-Type: C-classification
# SVM-Kernel: linear
# cost: 1
# gamma: 0.5
#
#Number of Support Vectors: 6
我们绘制决策曲面和支持向量(SV)。
plot(fit, df);
SV由x
符号标记。您可以清楚地看到SV如何位于离分离决策线最近的位置。
我们还可以提取决策线的参数(即其法线向量),并手动绘制决策线和数据:
# Normal vector and offset
w <- t(fit$coefs) %*% fit$SV
b <- fit$rho;
# Generate data for the decision line
x.1 <- seq(min(df[, 1]), max(df[, 1]), length.out = 20);
x.2 <- (b - w[1] * x.1) / w[2];
df.h <- data.frame(x.1 = x.1, x.2 = x.2);
# Plot
ggplot(df, aes(x.2, x.1)) +
geom_point(aes(colour = y), size = 2) +
geom_line(data = df.h, aes(x = x.2, y = x.1), linetype = 2)