2012-04-07 13 views
10

मैं वर्तमान में मेरे डेटा को वर्गीकृत करने के LIBSVM समर्थन वेक्टर मशीन के MATLAB संस्करण का उपयोग करें। LIBSVM प्रलेखन का उल्लेख है कि एसवीएम लागू करने से पहले स्केलिंग बहुत महत्वपूर्ण है और हमें प्रशिक्षण और परीक्षण डेटा दोनों को स्केल करने के लिए एक ही विधि का उपयोग करना होगा।LIBSVM के लिए परीक्षण डेटा स्केलिंग: MATLAB कार्यान्वयन

"स्केलिंग की एक ही विधि" को समझाया गया है: उदाहरण के लिए, मान लें कि हमने [-10, +10] से [-1, +1] से प्रशिक्षण डेटा की पहली विशेषता को स्केल किया है।

(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,2)) 

: परीक्षण डेटा की पहली विशेषता रेंज [-11, +8] में निहित है, तो हम [0,1] की रेंज में प्रशिक्षण डेटा स्केलिंग निम्नलिखित MATLAB कोड का उपयोग किया जा सकता है [-1.1, +0.8]

करने के लिए परीक्षण डेटा पैमाने चाहिए लेकिन मुझे नहीं पता कि परीक्षण डेटा को सही तरीके से कैसे स्केल करें।

आपकी मदद के लिए बहुत बहुत धन्यवाद।

+0

मेरे सवाल यह है कि अगर है [ए, बी] श्रेणी [0,1] की श्रेणी में सामान्य डेटा, [सी, डी] की सीमा में परीक्षण डेटा किस सीमा तक सामान्यीकृत है? – Lily

उत्तर

16

कोड आप दे अनिवार्य रूप से कम से कम घटाकर और उसके बाद सीमा से विभाजित किया जाता है। आपको प्रशिक्षण डेटा सुविधाओं की न्यूनतम और सीमा को स्टोर करने की आवश्यकता है।

minimums = min(data, [], 1); 
ranges = max(data, [], 1) - minimums; 

data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 

test_data = (test_data - repmat(minimums, size(test_data, 1), 1)) ./ repmat(ranges, size(test_data, 1), 1); 
+0

बहुत बहुत धन्यवाद! :) – Lily

+0

@ रिचांटे: आपका उत्तर बहुत उपयोगी है। मैं सिर्फ स्पष्टीकरण देना चाहता हूं, "डेटा" यहां प्रशिक्षण डेटा है और "test_data" परीक्षण डेटा है ?? – Sid

+0

http://stackoverflow.com/questions/43408031/scaling-for-single-instance-in-matlab-for-libsvm?noredirect=1&lq=1 –

0

Richante के कोड है, दुर्भाग्य से, सही नहीं तो वहाँ कॉलम जिसके लिए टिप्पणियों के सभी एक ही मान (जो करता है, तो डेटा विरल है हो सकता है) है कर रहे हैं। एक उदाहरण:

>> data = [1 2 3; 5 2 8; 7 2 100] 

data = 

    1  2  3 
    5  2  8 
    7  2 100 

>> test_data = [1 2 3; 4 5 6; 7 8 9]; 
>> minimums = min(data,[],1); 
>> ranges = max(data, [], 1) - minimums; 
>> data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1); 
>> data 

data = 

     0  NaN   0 
    0.6667  NaN 0.0515 
    1.0000  NaN 1.0000 

तो आपको यह जांचना होगा कि कॉलम हैं जिनमें केवल एक ही मूल्य है। लेकिन क्या होगा यदि पूरे प्रशिक्षण सेट में केवल एक ही मूल्य है, लेकिन परीक्षण सेट में कई मूल्य हैं? और हम छोड़ने वाले परिदृश्य में क्या करते हैं, जिसमें परीक्षण सेट में केवल एक अवलोकन होता है, फिर यदि प्रशिक्षण सेट के कॉलम में सभी मान 0 है, और परीक्षण सेट में संबंधित मान है 100? ये वास्तव में अपमानजनक मामले हैं, लेकिन ऐसा हो सकता है।

void output(int index, double value) 
{ 
    /* skip single-valued attribute */ 
    if(feature_max[index] == feature_min[index]) 
     return; 

    if(value == feature_min[index]) 
     value = lower; 
    else if(value == feature_max[index]) 
     value = upper; 
    else 
     value = lower + (upper-lower) * 
      (value-feature_min[index])/ 
      (feature_max[index]-feature_min[index]); 

    if(value != 0) 
    { 
     printf("%d:%g ",index, value); 
     new_num_nonzeros++; 
    } 
} 

तो हम इन मामलों को नजरअंदाज करना चाहिए: हालांकि, जब मैं Libsvm पुस्तकालय में फ़ाइल svm_scale.c जाँच की है, मैं इस हिस्से पर ध्यान? मैं वास्तव में नहीं जानता। जैसा कि मैंने कहा है, मैं इस मुद्दे पर एक अधिकार नहीं कर रहा हूँ, इसलिए मैं अधिमानतः Libsvm के लेखकों से खुद को, एक और जवाब के लिए इंतजार करना, चीजों को स्पष्ट करने के लिए जा रहा हूँ .....

संबंधित मुद्दे