1

我想用 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');

4

2 回答 2

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);

这看起来不太好。

于 2012-05-06T11:49:56.393 回答
1

我不知道这个问题是否仍然存在,但我使用以下句柄使该功能正常工作:

% 输入的顺序很重要,因为 libsvm 的 svmpredict 和 svmtrain 将输入作为
% 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)
于 2014-04-16T11:56:33.987 回答