簡體   English   中英

在Matlab中使用預計算內核對libsvm進行交叉驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM