2012-06-14 2 views
2

Если у меня есть данные (дневной график акций - хороший пример, но это может быть что угодно), в котором я знаю только диапазон (высокий - низкий), который продается внутри X единиц, но я не знаю точной цены, данный предмет продан. Предположим для простоты, что ценовой диапазон содержит достаточное количество ведер (например, сорок один процентный шаг в радиусе 40 центов), чтобы сделать такое распределение практичным. Как я могу распределить эти элементы, чтобы сформировать нормальную кривую звонка, хранящуюся в векторе? Он не должен быть совершенным, но реалистичным.Как создать вектор, содержащий (искусственно созданный) гуасовый (нормальный) дистрибутив?

Мое (очень) наивное мышление предполагало, что, поскольку случайные числа должны формировать нормальное распределение, я могу сделать что-то вроде бинарного RNG. Если, например, есть сорок ведер, тогда, если «0» появляется в 40 раз, то 0-е ведро увеличивается, а если «1» появляется за раз в строке, то 39-й ведро увеличивается. Если «1» появляется 20 раз, то он находится в середине вектора. Сделайте это для каждого элемента до тех пор, пока не будут учтены единицы X. Это может быть или не быть правильным и в любом случае кажется более неэффективным, чем необходимо. Я ищу что-то более разумное.

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

Я хочу написать это на C++, поэтому предварительно упакованные решения в R или Matlab или что-то не слишком полезно для меня.

Спасибо. Надеюсь, это имело смысл.

+0

«Мое (очень) наивное мышление предполагало, что, поскольку случайные числа должны формировать нормальное распределение» - это действительно не так. Однако вы можете использовать алгоритмы для генерации значений из нормального распределения (действительно, из многих статистических распределений). – mathematician1975

+1

Возможно ли, что то, что вы пытаетесь сделать, это создать гистограмму распределения Гаусса с частотными отсчетами для каждого буфера, сохраненного в качестве элементов вектора? – mathematician1975

+1

Почему бы не использовать библиотеку генераторов случайных генераторов Boost? Или новая библиотека C++ 11? – templatetypedef

ответ

8

Большинство литературы, по-видимому, посвящено анализу распределения после того, как оно уже существует, но не так много о том, как его искусственно создать.

Есть тонны литературы о том, как ее создать. Преобразование Box-Muller, полярный метод Марсалья (вариант Box-Muller) и алгоритм Зиггурата - три. (Google эти условия). Оба метода Box-Muller просты в реализации.

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

+0

Оставьте его для Boost! После быстрых взглядов кажется, что он будет делать то, что мне нужно. Большое спасибо! –

3

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

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

Пусть F: R -> [0: 1] - кумулятивная функция нормального распределения, invF - ее обратная, а x - случайная величина, равномерно распределенная на [0: 1], тогда invF (x) будет нормально распределенная случайная величина.

Все, что вам нужно реализовать, это возможность вычислить invF (x). К сожалению, эта функция не может быть выражена элементарными функциями. На самом деле это решение нелинейного дифференциального уравнения. Однако вы можете эффективно решить уравнение x = F (y) с использованием метода Ньютона.

То, что я описал, является упрощенным представлением метода обратного преобразования . Это очень общий подход. Существуют специализированные алгоритмы выборки из нормального распределения, которые являются более эффективными. Они упоминаются в ответе Дэвида Хаммена.

+0

Спасибо, Дмитрий. Мне может потребоваться оставшаяся часть лета, чтобы полностью оценить ваш ответ, но я с нетерпением жду выигрыша. –

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