2010-03-19 6 views
7

में लिबएसवीएम के साथ प्रीकंप्यूटेड कर्नेल, मैं ~ 3 घंटे के लिए नेट खोज रहा हूं लेकिन मुझे अभी तक कोई समाधान नहीं मिला। मैं libsvm और एक डाटासेट वर्गीकृत करने के लिए एक precomputed गिरी देना चाहते हैं, लेकिन:पायथन

  • मैं एक precomputed गिरी कैसे बना सकता है? (उदाहरण के लिए, Iris data के लिए बुनियादी precomputed कर्नेल क्या है?)

  • libsvm प्रलेखन में, यह कहा गया है कि:

    precomputed कर्नेल के लिए, को हमेशा पहली बार तत्व आईडी होना चाहिए। उदाहरण के लिए,

     samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]] 
         problem = svm_problem(labels, samples) 
         param = svm_parameter(kernel_type=PRECOMPUTED) 
    

एक आईडी क्या है? उस पर कोई और जानकारी नहीं है। क्या मैं अनुक्रमिक रूप से आईडी असाइन कर सकता हूं?

कोई libsvm सहायता और प्रीकंप्यूटेड कर्नेल का एक उदाहरण वास्तव में सराहना की।

उत्तर

14

सभी पहले, कर्नेल और SVMs कुछ पृष्ठभूमि ...

आप n वैक्टर (किसी भी आयाम की), क्या करने की जरूरत है के लिए एक कर्नेल पूर्व गणना करने के लिए चाहते हैं, तो गिरी समारोह की गणना है उदाहरणों की प्रत्येक जोड़ी के बीच। कर्नेल फ़ंक्शन दो वैक्टर लेता है और स्केलर देता है, इसलिए आप स्केलर्स के nxn मैट्रिक्स के रूप में प्रीकंप्यूटेड कर्नेल के बारे में सोच सकते हैं। इसे आमतौर पर कर्नेल मैट्रिक्स, या कभी-कभी ग्राम मैट्रिक्स कहा जाता है।

कई भिन्न कर्नलों रहे हैं, सरल रेखीय गिरी (यह भी डॉट उत्पाद के रूप में जाना जाता है):

sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors

दूसरे, आपकी समस्या को जवाब देने के लिए कोशिश कर रहा है ...

Libsvm में precomputed कर्नेल के बारे में प्रलेखन वास्तव में बहुत अच्छा है ...

Assume the original training data has three four-feature instances 
and testing data has one instance: 

15 1:1 2:1 3:1 4:1 
45  2:3  4:3 
25   3:1 
15 1:1  3:1 

If the linear kernel is used, we have the following 
new training/testing sets: 

15 0:1 1:4 2:6 3:1 
45 0:2 1:6 2:18 3:0 
25 0:3 1:1 2:0 3:1 

15 0:? 1:2 2:0 3:1 

दूसरे उदाहरण में यहां प्रत्येक वेक्टर कर्नेल मैट्रिक्स में एक पंक्ति है। इंडेक्स शून्य पर मान आईडी मान है और यह सिर्फ अनुक्रमिक गिनती प्रतीत होता है। पहले वेक्टर के इंडेक्स 1 पर मान पहले उदाहरण से पहले वेक्टर के कर्नेल फ़ंक्शन का मान है (यानी (1x1)+(1x1)+(1x1)+(1x1) = 4), दूसरा दूसरा वेक्टर के कर्नेल फ़ंक्शन का दूसरा है (यानी (1x3)+(1x3)=6)। यह इस तरह के उदाहरण के लिए इस तरह से चलता है। आप देख सकते हैं कि कर्नेल मैट्रिक्स सममित है, जैसा कि यह होना चाहिए, क्योंकि के (एक्स, वाई) = के (वाई, एक्स)।

यह इंगित करने योग्य है कि वैक्टरों का पहला सेट एक स्पैर प्रारूप में प्रदर्शित होता है (यानी गायब मान शून्य हैं), लेकिन कर्नेल मैट्रिक्स स्पैस नहीं है और नहीं होना चाहिए। मुझे नहीं पता कि ऐसा क्यों है, यह सिर्फ एक libsvm चीज लगता है।

