2013-02-24 2 views
2

Может ли кто-нибудь показать мне, что лучший способ - генерировать (numpy) массив значений с 0 до 100, которые взвешиваются (например) нормальной функцией распределения со средним значением 50 и дисперсией 5. Итак, что существует более 50 и менее (почти нет) нулей и сотен. Я думаю, что проблема не должна быть трудной для решения, но я как-то застрял ...python, weighted linspace

Я думал о чем-то с np.linspace, но кажется, что нет весового варианта.

Итак, просто для того, чтобы быть ясным: у меня нет простого нормального распределения от 0 до 100, но что-то вроде массива от 0 до 100 с более высокой плотностью значений в середине.

Благодаря

+1

Вы пробовали 'numpy.random.normal (50, 5, size = 10)'? – jfs

+0

да, у меня есть; но это не совсем то, что я ищу, поскольку мне не нравится случайная часть в нем. Я бы предпочел что-то нормально распределенное (почти), так как я имею дело с не такими большими показателями выборки – wa4557

ответ

1

Важно понимать, что ваша проблема не точно разрешима, так как в целом конечный дискретный образец не может точно воспроизвести ваше распределение.

Вы можете легко увидеть это, задавая тривиальные версии вашего вопроса, как набор из 3 значений в [0,1] с равным распределением. Здесь результаты [0,0,1] и [0,1,1] были бы разумными.

Тем не менее, вы можете решить эту проблему примерно. Если вы запрашиваете массив с count элементами, выполненными из [0,1,...,N], где данные вероятностей p=[p0,p1,...,pN] и нормализуются (p0+...+pN==1), то графом c_k элемента k в вашем результирующем массиве теоретически

c[k] = p[k]*count 

но эти счетчики сейчас поплавки , Вы должны решить, как «обвести» их, сохранив их общую сумму. Это свобода выбора, связанная с неопределенностью вашего вопроса.

+0

классный, хороший ответ – wa4557

1

Вы можете использовать распределение STATs SciPy по:

import numpy as np 
from scipy import stats 

# your distribution: 
distribution = stats.norm(loc=50, scale=5) 

# percentile point, the range for the inverse cumulative distribution function: 
bounds_for_range = distribution.cdf([0, 100]) 

# Linspace for the inverse cdf: 
pp = np.linspace(*bounds_for_range, num=1000) 

x = distribution.ppf(pp) 

# And just to check that it makes sense you can try: 
from matplotlib import pyplot as plt 
plt.hist(x) 
plt.show() 

Конечно, я признаю начало и конечная точка не совсем точно, как это связано с численным неточностей при переходе туда и обратно.

0
>>> sorted([int(random.gauss(50,5)) for i in range(100)]) 
[33, 40, 40, 40, 40, 40, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 57, 57, 57, 57, 58, 61] 
Смежные вопросы