我正在为多类分类器( 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的所有内容来实现我想要的。
但这个解决方案似乎很愚蠢。有没有更直接的方式让我失踪?
答案 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