[英]using precomputed kernels with libsvm
我目前正致力於使用不同的圖像描述符對圖像進行分類。 由於他們有自己的指標,我使用預先計算的內核。 因此,考慮到這些NxN內核矩陣(總共N個圖像),我想訓練和測試SVM。 雖然我對使用SVM不是很有經驗。
令我困惑的是如何輸入培訓輸入。 使用內核MxM的子集(M是訓練圖像的數量),訓練具有M個特征的SVM。 但是,如果我理解正確,這限制了我使用具有相似數量的功能的測試數據。 嘗試使用大小為MxN的子內核,在訓練期間會導致無限循環,因此,在測試時使用更多功能會產生不良結果。
這導致使用相同大小的訓練和測試集給出合理的結果。 但是,如果我只想分類,說一張圖像,或者為每個班級訓練一定數量的圖像並用其余的訓練,這根本不起作用。
如何消除訓練圖像和特征數量之間的依賴關系,以便我可以測試任意數量的圖像?
我正在使用libsvm for MATLAB,內核是距離矩陣,范圍在[0,1]之間。
您似乎已經找到了問題...根據MATLAB包中包含的README文件:
要使用預先計算的內核,必須包含樣本序列號作為培訓和測試數據的第一列。
讓我用一個例子來說明:
%# read dataset
[dataClass, data] = libsvmread('./heart_scale');
%# split into train/test datasets
trainData = data(1:150,:);
testData = data(151:270,:);
trainClass = dataClass(1:150,:);
testClass = dataClass(151:270,:);
numTrain = size(trainData,1);
numTest = size(testData,1);
%# radial basis function: exp(-gamma*|u-v|^2)
sigma = 2e-3;
rbfKernel = @(X,Y) exp(-sigma .* pdist2(X,Y,'euclidean').^2);
%# compute kernel matrices between every pairs of (train,train) and
%# (test,train) instances and include sample serial number as first column
K = [ (1:numTrain)' , rbfKernel(trainData,trainData) ];
KK = [ (1:numTest)' , rbfKernel(testData,trainData) ];
%# train and test
model = svmtrain(trainClass, K, '-t 4');
[predClass, acc, decVals] = svmpredict(testClass, KK, model);
%# confusion matrix
C = confusionmat(testClass,predClass)
輸出:
*
optimization finished, #iter = 70
nu = 0.933333
obj = -117.027620, rho = 0.183062
nSV = 140, nBSV = 140
Total nSV = 140
Accuracy = 85.8333% (103/120) (classification)
C =
65 5
12 38
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.