Как извлечь из двух разных гауссианов условно по некоторому распределению Бернулли? - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть два гауссовых распределения (я использую multivariate_normal), и я хотел бы извлечь из них с вероятностью p для первого гауссова и 1-p для другого.Я хотел бы сделать n розыгрыши.

Возможно ли это сделать без цикла for?(в целях эффективности)

Спасибо

1 Ответ

0 голосов
/ 27 декабря 2018

Да, эту операцию можно выполнять без цикла.Попробуйте:

import numpy as np
from scipy import stats

sample_size = 100
p = 0.25

# Flip a coin with P(HEADS) = p to determine which distribution to draw from
indicators = stats.bernoulli.rvs(p, size=sample_size)

# Draw from N(0, 1) w/ probability p and N(-1, 1) w/ probability (1-p)
draws = (indicators == 1) * np.random.normal(0, 1, size=sample_size) + \
    (indicators == 0) * np.random.normal(-1, 1, size=sample_size)

Вы можете сделать то же самое, используя np.vectorize ( caveat emptor ) :

def draw(x):
  if x == 0:
     return np.random.normal(-1, 1)
  elif x == 1:
     return np.random.normal(0, 1)

draw_vec = np.vectorize(draw)    
draws = draw_vec(indicators)

Если вам нужно расширить решение на смесь из более чем двух распределений, вы можете использовать np.random.multinomial, чтобы назначить выборки для распределений и добавить дополнительные случаи в if/else в draw.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...