2016-07-14 5 views
2

Предположим, что у меня нормальное распределение, и я хочу отбирать у него 1000 раз, и если значение находится в верхнем 20 процентиле, я хочу добавить 1 к счетчику. Какое оптимальное решение для этого?Случайная выборка из распределения вероятности определенное количество раз

Я пытаюсь решить это с помощью numpy и не могу понять математику за ней. Сейчас у меня есть это, но я чувствую, что это может быть сделано математически:

import numpy as np 
s = np.random.normal(0, 1, 1000) 
sum([val for val in s if val > np.percentile(s, 80)]) 
+0

Теоретический 20-й процентиль или экспериментальный? – MBo

+0

Где у вас проблемы с конкретным? У вас есть код для показа? Это скорее задача, чем вопрос, как сейчас. – sytech

ответ

1

Это сгенерированный массив (вы можете играть со средним и стандартным отклонением, они те, по умолчанию):

mu = 0 
std = 1 
arr = np.random.normal(mu, std, 1000) 

Это дает вам количество элементов в верхнем 20 процентиле:

arr[arr > np.percentile(arr, 80)].size 
Out[30]: 200 

Редактировать: Ваш код также хорош. Но вы не хотите суммировать значения, вы хотите их подсчитать. Таким образом, всякий раз, когда val > np.percentile(s, 80) вы хотите просуммировать 1-х:

sum([1 for val in s if val > np.percentile(s, 80)]) 
Out[35]: 200 

Это будет медленнее, чем методы Numpy все же.

+0

FYI: Вы можете заменить 'arr = mu + std * np.random.randn (1000)' на 'arr = np.random.normal (mu, std, 1000)'. –

+0

@WarrenWeckesser Это лучше. Спасибо. – ayhan

1

Если у вас есть нормальное распределение, я полагаю, вы знаете mu и sigma, в противном случае этот вопрос требует дополнительной последующей обработки. У вас будет определенный Z=(X-mu)/sigma для каждого элемента, который вы вынимаете. Ваш 20-й процентиль будет любым X, который составляет Z>0.842.

Вы можете сделать что-то вроде:

if Z_val(x, mu, sigma) > 0.842: counter+=1 
Смежные вопросы