Saya memiliki dataset dengan dua kelas yang tumpang tindih, tujuh poin di setiap kelas, poin berada dalam ruang dua dimensi. Di R, dan saya menjalankan svmdari e1071paket untuk membangun hyperplane pemisah untuk kelas-kelas ini. Saya menggunakan perintah berikut:
svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)
di mana xberisi titik data saya dan yberisi label mereka. Perintah mengembalikan svm-object, yang saya gunakan untuk menghitung parameter (vektor normal) dan b (intersep) dari hyperplane pemisah.
Gambar (a) di bawah ini menunjukkan poin saya dan hyperplane dikembalikan oleh svmperintah (mari kita sebut hyperplane ini yang optimal). Titik biru dengan simbol O menunjukkan ruang asal, garis putus-putus menunjukkan margin, dilingkari adalah titik-titik yang memiliki non-nol (variabel slack).
Gambar (b) menunjukkan hyperplane lain, yang merupakan terjemahan paralel dari yang optimal oleh 5 (b_new = b_optimal - 5). Tidak sulit untuk melihat bahwa untuk hyperplane ini fungsi objektif (yang diminimalkan dengan C-klasifikasi SVM) akan memiliki nilai yang lebih rendah daripada untuk hyperplane optimal ditunjukkan pada gambar (a). Jadi apakah ada masalah dengan fungsi ini ? Atau apakah saya membuat kesalahan di suatu tempat?
svm

Di bawah ini adalah kode R yang saya gunakan dalam percobaan ini.
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)