使用 kernlab 的异常支持向量
Unusual support vector using kernlab
以下代码应使用 kernlab
包中的 ksvm
函数创建支持向量分类器(具有线性核的 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)
结果图:
如果我的理解是正确的,黑色的形状是支持向量,它是位于边缘内部或边界上的数据点。
那么最上面的黑点是怎么回事?有三个更接近决策边界的开放点(因此不是支持向量)。 (两个在附近,很容易看到。第三个除非你放大图片,否则很难看到,但它是最右边的一个。)
这里的实现中可能存在错误,或者我遗漏了有关其工作方式的一些概念性信息。有什么见解吗?
您的结果没有任何问题。 6 个支持向量确实最接近您的决策面(即您的情况下的线)。我承认你所展示的情节中的阴影看起来有点奇怪。这可能是光学人工制品吗?
让我们使用 e1071
库中的 svm
重现您的结果(因为我对 e1071
比 kernlab
更熟悉)。
这是您的示例数据。
# 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)
以下代码应使用 kernlab
包中的 ksvm
函数创建支持向量分类器(具有线性核的 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)
结果图:
如果我的理解是正确的,黑色的形状是支持向量,它是位于边缘内部或边界上的数据点。
那么最上面的黑点是怎么回事?有三个更接近决策边界的开放点(因此不是支持向量)。 (两个在附近,很容易看到。第三个除非你放大图片,否则很难看到,但它是最右边的一个。)
这里的实现中可能存在错误,或者我遗漏了有关其工作方式的一些概念性信息。有什么见解吗?
您的结果没有任何问题。 6 个支持向量确实最接近您的决策面(即您的情况下的线)。我承认你所展示的情节中的阴影看起来有点奇怪。这可能是光学人工制品吗?
让我们使用 e1071
库中的 svm
重现您的结果(因为我对 e1071
比 kernlab
更熟悉)。
这是您的示例数据。
# 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)