E1071 libsvm के साथ समस्या?


13

मेरे पास दो ओवरलैपिंग वर्गों के साथ एक डेटासेट है, प्रत्येक कक्षा में सात अंक, अंक दो-आयामी स्थान में हैं। आर में, और मैं इन वर्गों के लिए एक अलग हाइपरप्लेन बनाने के svmलिए e1071पैकेज से चल रहा हूं । मैं निम्नलिखित कमांड का उपयोग कर रहा हूं:

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

जहां xमेरे डेटा बिंदु yशामिल हैं और उनके लेबल शामिल हैं। कमांड एक svm-object देता है, जिसका उपयोग मैं अलग-अलग हाइपरप्लेन के पैरामीटर (सामान्य वेक्टर) और (इंटरसेप्ट) की गणना के लिए करता हूं ।wb

नीचे दिया गया चित्र (ए) मेरी बातों को दिखाता है और हाइपरप्लेन svmकमांड द्वारा वापस आ जाता है (चलो इस हाइपरप्लेन को सबसे इष्टतम कॉल करें)। प्रतीक O के साथ नीला बिंदु अंतरिक्ष की उत्पत्ति को दर्शाता है, बिंदीदार रेखाएं मार्जिन दिखाती हैं, परिक्रमा वे बिंदु होते हैं जिनमें गैर-शून्य (सुस्त चर) होते हैं।ξ

चित्रा (बी) एक और हाइपरप्लेन दिखाता है, जो 5 (b_new = b_optimal - 5) द्वारा इष्टतम एक के समानांतर अनुवाद है। यह देखना मुश्किल नहीं है कि इस हाइपरप्लेन के लिए ऑब्जेक्टिव फंक्शन (जो कि C- क्लासिफिकेशन svm द्वारा कम किया गया है) में फिगर में दिखाए गए इष्टतम हाइपरप्लेन की तुलना में कम वैल्यू होगी ( ए)। तो क्या ऐसा लगता है कि इस फ़ंक्शन में कोई समस्या है ? या मैंने कहीं गलती की?

0.5||w||2+costξi
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 टैग गिब्स सैंपलिंग का उपयोग करता है, गिब्स नमूनाकरण का उपयोग करता है, न कि सॉफ्टवेयर समस्याओं का। मैंने टैग हटा दिया है।
साइकोरैक्स का कहना है कि मोनिका सेप

जवाबों:


5

Libsvm में अक्सर पूछे जाने वाले प्रश्न का उल्लेख किया जाता है कि एल्गोरिथ्म में "अंदर" इस्तेमाल होने वाले लेबल आपसे अलग हो सकते हैं। यह कभी-कभी मॉडल के "coefs" के संकेत को उलट देगा।

उदाहरण के लिए, यदि आपके पास लेबल था, तो में पहला लेबल , जो "-1" है, को libsvm चलाने के लिए के रूप में वर्गीकृत किया जाएगा। और, जाहिर है, आपके "+1" को एल्गोरिथम के अंदर रूप में वर्गीकृत किया जाएगा ।+ - y=[1,+1,+1,1,...]y+11

और याद रखें कि लौटे हुए svm मॉडल में वास्तव में और इसलिए आपकी गणना की गई wαnynwy

प्रश्न देखें "कभी-कभी अनुमानित लेबल और निर्णय मानों का संकेत उल्टा क्यों होता है?" यहाँ


4

मैं MATLAB में LIBSVM का उपयोग करके एक ही समस्या में चला गया हूं। इसका परीक्षण करने के लिए, मैंने एक बहुत ही सरल, 2 डी रैखिक रूप से अलग करने योग्य डेटा सेट बनाया जो एक अक्ष के साथ -100 के आसपास अनुवाद करने के लिए हुआ। LIBSVM का उपयोग कर एक रैखिक svm का प्रशिक्षण एक हाइपरप्लेन का उत्पादन करता था जिसका अवरोधन अभी भी शून्य के आसपास सही था (और इसलिए त्रुटि दर 50% थी, स्वाभाविक रूप से)। डेटा को मानकीकृत करना (मतलब घटाना) में मदद मिली, हालांकि परिणामी svm अभी भी पूरी तरह से प्रदर्शन नहीं किया ... हैरान करनेवाला। ऐसा लगता है जैसे LIBSVM केवल अनुवाद किए बिना ही अक्ष के बारे में हाइपरप्लेन को घुमाता है। शायद आपको अपने डेटा से औसत को घटाने की कोशिश करनी चाहिए, लेकिन यह अजीब लगता है कि LIBSVM इस तरह से व्यवहार करेगा। शायद हमें कुछ याद आ रहा है।

इसके लायक होने के लिए, अंतर्निहित MATLAB फ़ंक्शन svmtrainने मानकीकरण के बिना 100% सटीकता के साथ एक क्लासिफायरियर का उत्पादन किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.