+0

सबसे उपयोगी उत्तर! – JXITC

2

पर उदाहरण और दस्तावेज़ीकरण देखें, यहां एक साधारण दो श्रेणी 3 वेक्टर कस्टम कर्नेल इनपुट फ़ाइल है जो सही तरीके से काम करती है।मैं भागों समझा जाएगा (हालांकि आप भी StompChicken का जवाब देखना चाहिए):

1 0:1 1:10 2:12 3:21
2 0:2 1:12 2:19 3:30
1 0:3 1:21 2:30 3:130

प्रत्येक पंक्ति पर पहले नंबर किस श्रेणी के अंतर्गत आता है यह है। 2 दूसरी प्रविष्टि
0 पर: पहली प्रविष्टि
0 पर 1:, एन और यह अनुक्रमिक होना चाहिए यानी
0: प्रत्येक पंक्ति पर अगले एंट्री फॉर्म 0 में से है 3 तृतीय प्रवेश पर

इसके लिए एक संभावित कारण यह है कि libsvm मूल्यों को अल्फा_आई देता है जो आउटपुट फ़ाइल में आपके वैक्टर के साथ जाता है, लेकिन प्रीकंप्यूटेड कर्नेल के लिए वैक्टर प्रदर्शित नहीं होते हैं (जो वास्तव में बड़ा हो सकता है) बल्कि इंडेक्स 0: एन जो उस वेक्टर के साथ चला गया है दिखाया गया है अपने इनपुट के साथ मिलान करने के लिए अपने आउटपुट को आसान बनाने के लिए। खासकर जब आउटपुट उसी क्रम में नहीं है, तो आप उन्हें श्रेणीबद्ध करते हैं। यह आपके लिए बहुत उपयोगी है जब इनपुट फ़ाइल को पढ़ने के लिए libsvm के आउटपुट को अपने स्वयं के इनपुट के साथ मिलान करने में सक्षम होने के लिए उन 0: n मानों को प्राप्त करने में सक्षम होना चाहिए। यहाँ आप उत्पादन देख सकते हैं

svm_type c_svc
kernel_type precomputed
nr_class 2
total_sv 3
रो -१.५३९५१
लेबल 1 2
nr_sv 2 1
एसवी
.4126650675419768 0: 1
0.03174528241667363 0: 3
-0.4444103499586504 0: 2

यह महत्वपूर्ण यह ध्यान देने के लिए है कि प्रीकंप्यूटेड कर्नेल के साथ आप शून्य प्रविष्टियों को छोड़ नहीं सकते जैसे आप अन्य सभी कर्नल के साथ कर सकते हैं। उन्हें स्पष्ट रूप से शामिल किया जाना चाहिए।

5

कृष्ण-सीखने कस्टम कर्नेल को संभालने के दौरान libsvm के अधिकांश विवरण छुपाते हैं। आप या तो अपने कर्नेल के रूप में एक मनमाने ढंग से कार्य कर सकते हैं और यह आपके लिए ग्राम मैट्रिक्स की गणना करेगा या कर्नेल के प्रीकंप्यूटेड ग्राम मैट्रिक्स को पास करेगा।

पहले एक के लिए, वाक्य रचना है:

>>> from scikits.learn import svm 
    >>> clf = svm.SVC(kernel=my_kernel) 

जहां my_kernel अपने कर्नेल समारोह है, और फिर आप clf.fit (एक्स, वाई) कॉल कर सकते हैं और यह आपके लिए कर्नेल मैट्रिक्स की गणना करेगा। दूसरे मामले में वाक्य रचना है:

>>> from scikits.learn import svm 
    >>> clf = svm.SVC(kernel="precomputed") 

और जब आप clf.fit (एक्स, वाई) कहते हैं, एक्स मैट्रिक्स कश्मीर (एक्स, एक्स), जहां कश्मीर अपने गिरी है होना चाहिए। अधिक जानकारी के लिए यह उदाहरण भी देखें:

http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html