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)
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