2012-04-27 38 views
0

我試圖執行在https://stackoverflow.com/a/4215056給出的LIBSVM的例子,但我得到的標題提到的錯誤類型錯誤。Python的LIBSVM:類型錯誤:__init __()得到了一個意想不到的關鍵字參數「kernel_type」

from svm import * 
prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]]) 
param = svm_parameter(kernel_type = LINEAR, C = 1) 
## training the model 
m = svm_model(prob, param) 
#testing the model 
m.predict([1, 1, 1]) 

Error: 
    param = svm_parameter(kernel_type = LINEAR, C = 1) 
TypeError: __init__() got an unexpected keyword argument 'kernel_type' 

回答

3

我有這個問題libsvm-3.12(我假設你的問題是由類似的東西造成的)。查看libsvm-3.12/python文件夾中的svm.py模塊中的方法'svm_parameter',該方法期望參數作爲選項字符串傳遞,例如, '-t 2 -v 5 -c 1'。

我發現它更好地做到:

from svmutil import * 
# Specify training set 
prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]]) 
# Train the model 
m = svm_train(prob, '-t 0 -c 1') 
# Make a prediction 
predicted_labels, _, _ = svm_predict([-1],[[1,1,1]],m) 
# Predicted label for input [1,1,1] is predicted_labels[0] 
print "Predicted value: " + str(predicted_labels[0]) 

一點解釋:svm_predict(Y,X,M)採取「正確的標籤」列表y和輸入數據的列表X除模型m。然後,predict_labels將成爲x中給出的每個輸入的預測類的列表。這允許用戶在一行中請求多個預測。

正確的標籤由用戶返回準確的信息提供。如果用戶不知道正確的標籤,那麼只需在其中放置一個任意標籤並忽略準確性值。查看libsvm-3.12/python/svmutil.py中的源代碼,以獲取有關svm_predict在其他'_'位置返回的內容的更多信息。

特別是,從 'svmutil.py' 採取svm_train的選項有:

""" 
... 
'options': 
    -s svm_type : set type of SVM (default 0) 
     0 -- C-SVC 
     1 -- nu-SVC 
     2 -- one-class SVM 
     3 -- epsilon-SVR 
     4 -- nu-SVR 
    -t kernel_type : set type of kernel function (default 2) 
     0 -- linear: u'*v 
     1 -- polynomial: (gamma*u'*v + coef0)^degree 
     2 -- radial basis function: exp(-gamma*|u-v|^2) 
     3 -- sigmoid: tanh(gamma*u'*v + coef0) 
     4 -- precomputed kernel (kernel values in training_set_file) 
    -d degree : set degree in kernel function (default 3) 
    -g gamma : set gamma in kernel function (default 1/num_features) 
    -r coef0 : set coef0 in kernel function (default 0) 
    -c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1) 
    -n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default 0.5) 
    -p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1) 
    -m cachesize : set cache memory size in MB (default 100) 
    -e epsilon : set tolerance of termination criterion (default 0.001) 
    -h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1) 
    -b probability_estimates : whether to train a SVC or SVR model for probability estimates, 0 or 1 (default 0) 
    -wi weight : set the parameter C of class i to weight*C, for C-SVC (default 1) 
    -v n: n-fold cross validation mode 
    -q : quiet mode (no outputs) 
""" 
+0

獲取NameError:名字 'svm_train' 沒有定義 – Superdooperhero 2012-10-18 20:20:43

+0

'svm_train'在'LIBSVM-3.12 \ python的\ svmutil.py'定義。你是否包含'from svmutil import *'並正確設置了PYTHONPATH? – richardr 2012-10-19 11:55:04

0

上面的代碼不會對libsvm的版本3.16(最新的)工作。改用下面的代碼。然而,在開始之前,請確保您有這些文件 - 「libsvm.dll」,「svm.py」 &「svmutil.py」 - 在你的項目工作文件夾。例如:c:\ my project \ python_libsvm_exercise。

from svmutil import * 
m = svm_train([1,-1],[[1,0,1],[-1,0,-1]], '-t 0 -c 10') 
p_labels, p_acc, p_vals = svm_predict([1,-1],[[1,0,1],[-1,0,-1]], m) 

請務必閱讀'README'文件。它有很多關於如何使用每個功能的例子。您可以下載最新版本LIBSVM這裏http://goo.gl/YtCU

相關問題