我试图通过从 300*299 训练矩阵中随机抽取一行作为我的测试数据并对其应用 sequentialfs 来学习相关特征。我使用了以下代码:

>> Md1=fitcdiscr(xtrain,ytrain);
>> func = @(xtrain, ytrain, xtest, ytest) sum(ytest ~= predict(Md1,xtest));
>> learnt = sequentialfs(func,xtrain,ytrain)
xtrainytrain 分别是 299*299299*1。预测会给我 xtest 的预测标签(这是原始 xtrain 中的一些随机行)。

但是,当我运行代码时,出现以下错误:
Error using crossval>evalFun (line 480)
The function '@(xtrain,ytrain,xtest,ytest)sum(ytest~=predict(Md1,xtest))' generated the following error:
X must have 299 columns.

Error in crossval>getFuncVal (line 497)
funResult = evalFun(funorStr,arg(:));

Error in crossval (line 343)
    funResult = getFuncVal(1, nData, cvp, data, funorStr, []);

Error in sequentialfs>callfun (line 485)
    funResult = crossval(fun,x,other_data{:},...

Error in sequentialfs (line 353)
                crit(k) = callfun(fun,x,other_data,cv,mcreps,ParOptions);

Error in new (line 13)
    learnt = sequentialfs(func,xtrain,ytrain)

我哪里做错了?

最佳答案

您应该在 func 内部构建分类器,而不是之前。sequentialfs 每次在不同的集合上调用该函数,并且必须专门为每个集合构建一个分类器,仅使用为该迭代选择的特征 sequentialfs

我不确定我是否清楚,实际上您应该将代码的第一行移动到 func 的主体内

资料来源:MathWorks

10-08 08:43