Matlab特征选择

4

我正在尝试从一个 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大小的数组。Predict将为我提供对于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)

我哪里做错了?


xtest 有 299 列吗? - Ander Biguri
是的,它是一个1*299行向量。 - Apurv
6
建议您添加一个 [mcve],否则我们无法测试。[mcve] 是指最小可重现代码,它应该包含足够的信息来让其他人能够理解并重现您的问题。 - Ander Biguri
1个回答

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

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

来源:MathWorks


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接