从Coursera机器学习开始分配任务.我很好奇这是如何工作的...从一个例子来看,这个更简单的代码:
% K is the number of classes. K = num_labels; Y = eye(K)(y, :);
似乎是以下的替代品:
I = eye(num_labels); Y = zeros(m, num_labels); for i=1:m Y(i, :)= I(y(i), :); end
而且我不知道怎么做.我也有一些困难谷歌搜索这个信息.
谢谢!
y
在这种情况下,您的变量必须是m
包含1到1范围内的整数的元素向量num_labels
.代码的目标是创建一个矩阵Y
是m
-by- num_labels
其中每行k
包含除了在列1全部为零y(k)
.
生成的方法Y
是首先使用该函数创建单位矩阵eye
.这是除了主对角线以外的所有零的方阵.k
因此,单位矩阵的行在列中将具有一个非零元素k
.因此,我们可以Y
使用y
作为行索引从单位矩阵索引的行构建矩阵.我们可以使用for循环(如在第二个代码示例中)执行此操作,但这并不像使用单个索引操作那样简单有效(如在第一个代码示例中).
让我们看一个例子(在MATLAB中):
>> num_labels = 5; >> y = [2 3 3 1 5 4 4 4]; % The columns where the ones will be for each row >> I = eye(num_labels) I = 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 >> Y = I(y, :) Y = % 1 in column ... 0 1 0 0 0 % 2 0 0 1 0 0 % 3 0 0 1 0 0 % 3 1 0 0 0 0 % 1 0 0 0 0 1 % 5 0 0 0 1 0 % 4 0 0 0 1 0 % 4 0 0 0 1 0 % 4
注意: Octave允许您索引函数返回参数,而无需先将它们放在变量中,但MATLAB不会(至少不是很容易).因此,语法:
Y = eye(num_labels)(y, :);
仅适用于Octave.在MATLAB中,您必须按照上面的示例执行此操作,或者在此处使用其他选项之一.