使用kernlab的不寻常的支持向量

时间:2018-04-20 22:02:25

标签: r svm kernlab

以下代码应使用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)

结果图:

SVM plot

如果我的理解是正确的,黑色形状是支持向量,它是位于边缘内部或边界上的数据点。

那么最顶端的黑点是什么?有三个开放点(因此不支持向量)更接近决策边界。 (两个在附近,很容易看到。除非你放大图片,否则第三个更难看,但它是最右边的那个。)

这里的实现中存在一个错误,或者我错过了一些关于它应该如何工作的概念。任何见解?

1 个答案:

答案 0 :(得分:1)

你的结果没有错。 6个支持向量确实最接近您的决策表面(即您的情况下的行)。我承认你所展示的情节中的阴影看起来有点奇怪。这可能是一个光学人工制品吗?

让我们使用svm库中的e1071来重现您的搜索结果(因为我更熟悉e1071而不是kernlab)。< / p>

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

    enter image description here

    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)
    
  5. enter image description here