![](/img/trans.png)
[英]bad result when using precomputed chi2 kernel with libsvm (matlab)
[英]libsvm cross validation with precomputed kernel in matlab
我正在嘗試使用預先計算的內核與libsvm(matlab)進行5倍交叉驗證,但是,我收到以下錯誤消息:類型為'struct'的輸入參數的未定義函數'ge'。 這是因為Libsvm在交叉驗證中返回的是結構而不是值,如何解決此問題,這是我的代碼:
load('iris.dat')
data=iris(:,1:4);
class=iris(:,5);
% normalize the data
range=repmat((max(data)-min(data)),size(data,1),1);
data=(data-repmat(min(data),size(data,1),1))./range;
% train
tr_data=[data(1:5,:);data(52:56,:);data(101:105,:)];
tr_lbl=[ones(5,1);2*ones(5,1);3*ones(5,1)];
% kernel computation
sigma=.8
rbfKernel = @(X,Y,sigma) exp((-pdist2(X,Y,'euclidean').^2)./(2*sigma^2));
Ktr=[(1:15)',rbfKernel(tr_data,tr_data,sigma)];
kts=[ (1:150)',rbfKernel(data,tr_data,sigma)];
% svmptrain
bestcv = 0;
for log2c = -1:3
cmd = ['Ktr -t 4 -v 5 -c ', num2str(2^log2c)];
cv = svmtrain2(tr_lbl,tr_data, cmd);
if (cv >= bestcv)
bestcv = cv;
bestc = 2^log2c;
end
end
cmd=['-s 0 -c ', num2str(bestc), 'Ktr -t 4']
model=svmtrain2(tr_lbl,tr_data,cmd)
% svm predict
labels=svmpredict(class,data,model,kts)
您正在使用的函數svmtrain2不是標准MATLAB的一部分,並且該函數的輸出也不是結構。 但是,如果您堅持要使用它,則可以使用其他現有功能為數據計算分數:
[f,K] = svmeval(X_eval,varargin)
它使用svmtrain2的輸出評估經過訓練的svm。 但是我更喜歡先使用MATLAB中嵌入的標准函數。 在標准MATLAB庫中有:
SVMStruct = svmtrain(Training,Group)
會返回結構SVMStruct,其中包含有關訓練有素的支持向量機(SVM)分類器的信息。 要么
SVMModel = fitcsvm(X,Y)
返回支持向量機分類器SVMModel,由預測變量X和類別標簽Y進行訓練,以進行一類或兩類分類。 然后您可以使用以下方法為每個預測獲取一些分數:
[label,Score] = predict(SVMModel,X)
返回類似然性度量,即得分或后驗概率。
之所以會出現此錯誤,是因為您試圖比較一個結構和一個數字。
如果您想要在訓練集中找到最佳性能(從您的比較中可以svmtrain
),我認為您不能直接從svmtrain
返回的結構中獲得它。 您應該首先將svmpredict
與訓練集和訓練后的模型一起使用,然后才能從結果結構中獲得准確性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.