Üst üste binen iki sınıflı bir veri setim var, her sınıfta yedi nokta, iki boyutlu uzayda noktalar var. R, ve ben bu sınıflar için ayrı bir köprü oluşturmak svm
için e1071
paketten çalışıyorum . Aşağıdaki komutu kullanıyorum:
svm(x, y, scale = FALSE, type = 'C-classification', kernel = 'linear', cost = 50000)
burada x
veri noktalarımı ve y
etiketlerini içeriyor. Komut, ayırma köprüsü (normal vektör) ve b (kesme) parametrelerini hesaplamak için kullandığım bir svm nesnesi döndürür .
Aşağıdaki şekil (a) noktalarımı ve svm
komut tarafından döndürülen hiper düzlemi göstermektedir (bu hiper düzlemi en uygun olanı diyelim). O sembollü mavi nokta alanın kökenini, noktalı çizgiler kenar boşluğunu gösterir, daire içine alınmış sıfır olmayan (gevşek değişkenler) olan noktalardır.
Şekil (b), optimalin 5'e paralel bir çevirisi olan başka bir hiper düzlemi göstermektedir (b_new = b_optimal - 5). Bu hiper düzlem için objektif fonksiyonun olduğunu görmek zor değil | | w | | 2 + c o s t ∑ ξ i (C-sınıflandırma svm tarafından en aza indirilir), şekil (a) 'da gösterilen optimal hiper düzlemden daha düşük bir değere sahip olacaktır. Öyleyse bu işlevle ilgili bir sorun var gibi görünüyor mu? Yoksa bir yerde hata mı yaptım?
svm
Aşağıda bu deneyde kullandığım R kodu var.
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)