使用 MATLAB 表的 Sequentialfs

Sequentialfs using MATLAB Tables

我以前只使用大型矩阵作为 MATLAB 中 sequentialfs 函数的参数。我有一个新升级的 MATLAB,其中包含 Table 数据类型——非常方便。我试图重新编写一个脚本,该脚本使用 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

产生的第一个错误是

Error using statslib.internal.grp2idx (line 44) You cannot subscript a table using only one subscript. Table subscripting >requires both row and variable subscripts.

Error in grp2idx (line 28) [varargout{1:nargout}] = statslib.internal.grp2idx(s);

Error in cvpartition (line 164) cv.Group = grp2idx(N);

Error in script (line 32) c = cvpartition(group,'k',10);

如果我将 classlab 转换为分类数组,此错误就会消失,但随后在 sequentialfs 调用时会产生第二个错误:

Error using sequentialfs (line 345) All input arguments must be tables.

所以我的问题基本上是,如何在顺序特征选择过程中利用 tables?特别是,第一个错误让我感到困惑,因为我给它提供了一个具有指定索引的 table 。对于第二个错误,cvpartition returns cvpartition 对象和 y 已转换为分类数组。第一个从来都不是 table,而在第二个中,由于生成的第一个错误,我似乎被锁定了。

table returns table 的子集上使用 () 索引,但它 仍然是 table,因此如果您尝试将其传递给需要数字数组的函数,将会导致错误。

如果您只是想要 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

因此回顾您的具体示例,您可能希望将 array(而不是 table)传递给 cvpartition 以防止第一个错误

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

对于 sequentialfs 的调用,您没有向我们展示 X 是什么,但我认为它是 table。如果您修复了第一个错误,sequentialfs 调用就不会报错,因为 yX 都是 tables.