2012-06-11 51 views
10

Tôi đang sử dụng libsvm với hạt nhân được tính trước. Tôi đã tạo ra một tệp hạt nhân precomputed cho tập dữ liệu ví dụ heart_scale và thực thi svm-train. Nó hoạt động đúng và các vectơ hỗ trợ được nhận dạng chính xác, tức là tương tự như phiên bản không có tiền đề.Libsvm precomputed hạt nhân

Tuy nhiên, khi tôi cố gắng chạy svm-predict, nó đã cho kết quả khác nhau cho các tập tin mô hình precomputed. Sau khi đào qua mã, tôi nhận thấy rằng hàm svm_predict_values ​​(), đòi hỏi các đặc tính thực sự của các vectơ hỗ trợ, không có sẵn trong chế độ precomputed. Trong chế độ precomputed, chúng tôi chỉ có hệ số và chỉ số của mỗi vector hỗ trợ, điều này bị nhầm lẫn với các tính năng của nó bằng svm-predict.

Đây có phải là lỗi hay sự cố với sự hiểu biết của tôi. Nếu nó là một sai lầm trên một phần của tôi, xin vui lòng cho tôi biết làm thế nào để chạy svm-dự đoán trong chế độ precomputed.

+1

Theo tôi nhớ, bạn phải tự dự đoán giá trị nếu bạn sử dụng hạt nhân được tính trước để đào tạo SVM. – George

Trả lời

4

Các giá trị của việc đánh giá hạt nhân giữa một vector tập kiểm tra, x và mỗi tập hợp vector tập huấn nên được sử dụng làm vectơ tính năng bộ thử nghiệm.

Sau đây là các dòng thích hợp từ readme libsvm:

dụ đào tạo mới cho xi:
< label> 0: i 1: K (xi, x1) ... L: K (xi , xL)

Ví dụ thử nghiệm mới cho bất kỳ x:
< nhãn> 0 :? 1: K (x, x1) ... L: K (x, xL)

libsvm readme nói rằng nếu bạn có L tập hợp các vectơ, trong đó xi là vector tập huấn với i từ [ 1..L] và vectơ tập hợp thử nghiệm, x, thì vectơ tính năng cho x phải là

< nhãn x> 0: < bất kỳ số nào> 1: K (x^{test}, x1^{ train}), 2: K (x^{test}, x2^{train}) ... L: K (x^{test}, xL^{train})

trong đó K (u, v) được sử dụng để biểu thị đầu ra của hàm hạt nhân trên với vectơ u và v làm đối số.

Tôi đã bao gồm một số mã Python ví dụ bên dưới.

Kết quả từ biểu diễn vector tính năng ban đầu và hạt nhân precomputed (tuyến tính) không hoàn toàn giống nhau, nhưng điều này có thể do sự khác biệt trong thuật toán tối ưu hóa.

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) 
Các vấn đề liên quan