случайная величина из асимметричного распределения со scipy - PullRequest
3 голосов
/ 25 марта 2012

пытается извлечь случайное число из дистрибутива в SciPy, так же, как вы делаете это с stats.norm.rvs. Тем не менее, я пытаюсь взять число из эмпирического дистрибутива, который у меня есть - это искаженный набор данных, и я хочу включить перекос и эксцесс в дистрибутив, из которого я рисую. В идеале я хотел бы просто вызвать stats.norm.rvs (loc = blah, scale = blah, size = blah), а затем установить наклон и курт в дополнение к среднему значению и дисперсии. Функция нормы принимает аргумент «моменты», состоящий из некоторого расположения «mvsk», где s и k означают перекос и эксцесс, но, очевидно, все, что нужно, это попросить, чтобы s и k были вычислены из rv, тогда как я хочу для начала установите s и k как параметры распределения.

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

РЕДАКТИРОВАТЬ: Если четырех моментов недостаточно для достаточно точного определения распределения, есть ли другой способ нарисовать значения, состоящие из эмпирического распределения, которое выглядит следующим образом: http://i.imgur.com/3yB2Y.png

Ответы [ 4 ]

1 голос
/ 25 марта 2012

Нормальное распределение имеет только 2 параметра, среднее значение и дисперсию.Существуют расширения нормального распределения, которые имеют 4 параметра, с дополнительным перекосом и эксцессом.Одним из примеров может быть расширение Gram-Charlier, но, насколько я помню, в scipy доступен только pdf, а не rvs.

В качестве альтернативы в scipy.stats есть распределения, которые имеют 4 параметра, такие как johnsonsu, которыегибкий, но с другой параметризацией.

Однако в вашем примере распределение для значений больше нуля, поэтому приблизительно нормальное распределение не будет работать очень хорошо.Как предположил Эндрю, я думаю, вам следует просмотреть распределения в scipy.stats, которые имеют нижнюю границу нуля, например гамму, и вы можете найти что-то близкое.

Другая альтернатива, если ваша выборка достаточно велика, будет использовать gaussian_kde, который также может создавать случайные числа.Но gaussian_kde также не предназначен для распространения с конечной границей.

1 голос
/ 03 июля 2012

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

  • Сортировать данные.
  • Предварительно отложите данные до 0.
  • Пусть N обозначает длину этого массива data_array
  • Вычисляет q = scipy.rand () * N
  • idx= INT (кв);di = q-idx
  • xlo = data_array [idx], xhi = data_array [idx + 1];
  • return xlo + (xhi-xlo) * di

По сути, это линейная интерполяция в эмпирическом CDF для получения случайных величин.

Двумя потенциальными проблемами являются: (1) если ваш набор данных мал, вы не можете хорошо представить распределение, и (2)вы не сгенерируете значение, большее, чем самое большое в вашем существующем наборе данных.

Чтобы выйти за их пределы, вам нужно взглянуть на параметрические распределения, такие как гамма-распределение, упомянутое выше.

0 голосов
/ 09 сентября 2014

краткий ответ замените другим распределением, если необходимо:

n = 100
a_b = [rand() for i in range(n)]
a_b.sort()
# len(a_b[:int(n*.8)])
c = a_b[int(n*.8)]
print c
0 голосов
/ 25 марта 2012

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

Scipy содержит код специально для гамма-распределений - http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma

...