2011-11-08 16 views
6

Tôi có một y có kích thước 5000,1 (ma trận), có chứa số nguyên từ 1 đến 10. Tôi muốn mở rộng các chỉ mục đó thành véc tơ 1-of-10. I.e., y chứa 1,2,3 ... và tôi muốn nó "mở rộng" thành:Matlab/Octave đại diện 1-of-K

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 

Cách tốt nhất để làm điều đó là gì?

tôi đã cố gắng:

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

nhưng nó đã không làm việc.

Nó hoạt động cho vectơ mặc dù:

nếu y = [2 5 7], và Y = zeros(1,10), sau đó Y(y) = [0 1 0 0 1 0 1 0 0 0].

+0

thể trùng lặp của [Tạo Chỉ Matrix] (http://stackoverflow.com/questions/6150174/creating-indicator-matrix) – Amro

Trả lời

6
n=5 
Y = ceil(10*rand(n,1)) 
Yexp = zeros(n,10); 
Yexp(sub2ind(size(Yexp),1:n,Y')) = 1 

Ngoài ra, hãy xem xét sử dụng thưa thớt như trong: Creating Indicator Matrix.

+0

Are có e tương đối công bằng/demerits để bsxfun v. sub2ind? – Frank

+0

@Frank: đây là chỉ số dựa trên, tôi liên quan đến việc so sánh bình đẳng ... Sẽ rất thú vị để xem cách họ so sánh về hiệu suất – Amro

+0

Tôi đã kiểm tra hiệu suất. Dung dịch sub2ind hơi nhanh hơn giải pháp bsxfun. – cyborg

-2

Tôi nghĩ bạn có nghĩa là:

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

Sau khi câu hỏi chỉnh sửa, nó phải được điều này thay vì:

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

Điều này sẽ đặt toàn bộ cột y thành 1. – cyborg

+0

Tôi muốn tránh viết vòng lặp, đó là giải pháp rõ ràng nhất :-) Câu hỏi – Frank

+0

không rõ ràng cho đến khi Amro chỉnh sửa :), hãy chắc chắn chấp nhận người khác answer – Smash

6

xem xét như sau:

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 

Ví dụ:

>> 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 
+0

Đó là những gì tôi đang tìm kiếm, tặng hoặc chuyển đổi :-) Cảm ơn! – Frank

+0

@Frank: Tôi cũng tin rằng Hộp công cụ thống kê có hàm tương tự [DUMMYVAR] (http://www.mathworks.com/help/toolbox/stats/dummyvar.html) – Amro

2

Trong khi thưa thớt có thể nhanh hơn và tiết kiệm bộ nhớ, câu trả lời liên quan đến mắt() sẽ thanh lịch hơn vì nó nhanh hơn vòng lặp và được giới thiệu trong bài giảng octave của lớp đó

Đây là ví dụ cho 1 đến 4

V = [3;2;1;4]; 
I = eye(4); 
Vk = I(V, :); 
+0

Điều gì làm việc cho tôi là mắt (K) (V, :) tương tự như của bạn nhưng ngưng tụ dòng 2 và 3 thành một dòng. Mặc dù vậy, K là số lượng các lớp có thể, không thực sự trình bày các lớp, vì vậy ví dụ nếu có 10 kết quả có thể có trong đó có 4 kết quả thực sự, nó sẽ hoạt động chính xác và đáng tin cậy hơn. –

0

Bạn có thể thử các hoạt động 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);