使用 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 重现您的结果(因为我对 e1071kernlab 更熟悉)。

  1. 这是您的示例数据。

    # 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));
    
  2. 让我们使用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
    
  3. 我们绘制决策面和支持向量 (SV)。

    plot(fit, df);
    

    SV 由 x 符号标记。您可以清楚地看到 SV 是如何位于最靠近分离决策线的位置。

  4. 我们也可以提取决策线的参数(即法向量),手动绘制决策线和数据:

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