2012-05-06 55 views
1

我想使用matlab工具箱來做特性選擇。在那裏有一個很好的功能叫做順序功能塊,可以很好地工作。但是,我無法將其與LibSVM功能集成以執行功能選擇。它與KnnClassify一起工作正常,有人可以幫助我。這裏是KnnClassify代碼:使用libsvm與sequ​​entialfs選擇特性

FUN1 = @(XT,YT,XT,YT)...

(sum((yt ~= knnclassify(Xt,XT,yT,5)))); 

[FS,歷史] = sequentialfs(FUN1,數據,標籤, 'CV' ,C, '選項',選擇採用, '方向', '前');

回答

3

您需要包裝libsvm函數以在特定功能集上訓練和測試SVM。我建議在單獨的.m文件中寫入東西(儘管我認爲它可以用匿名函數進行)。喜歡的東西:

function err = svmwrapper(xTrain, yTrain, xTest, yTest) 
    model = svmtrain(yTrain, xTrain, <svm parameters>); 
    err = sum(svmpredict(yTest, xTest, model) ~= yTest); 
end 

,然後你可以調用sequentialfs有:

[fs history] = sequentialfs(@svmwrapper, ...); 

(您可能需要檢查的參數的順序,以svmtrain,我永遠記得這反過來他們應該是) 。

思想是svmwrapper將訓練一個SVM並在測試集上返回它的錯誤。

匿名相當於是:

svmwrapper = @(xTrain, yTrain, xTest, yTest)sum(svmpredict(yTest, xTest, svmtrain(yTrain, xTrain, <svm parameters>) ~= yTest); 

看起來並不很漂亮。

+0

感謝的人,這是一個很大的幫助。這是我寫的: svmwrapper = @(TrainLbl,TrainData,TestLbl,TestData)sum(svmpredict(TestLbl,TestData,svmtrain(TrainLbl,TrainData,'-t 2 -c 8')〜= yTest)); [fs,history] ​​= sequentialfs(svmwrapper,train_label,train_data_w,test_label,test_data_w,'options',opts,'direction','forward'); –

+0

我得到這個錯誤: 使用sequentialfs錯誤(196行) 數據參數X,Y,...必須有相同的行數。 –

1

我不知道,如果這個問題仍然是開放的,但我得到了使用以下處理功能工作:

%的輸入的順序爲svmpredict和svmtrain去了LIBSVM需要輸入作爲
重要%ytrain,xtrain但sequentialfs發送數據xtrain,ytrain,XTEST,ytest

svfun = @(xtrain,ytrain,xtest,ytest)sum(svmpredict(ytest,xtest,svmtrain(ytrain,xtrain,<svm options>)) ~= ytest); 

[fs history] = sequentialfs(svfun,x,y)