使用 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
调用就不会报错,因为 y
和 X
都是 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
调用就不会报错,因为 y
和 X
都是 tables.