how to change a number randomly???...

1 view (last 30 days)
sani ars
sani ars on 30 Nov 2012
I have a column matrix that contains class labels in it. It has 35 rows... There are 4 class labels ( 1 2 3 4 )...
labels = [1 1 3 2 4 1 2 4 3 3 2 1 4 2 3 4 4 2 2 1 3 2 4 4 2 3 1 1 2 4 3 1 2 1 3] '
now I randomly select 5% of data from it as
N_of_labels= size(labels,1)
prcnt_labels = ceil(N_of_labels*5/100);
rng(1,'twister');
rand_class_index = randsample(N_of_labels,prcnt_labels);
labels(rand_class_index) = rem(labels(rand_class_index),4)+1;
the purpose of it to make the class labels noisy (changing the actual label).... Now here, rem() will always change the label 1 into 2 and 2 into 3 and so on... I need to change the labels randomly i.e. I want that 2 should be change to any number from 1 3 4 but not always to 3.... how can I do that???...

Accepted Answer

Jan
Jan on 30 Nov 2012
Edited: Jan on 30 Nov 2012
What about adding random values between 0 and 3 before REM:
rem(labels(rand_class_index) + randi([0, 3], prcnt_labels, 1), 4) + 1
If the label must be changed, use the range [1,3].
[EDITED after your comment]
randi([0,3]) replies number from 0 to 3. Then a value can be unchanged. If a change is obligatory, use the range [1,3] as mentioned already:
rem(labels(rand_class_index) + randi([1, 3], prcnt_labels, 1), 4) + 1
  2 Comments
sani ars
sani ars on 30 Nov 2012
I have tried it... just change it as:
rem(labels(rand_class_index) + randi([1,4], prcnt_labels, 1),4)+1
its working fine..... But at some places it is not changing the label e.g. if the label is 4 it still remain 4 as the randi () is randomly giving the number..
For this, I tried to match the actual labels (of selected indices) with the changed one as:
tr = zeros(size(rand_class_index,1),2);
tr = rem(labels(rand_class_index) + randi([1,4], prcnt_labels, 1),4)+1
labl_val = labels(rand_class_index)
for i = 1:size(rand_class_index,1)
if tr(i,1)== labl_val(i,1)
tr(i,1) = labl_val(i,1)+1;
end
end
labels(rand_class_index) = tr(:,1)
// I need to rewrite following line of code
tr(i,1) = labl_val(i,1)+1;
because using this line, if the label (labl_val) is 4 it will become 5 and I don't want 5.. I want that it should be change to any number from 1 2 3..
Just need to correct this line... Can someone plz tell about it??..
Jos (10584)
Jos (10584) on 30 Nov 2012
if tr(i,1) == 5, tr(i,1) = 1 ; end

Sign in to comment.

More Answers (1)

Matt Fig
Matt Fig on 30 Nov 2012
labels(randperm(numel(labels)))
  1 Comment
sani ars
sani ars on 30 Nov 2012
I just want to change the values of selected indexes, not the whole labels

Sign in to comment.

Tags

No tags entered yet.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!