E1071 libsvm ile ilgili bir sorun mu var?


13

Ü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 svmiçin e1071paketten çalışıyorum . Aşağıdaki komutu kullanıyorum:

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

burada xveri noktalarımı ve yetiketlerini 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 .wb

Aşağıdaki şekil (a) noktalarımı ve svmkomut 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?

0.5||w||2+costξi
svm

resim açıklamasını buraya girin

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)

Maliyet parametresini ayarladınız mı?
Etienne Racine

BUGS etiketinin, yazılım sorunlarını değil, Gibbs Örneklemesi Kullanarak Bayesci çıkarımı ifade ettiğini unutmayın. Etiketi kaldırdım.
Sycorax, Reinstate Monica'ya

Yanıtlar:


5

Libsvm SSS'de algoritmanın "iç "inde kullanılan etiketlerin sizinkinden farklı olabileceğinden bahsedilmektedir. Bu bazen modelin "katsayı" işaretini tersine çevirir.

y=[1,+1,+1,1,...]y+11

αnynwy

"Öngörülen etiketlerin ve karar değerlerinin işareti neden bazen ters çevriliyor?" burada .


4

MATLAB'da LIBSVM kullanarak aynı problemle karşılaştım. Test etmek için, bir eksen boyunca -100 civarında çevrilen çok basit, 2B doğrusal olarak ayrılabilir bir veri kümesi oluşturdum. LIBSVM kullanarak doğrusal bir svm eğitimi, kesişmesi hala sıfır civarında olan bir hiper düzlem üretti (ve dolayısıyla hata oranı doğal olarak% 50 idi). Verilerin standartlaştırılması (ortalamanın çıkarılması), sonuçta ortaya çıkan svm hala mükemmel bir performans göstermedi ... Görünüşe göre LIBSVM, hiper düzlemi çevirmeden eksen etrafında döndürüyor. Belki de verileri verilerinizden çıkarmayı denemelisiniz, ancak LIBSVM'nin bu şekilde davranması garip görünüyor. Belki bir şeyleri kaçırıyoruz.

Değeri için, yerleşik MATLAB işlevi svmtrainstandartlaştırma olmadan% 100 doğrulukla bir sınıflandırıcı üretti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.