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