2016-03-14 2 views
1

Я хотел бы реализовать рандомизированный алгоритм округления в Python.Это правильный способ получить рандомизированное решение округления?

Алгоритм довольно прост в описании.

Для вектора x, размера n, где каждый элемент x [i], представляет собой действительное число между 0 и 1. Создайте вектор 0-1, y, размера n, где каждый элемент y, y [i], является либо 0, либо 1 следующим образом:

для i = 1 до len (x): установите y [i] = 1 с вероятностью x [i] и y [i] = 0 с вероятностью 1 - x [i].

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

import numpy 
n = 4 
x = [0.01, 0.6, 0.1, 0.7] 
y = numpy.zeros(n) 
for i in range(n): 
    randomNum = numpy.random.uniform() 
    if randomNum >= x[i]: 
     y[i] = 1 
    else: 
     y[i] = 0 

ответ

3

Как об этом:

x = np.array([0.1, 0.3,0.5, 0.7, 0.9]) 
y = np.random.rand(len(x)) <= x 

Первые наборы строк вверх, вторая строка выбирает вероятности равномерно случайным образом и бинаризует результат в соответствии с вероятностью/порогом в x [i].

0

FWIW, вот как реализовать этот алгоритм в основном Python:

from random import random 

x = [0.01, 0.6, 0.1, 0.7] 
y = [int(random() < u) for u in x] 

Но я подозреваю, что решение Numpy будет несколько быстрее, особенно когда x велико. :)

Смежные вопросы