0

我以前只使用大型矩阵作为sequentialfsMATLAB 函数中的参数。我有一个新升级的 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

使用 sequencefs 时出错(第 345 行)所有输入参数必须是表。

所以我的问题是,本质上,如何在顺序特征选择过程中使用表格?特别是,第一个错误让我感到困惑,因为我给它提供了一个带有指定索引的表。对于第二个错误,cvpartition返回一个 cvpartition 对象并y已转换为分类数组。第一个从来不是一张桌子,而在第二个中,由于第一个错误生成,我似乎被锁定了。

4

1 回答 1

1

在 a 上使用()索引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

有关访问表中数据的更多信息

因此,回顾您的具体示例,您可能希望传递一个数组(而不是表)cvpartition来防止第一个错误

c = cvpartition(gmft{:,2});

对于对 的调用sequentialfs,您没有向我们展示X是什么,但我认为它是一张桌子。如果您修复了第一个错误,则sequentialfs调用不应抱怨,因为两者y都是X表格。

于 2016-09-13T21:03:00.670 回答