从标签生成矢量矩阵,用于多类分类(矢量化)

时间:2014-08-03 21:20:29

标签: matlab matrix vector octave linear-algebra

我正在为多类分类器( m 数据点, k 类)构建输入。在我的输入中,我将训练数据的标签作为向量 y 中的整数(即 y m 维度,并且每个条目都在< strong> y 是1到 k 之间的整数。

我想将其转换为 m x k 矩阵。每个行在索引处对应于该数据点的标签为1,否则为0(例如,如果数据点具有标签3,则该行看起来像[0 0 1 0 0 0 0 ...])。

我可以通过构造一个向量 a = [1 2 3 4 ... k]然后计算

来做到这一点
M_ = y*(1./b)
M = M_ .== 1

(其中./是元素划分,.==是元素逻辑等于)。这通过设置中间矩阵中不完全是1到0的所有内容来实现我想要的。

但这个解决方案似乎很愚蠢。有没有更直接的方式让我失踪?

3 个答案:

答案 0 :(得分:9)

您可以使用逻辑阵列:

M = [1:k] == y;

答案 1 :(得分:4)

给定标签向量y,例如[1 2 2 1 3 2 3 1]和多个类k,例如3,您可以将其转换为标签矩阵Y如下。

function Y = labelmatrix(y, k)
  m = length(y);
  Y = repmat(y(:),1,k) .== repmat(1:k,m,1);

我们的想法是执行以下扩展:

1 1 1     1 2 3
2 2 2     1 2 3
2 2 2     1 2 3
1 1 1 .== 1 2 3
3 3 3     1 2 3
2 2 2     1 2 3
3 3 3     1 2 3
1 1 1     1 2 3

这会产生:

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

答案 2 :(得分:2)

或者只是通过编制索引:

%// Dummy code to generate some input data
y = [1 4 3 7 2 1];
m = length(y);
k = max(y);

%// Actual conversion using y elements as index 
M = zeros(m, k);
M(sub2ind(size(M), [1:m], y)) = 1

%// Result
M =
1   0   0   0   0   0   0
0   0   0   1   0   0   0
0   0   1   0   0   0   0
0   0   0   0   0   0   1
0   1   0   0   0   0   0
1   0   0   0   0   0   0