我想使用matlab工具箱进行特征选择。有一个很好的功能叫做sequentialfs,做得很好。但是,我无法将其与LibSVM功能集成以执行功能选择。它与KnnClassify一起使用,请有人帮助我。这是KnnClassify的代码:
fun1 = @(XT,yT,Xt,yt)...
(sum((yt ~= knnclassify(Xt,XT,yT,5))));
[fs,history] = sequentialfs(fun1,data,label,'cv',c,'options',opts,'direction','forward');
答案 0 :(得分: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);
看起来不太好。
答案 1 :(得分:1)
我不知道这个问题是否仍然是开放的,但我使用以下句柄使该功能正常工作:
%输入的顺序很重要,因为svmpredict和svmtrain for 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)