Генерация n-мерных случайных чисел в Python

Я пытаюсь сгенерировать случайные числа из гауссовского распределения. Python имеет очень полезный random.gauss() метод, но это только одномерная случайная величина. Как я могу программно генерировать случайные числа из этого распределения в n-измерениях?

Например, в двух измерениях возвращаемое значение этого метода по существу равно расстоянию от среднего значения, поэтому мне все еще нужны координаты (x,y) для определения фактической точки данных. Я предполагаю, что мог бы сгенерировать еще два случайных числа, но я не уверен, как установить ограничения.

Я ценю любые идеи. Спасибо!

4 ответа

Решение

Numpy имеет многомерные эквиваленты для функций в случайном модуле

Функция, которую вы ищете, это numpy.random.normal

Вы можете сделать это с помощью np.random.multivariate_normal() функция. Он работает не только для двумерных данных, но и для любого количества измерений.

Например, если вы хотите, чтобы 100 двумерных точек были сосредоточены вокруг точки (1,3), вы можете сделать следующее.

mean = [1, 3]
cov = [[8, -5], [0.2, 0.2]]
x, y = np.random.multivariate_normal([0, 2], cov, 100).T

И для 100 трехмерных точек, центрированных вокруг этой точки (1,10 100), вы можете сделать это.

mean = [1, 10, 100]
cov = [[1,1,1], [1,1,1], [1,1,1]]
x, y, z = np.random.multivariate_normal(mean, cov, 100).T

Для получения дополнительной информации здесь есть документация, но вы также можете спросить меня. http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.multivariate_normal.html

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

Похоже, вы просите многовариантное нормальное распределение. Чтобы сгенерировать значение из этого распределения, вам нужно иметь ковариационную матрицу, в которой прописаны отношения между x и y. Как связаны ваши x и y? Если x и y независимы, вы можете просто сгенерировать два значения с помощью random.gauss().

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

Другие вопросы по тегам