Как случайно выбрать k точек из N точек в MATLAB? - PullRequest
10 голосов
/ 06 декабря 2009

Я использую этот код для создания и построения N точек:

N=input('No. of Nodes:');
data = rand(N,2) % Randomly generated n no. of nodes
x = data(:,1);
y = data(:,2);
plot(x,y,'*');

Как выбрать k баллов (с вероятностью p=0.25) из N баллов, затем раскрасить эти k баллы в красный и оставить остальные баллы как *.

Ответы [ 2 ]

27 голосов
/ 06 декабря 2009

Есть два подхода, которые вы можете использовать. Первое решение состоит в том, чтобы случайным образом выбрать k значения из N значений, что гарантирует, что у вас всегда выбрано k точек. Второе решение состоит в том, чтобы случайным образом выбирать значения, причем каждое из них имеет среднюю вероятность выбора p, что может привести к случайному выбору 0 или целых N.

  • Сбор k из N значений:

    Вы можете использовать функцию RANDPERM , чтобы создать случайную перестановку целых чисел от 1 до N, затем выбрать первые k значения в списке и перекрасить их в красный цвет:

    index = randperm(N);
    plot(x(index(1:k)),y(index(1:k)),'r*');
    
  • Выбор значений со средней вероятностью p:

    Вы можете использовать функцию RAND , чтобы выбрать случайное значение от 0 до 1 для каждого из ваших N значений, затем выберите значения со случайным значением, меньшим или равным ваша средняя вероятность p и выделите их красным:

    index = (rand(N,1) <= p);
    plot(x(index),y(index),'r*');
    
3 голосов
/ 07 декабря 2009

Из того, что я понял, для каждой из N случайных точек вы хотите перевернуть монетку, чтобы решить, выбрать ее или нет (где монета имеет p=0.25 вероятность успеха!)

data = rand(N,2);             %# generate random points
index = (rand(N,1) <= p);     %# roll coins to pick with prob p
data(~index, :) = [];         %# keep only selected points

Это в конечном итоге эквивалентно генерации p*N случайных точек в первую очередь (по крайней мере, вы приближаетесь к этому числу, когда N увеличивается) ...

data = rand(p*N, 2);          %# directly generate p*N number of points


Вы можете проверить это последнее утверждение для различных значений N:

fprintf('1st = %d \n', p*N)
fprintf('2nd = %d \n', sum(rand(N,1) <= p))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...