如何 Y = eye(K)(y, :);替换 "for" 循环? Coursera 课程
How does Y = eye(K)(y, :); replace a "for" loop? Coursera
正在处理 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
我不知道怎么做。我在谷歌搜索此信息时也遇到了一些困难。
谢谢!
第一组代码是Octave,它有一些MATLAB没有的附加索引功能。第二组代码是如何在 MATLAB 中执行操作。
在这两种情况下,Y
都是通过重新排列单位矩阵的行生成的矩阵。在这两种情况下,也可以为合适的线性变换矩阵 T
.
计算 Y = T*y
(上面假设 y
是一个整数向量,用作行的索引变量。如果不是这种情况,那么代码很可能会引发错误。)
在这种情况下,您的变量 y
必须是包含 1 到 num_labels
范围内整数的 m
元素向量。代码的目标是创建一个 Y
矩阵 m
-by-num_labels
,其中每一行 k
将包含除列 [=] 中的 1 之外的所有零19=].
生成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 允许您索引函数 return 参数而无需先将它们放入变量中,但 MATLAB 不会 (at least, not very easily)。因此,语法:
Y = eye(num_labels)(y, :);
仅适用于 Octave。在 MATLAB 中,您必须按照我上面的示例进行操作,或者使用其他选项之一 here.
正在处理 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
我不知道怎么做。我在谷歌搜索此信息时也遇到了一些困难。
谢谢!
第一组代码是Octave,它有一些MATLAB没有的附加索引功能。第二组代码是如何在 MATLAB 中执行操作。
在这两种情况下,Y
都是通过重新排列单位矩阵的行生成的矩阵。在这两种情况下,也可以为合适的线性变换矩阵 T
.
Y = T*y
(上面假设 y
是一个整数向量,用作行的索引变量。如果不是这种情况,那么代码很可能会引发错误。)
在这种情况下,您的变量 y
必须是包含 1 到 num_labels
范围内整数的 m
元素向量。代码的目标是创建一个 Y
矩阵 m
-by-num_labels
,其中每一行 k
将包含除列 [=] 中的 1 之外的所有零19=].
生成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 允许您索引函数 return 参数而无需先将它们放入变量中,但 MATLAB 不会 (at least, not very easily)。因此,语法:
Y = eye(num_labels)(y, :);
仅适用于 Octave。在 MATLAB 中,您必须按照我上面的示例进行操作,或者使用其他选项之一 here.