使用MATLAB表的Sequentialfs

时间:2016-09-13 19:34:07

标签: matlab feature-selection matlab-table

我以前在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已转换为分类数组。第一个从来就不是一个表,而在第二个中,由于产生了第一个错误,我似乎被锁定了。

1 个答案:

答案 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调用不应该投诉,因为yX都是表格。