2016-09-13 31 views
0

我之前在MATLAB中使用sequentialfs函數之前只使用大型矩陣作爲參數。我有一個新升級的MATLAB,其中包含Table數據類型 - 非常方便。我試圖重寫一個腳本,該腳本使用表設置來執行順序特徵選擇,但遇到了麻煩。使用MATLAB的Sequentialfs表

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 

產生的第一誤差是(線44)

錯誤使用statslib.internal.grp2idx 可以僅使用一個下標不標a表。表下標>需要行和變量下標。

grp2idx錯誤(第28行) [varargout {1:nargout}] = statslib.internal.grp2idx(s); (行164) cv.Group = grp2idx(N);

腳本錯誤(第32行) c = cvpartition(group,'k',10);

此錯誤消失,如果我轉換classlab到一個分類數組,但是然後在sequentialfs呼叫被產生的第二誤差:

使用錯誤sequentialfs(線345) 所有輸入參數必須是桌子。

所以我的問題是,基本上,如何利用順序特徵選擇過程的表?特別是,第一個錯誤讓我困惑,因爲我給它提供了一個指定索引的表格。對於第二個錯誤,cvpartition返回cvpartition對象,y已轉換爲分類數組。第一個從來沒有一個表,第二個我似乎因爲第一個錯誤而被鎖定。

回答

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都是表格。

+0

奇怪的是,我仍然得到第二個錯誤。它不會在我的代碼中接受x和y作爲表格。但是,您非常清楚地排列了我對第一個錯誤做錯了什麼,並且對sequentialfs調用的相同方法(輸出數組)也可以解決另一個問題。使用順序fs輸出回溯到原始表格以便按名稱識別特徵是很簡單的。如果你有什麼想法,可能會導致順序組件抱怨(x和y都是表),我全都是耳朵,但否則我認爲這基本上解決了。 – Rstallard