2012-03-25 3 views
2

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

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

EDIT: Если четыре момента не достаточно, чтобы определить распределение достаточно хорошо, есть ли другой способ сделать значение, которые состоят с эмпирическим распределением, которое выглядит следующим образом: http://i.imgur.com/3yB2Y.png

ответ

1

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

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

В основном, это линейная интерполяция в эмпирическом ВПРЕ, чтобы получить случайных случайные величины.

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

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

1

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

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

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

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

0

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

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 
Смежные вопросы