我以前在MATLAB中的sequentialfs
函数中只使用大矩阵作为参数。我有一个新升级的MATLAB,它包含Table
数据类型 - 非常方便。我试图重做一个脚本,该脚本利用表集执行顺序特征选择,但遇到了麻烦。
normfmat = ngmft(:,4:end-1); % ngmft is previously loaded data table
y = gmft(:,2); % categorical variable with two classes
c = cvpartition(y,'k',10); % first error produced here
fun = @(trainData,trainClass,testData,testClass)...
(sum(~strcmp(testClass,predict(ClassificationKNN.fit(trainData,trainClass,'NumNeighbors',1),testData))));
[fs,history] = sequentialfs(fun,X,y,'cv',c) % second error here
产生的第一个错误是
使用statslib.internal.grp2idx时出错(第44行) 您不能仅使用一个下标来下标表。表下标>需要行和变量下标。
grp2idx出错(第28行) [varargout {1:nargout}] = statslib.internal.grp2idx(s);
cvpartition出错(第164行) cv.Group = grp2idx(N);
脚本错误(第32行) c = cvpartition(group,' k',10);
如果我将classlab
转换为分类数组,则此错误消失,但在sequentialfs
调用时产生第二个错误:
使用sequentialfs时出错(第345行) 所有输入参数都必须是表。
所以我的问题是,基本上,如何利用顺序特征选择过程中的表格?特别是,第一个错误让我感到困惑,因为我正在为它提供一个具有指定索引的表。对于第二个错误,cvpartition
返回一个cvpartition对象,y
已转换为分类数组。第一个从来就不是一个表,而在第二个中,由于产生了第一个错误,我似乎被锁定了。
答案 0 :(得分:1)
在()
上使用table
索引会返回该表的一个子集,但它仍然一个表,因此如果您尝试将导致错误将它传递给期望数组的函数。
如果您只是想从表中获取值,那么您将要使用{}
索引。
t = table([1 2 3].', [4 5 6].');
% Var1 Var2
% ____ ____
%
% 1 4
% 2 5
% 3 6
class(t(1,:))
% table
disp(t(1,:))
% Var1 Var2
% ____ ____
%
% 1 4
class(t{1,:})
% double
disp(t{1,:})
% 1 4
More information on access data within a table
回顾一下您的具体示例,您可能希望将数组(而不是表格)传递给cvpartition
以防止第一个错误
c = cvpartition(gmft{:,2});
对于sequentialfs
的来电,您还没有告诉我们X
是什么,但我认为它是一张桌子。如果您修复了第一个错误,则sequentialfs
调用不应该投诉,因为y
和X
都是表格。