2012-06-11 14 views
10

मैं precomputed कर्नेल के साथ libsvm उपयोग कर रहा हूँ। मैंने उदाहरण डेटा सेट दिल_स्केल और निष्पादित एसवीएम-ट्रेन के लिए एक प्रीकंप्यूटेड कर्नेल फ़ाइल जेनरेट की है। यह ठीक से काम करता है और समर्थन वैक्टरों को सही ढंग से पहचाना जाता है, यानी गैर प्रीकंप्यूटेड संस्करण के समान।Libsvm precomputed कर्नेल

हालांकि, जब मैं चलाने के लिए कोशिश कर रहा हूँ SVM-भविष्यवाणी, यह precomputed मॉडल फ़ाइल के लिए अलग-अलग परिणाम दे दी है। कोड के माध्यम से खोदने के बाद, मैंने देखा कि svm_predict_values ​​() फ़ंक्शन, समर्थन वैक्टर की वास्तविक विशेषताओं की आवश्यकता है, जो प्रीकंप्यूटेड मोड में अनुपलब्ध है। precomputed मोड में, हम केवल गुणांक और प्रत्येक समर्थन वेक्टर, जो SVM-भविष्यवाणी से अपनी सुविधाओं के लिए गलत है के सूचकांक की है।

यह एक बग या मेरी समझ के साथ एक समस्या है। अगर यह मेरे हिस्से पर एक गलती है, तो कृपया मुझे बताएं कि प्रीकंप्यूटेड मोड में svm-predict को कैसे चलाया जाए।

+1

जहाँ तक मुझे याद है के रूप में, आप मैन्युअल मूल्यों की भविष्यवाणी करने के लिए यदि आप पूर्व परिकलित गिरी का उपयोग SVM को प्रशिक्षित करने के लिए है। – George

उत्तर

4

परीक्षण सेट वेक्टर, एक्स, और प्रत्येक प्रशिक्षण सेट वेक्टर के बीच कर्नेल मूल्यांकन के मान परीक्षण सेट फीचर वेक्टर के रूप में उपयोग किए जाने चाहिए।
< लेबल> 0: मैं 1: कश्मीर (XI, x 1) ... एल: कश्मीर (XI

xi के लिए नए प्रशिक्षण उदाहरण:

यहाँ libsvm रीडमी से उचित लाइनें हैं , एक्सएल) किसी भी एक्स के लिए

नए परीक्षण उदाहरण:
< लेबल> 0 :? 1: कश्मीर (x, x 1) ... एल: कश्मीर (एक्स, xL)

libsvm रीडमी कह रहा है कि यदि आप एल प्रशिक्षण सेट वैक्टर है, जहां xi प्रशिक्षण सेट वेक्टर मैं के साथ से है [ 1..एल], और एक परीक्षण सेट वेक्टर, एक्स, तो x के लिए फीचर वेक्टर

< x> 0: < का लेबल किसी भी संख्या> 1: के (x^{test}, x1^{ ट्रेन}), 2: के (एक्स^{टेस्ट}, एक्स 2^{ट्रेन}) ... एल: के (एक्स^{टेस्ट}, एक्सएल^{ट्रेन})

जहां के (यू, वी) तर्क के रूप में वेक्टर यू और वी के साथ कर्नेल फ़ंक्शन के आउटपुट को इंगित करने के लिए उपयोग किया जाता है।

मैंने नीचे कुछ उदाहरण पायथन कोड शामिल किया है।

मूल फीचर वेक्टर प्रतिनिधित्व और precomputed (लीनियर) कर्नेल से परिणाम बिल्कुल वैसा ही नहीं हैं, लेकिन यह शायद अनुकूलन एल्गोरिथ्म में अंतर के कारण है।

from svmutil import * 
import numpy as np 

#original example 
y, x = svm_read_problem('.../heart_scale') 
m = svm_train(y[:200], x[:200], '-c 4') 
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m) 

############## 
#train the SVM using a precomputed linear kernel 

#create dense data 
max_key=np.max([np.max(v.keys()) for v in x]) 
arr=np.zeros((len(x),max_key)) 

for row,vec in enumerate(x): 
    for k,v in vec.iteritems(): 
     arr[row][k-1]=v 
x=arr 

#create a linear kernel matrix with the training data 
K_train=np.zeros((200,201)) 
K_train[:,1:]=np.dot(x[:200],x[:200].T) 
K_train[:,:1]=np.arange(200)[:,np.newaxis]+1 

m = svm_train(y[:200], [list(row) for row in K_train], '-c 4 -t 4') 

#create a linear kernel matrix for the test data 
K_test=np.zeros((len(x)-200,201)) 
K_test[:,1:]=np.dot(x[200:],x[:200].T) 
K_test[:,:1]=np.arange(len(x)-200)[:,np.newaxis]+1 

p_label, p_acc, p_val = svm_predict(y[200:],[list(row) for row in K_test], m) 
संबंधित मुद्दे