Matlab One Hot Encoding - 将带有分类的列转换为多列逻辑

时间:2017-12-06 03:48:27

标签: arrays matlab statistics data-analysis

CONTEXT

我有大量带有分类的列,所有列都有不同的,不可思议的选择。为了让我的生活更容易进行分析,我想把它们中的每一个都转换成带有逻辑的几列。例如:

1   GENRE
2   Pop
3   Classical
4   Jazz

......会变成......

1   Pop Classical Jazz
2   1       0      0
3   0       1      0
4   0       0      1

问题

我尝试过使用ind2vec,但这仅适用于数字或逻辑。我也遇到this,但我不确定它是否适用于分类。在这种情况下使用什么是正确的功能?

2 个答案:

答案 0 :(得分:3)

如果您想要从categorical向量转换为logical array,可以使用unique函数生成列索引,然后使用any of the options from this related question执行编码:

% Sample data:
data = categorical({'Pop'; 'Classical'; 'Jazz'; 'Pop'; 'Pop'; 'Jazz'});

% Get unique categories and create indices:
[genre, ~, index] = unique(data)

genre = 

     Classical 
     Jazz 
     Pop 


index =

     3
     1
     2
     3
     3
     2

% Create logical matrix:
mat = logical(accumarray([(1:numel(index)).' index], 1))

mat =

  6×3 logical array

   0   0   1
   1   0   0
   0   1   0
   0   0   1
   0   0   1
   0   1   0

答案 1 :(得分:1)

ind2vec可以处理单元格字符串,您可以调用cellstr函数来获取这样的单元格字符串

此代码可能会有所帮助(来自this,我只改变了一点)

data = categorical({'Pop'; 'Classical'; 'Jazz';});
GENRE = cellstr(data); %change categorical data into cell strings
[~, loc] = ismember(GENRE, unique(GENRE));
genre = ind2vec(loc')';
Gen=full(genre);
array2table(Gen, 'VariableNames', unique(GENRE))

运行这样的代码将返回此:

ans =

Classical    Jazz    Pop
_________    ____    ___

0            0       1  
1            0       0  
0            1       0  

您可以调用 unique(GENRE)来检查类别(在单元格字符串中)。同时,逻辑(Gen)(或调用逻辑(完整(流派)))包含您需要的逻辑列。

P.S。分类结构可能比单元格字符串更快,但ind2vec函数不能使用它。 unique accumarray 可能会更好。