e1071 libsvm有问题吗?


13

我有一个包含两个重叠类的数据集,每个类中有七个点,点在二维空间中。在R中,我正在svme1071软件包中运行,以为这些类构建单独的超平面。我正在使用以下命令:

svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

其中x包含我的数据点并y包含其标签。该命令返回一个svm-object,我用它来计算分离超平面的参数(法向矢量)和(截距)。wb

下图(a)显示了我的点和svm命令返回的超平面(让我们将此超平面称为最佳平面)。带符号O的蓝点表示空间原点,虚线表示边距,带圆圈的是非零ξ(松弛变量)的点。

图(b)显示了另一个超平面,它是最佳5的平行平移(b_new = b_optimal-5)。不难看出,对于该超平面,目标函数

0.5||w||2+costξi
(通过C分类svm最小化)将具有比图所示的最佳超平面更低的值(一个)。看来此svm功能有问题吗?还是我在某个地方犯了错误?

在此处输入图片说明

以下是本实验中使用的R代码。

library(e1071)

get_obj_func_info <- function(w, b, c_par, x, y) {
    xi <- rep(0, nrow(x))

    for (i in 1:nrow(x)) {
        xi[i] <- 1 - as.numeric(as.character(y[i]))*(sum(w*x[i,]) + b)
        if (xi[i] < 0) xi[i] <- 0
    }

    return(list(obj_func_value = 0.5*sqrt(sum(w * w)) + c_par*sum(xi), 
                    sum_xi = sum(xi), xi = xi))
}

x <- structure(c(41.8226593092589, 56.1773406907411, 63.3546813814822, 
66.4912298720281, 72.1002963174962, 77.649309469458, 29.0963054665561, 
38.6260575252066, 44.2351239706747, 53.7648760293253, 31.5087701279719, 
24.3314294372308, 21.9189647758150, 68.9036945334439, 26.2543850639859, 
43.7456149360141, 52.4912298720281, 20.6453186185178, 45.313889181287, 
29.7830021158501, 33.0396571934088, 17.9008386892901, 42.5694092520593, 
27.4305907479407, 49.3546813814822, 40.6090664454681, 24.2940422573947, 
36.9603428065912), .Dim = c(14L, 2L))

y <- structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = c("-1", "1"), class = "factor")

a <- svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)

w <- t(a$coefs) %*% a$SV;
b <- -a$rho;

obj_func_str1 <- get_obj_func_info(w, b, 50000, x, y)
obj_func_str2 <- get_obj_func_info(w, b - 5, 50000, x, y)

您是否调整了成本参数?
艾蒂安·拉辛

请注意,BUGS标记是指使用Gibbs采样的贝叶斯推理,而不是软件问题。我已删除标签。
Sycorax说恢复莫妮卡

Answers:


5

在libsvm FAQ中提到,算法“内部”使用的标签可能与您的不同。有时这会反转模型“系数”的符号。

例如,如果您有标签,则的第一个标签“ -1”将被分类为以运行libsvm并且很明显,您的“ +1” 在算法内部将被分类为。y=[1,+1,+1,1,...]y+11

并回想一下,返回的svm模型中的系数确实是,因此您计算的向量将由于的符号反转而受到影响。αnynwy

请参阅问题“为什么预测标签和决策值的符号有时会颠倒?” 在这里


4

我在MATLAB中使用LIBSVM遇到了相同的问题。为了测试它,我创建了一个非常简单的2D线性可分离数据集,该数据集恰好沿一个轴转换为大约-100。使用LIBSVM训练线性svm会产生一个超平面,其截距仍然在零附近(因此错误率自然为50%)。标准化数据(减去平均值)有所帮助,尽管生成的svm仍然不能完美执行...令人困惑。似乎LIBSVM仅使超平面绕轴旋转而不平移它。也许您应该尝试从数据中减去平均值,但是LIBSVM会以这种方式运行似乎很奇怪。也许我们缺少了一些东西。

值得一提的是,内置的MATLAB函数svmtrain生成的分类器具有100%的准确性,而无需进行标准化。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.