Представление Matlab / Octave 1-of-K - PullRequest
6 голосов
/ 08 ноября 2011

У меня есть размер 5000,1 (матрица), который содержит целые числа от 1 до 10. Я хочу расширить эти индексы в вектор 1 из 10. Т.е. у содержит 1,2,3 ... и я хочу, чтобы он "расширился" до:

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

Каков наилучший способ сделать это?

Я пытался:

Y = zeros(5000,10); Y(y) = 1; 

но это не сработало.

Это работает для векторов, хотя:

, если y = [2 5 7] и Y = zeros(1,10), то Y(y) = [0 1 0 0 1 0 1 0 0 0].

Ответы [ 5 ]

7 голосов
/ 08 ноября 2011

Рассмотрим следующее:

y = randi([1 10],[5 1]);       %# vector of 5 numbers in the range [1,10]
yy = bsxfun(@eq, y, 1:10)';    %# 1-of-10 encoding

Пример:

>> y'
ans =
     8     8     4     7     2
>> yy
yy =
     0     0     0     0     0
     0     0     0     0     1
     0     0     0     0     0
     0     0     1     0     0
     0     0     0     0     0
     0     0     0     0     0
     0     0     0     1     0
     1     1     0     0     0
     0     0     0     0     0
     0     0     0     0     0
6 голосов
/ 08 ноября 2011
n=5
Y = ceil(10*rand(n,1))
Yexp = zeros(n,10);
Yexp(sub2ind(size(Yexp),1:n,Y')) = 1

Также рассмотрите возможность использования разреженных, как в: Создание матрицы индикатора .

3 голосов
/ 26 марта 2012

Хотя sparse может быть быстрее и экономить память, ответ с использованием eye () будет более элегантным, поскольку он быстрее, чем цикл, и он был представлен во время октавной лекции этого класса

Вот примерот 1 до 4

V = [3;2;1;4];
I = eye(4);
Vk = I(V, :);
0 голосов
/ 29 мая 2017

Вы можете попробовать операции cellfun:

function vector = onehot(vector,decimal)
    vector(decimal)=1;
end
aa=zeros(10,2);
dec=[5,6];
%split into columns
C=num2cell(aa,1);
D=num2cell(dec,1);
onehotmat=cellfun("onehot",C,D,"UniformOutput",false);
output=cell2mat(onehotmat);
0 голосов
/ 08 ноября 2011

Я думаю, что вы имеете в виду:

y = [2 5 7];
Y = zeros(5000,10);
Y(:,y) = 1;

После редактирования вопроса это должно быть вместо:

y = [2,5,7,9,1,4,5,7,8,9....]; //(size (1,5000))
for i = 1:5000
    Y(i,y(i)) = 1;
end
...