Libsvm预先计算的内核

use*_*919 11 machine-learning libsvm scikit-learn

我正在使用libsvm与预先计算的内核.我为示例数据集heart_scale生成了一个预先计算的内核文件并执行了该函数svmtrain().它工作正常,支持向量被正确识别,即类似于标准内核.

但是,当我尝试运行时svmpredict(),它为预先计算的模型文件提供了不同的结果.在深入研究代码之后,我注意到该svm_predict_values()函数需要支持向量的实际特征,这在预计算模式下是不可用的.在预先计算模式中,我们只有每个支持向量的系数和索引,这被误认为是它的特征svmpredict().

这是一个问题还是我错过了什么.

(请告诉我如何svmpredict()在预先计算模式下运行.)

use*_*913 5

测试集向量x和每个训练集向量之间的内核评估值应该用作测试集特征向量.

以下是libsvm自述文件中的相关行:

xi的新训练实例:
<label> 0:i 1:K(xi,x1)... L:K(xi,xL)

任何x的新测试实例:
<label> 0:?1:K(x,x1)... L:K(x,xL)

libsvm自述文件说如果你有L个训练集向量,其中xi是一个训练集向量,其中i来自[1..L],而一个测试集向量x,那么x的特征向量应该是

<x的标签> 0:<任意数字> 1:K(x ^ {test},x1 ^ {train}),2:K(x ^ {test},x2 ^ {train})... L:K (X ^ {测试},XL ^ {火车})

其中K(u,v)用于表示内核函数的输出,其中向量u和v作为参数.

我在下面包含了一些示例python代码.

原始特征向量表示和预先计算(线性)内核的结果不完全相同,但这可能是由于优化算法的差异.

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)
Run Code Online (Sandbox Code Playgroud)