2016-02-24 8 views
1

Мне нужно пробовать ячейки сетки (матрицы MXN) в соответствии с нормальным распределением в Java.Как отбирать ячейки сетки (матрицы) в соответствии с нормальным (гауссовским) распределением?

Я знаю, что the Apache Math library имеет функции для выборки значений одномерно (1D), поэтому для вектора было бы хорошо, но я не могу найти альтернативы для 2D.

Я подумал, используя двойной подход 1D: один для строк, а другой для cols. Однако (1) это не совсем точно, поскольку он будет использовать Von Neumann distances, а не geometrical distance, и (2) этот подход не позволит избежать повторений (т. Е. Не будет выборки).

Итак, как я могу отображать ячейки сетки (матрицы) в соответствии с нормальным (гауссовским) распределением, центрированным в конкретной ячейке (r, c)?


Альтернативно, если выборка не представляется возможным (или слишком сложно), как я распределить вероятность, используя нормальное распределение accross ячеек в сетке с центром в конкретной ячейке (г, с)? Например, для 3х3 ::

0.1 | 0.1 | 0.1 
0.1 | 0.2 | 0.1 
0.1 | 0.1 | 0.1 

Я не уверен, если предыдущие значения будут фактически соответствовать любому Gaussian, но что более важно, для любой матрицы, сумма ячейки должно быть 1.

Отсюда я могу просто повторить и бросить это; или рулон и повторение сложения.

+1

Не могли бы вы использовать полярные координаты и использовать Guassian Distribution для 'r' и равномерным распределением для' theta'? Вам нужно будет решить, как сделать его пригодным/масштабировать для вашей сетки, но это может позволить вам использовать библиотеку Apache. – bradimus

+0

Я не уверен, кто является 'r', а кто' theta', но вы говорите: 1. Используйте единое распределение для вычисления угла, 2. Используйте библиотеку apache для вычисления расстояния в этом угле, 3 Найти ячейку с учетом направления и угла? Ммм ... геометрически это, кажется, имеет смысл. Это действительно не избежать повторений, но на данный момент мне все равно. И найти соответствующую ячейку может быть немного боль, как при установке масла в старые ржавые шестерни на велосипеде. –

ответ

1

Даже в случае 1D неясно, как вы сопоставляете значение, выбранное из распределения Гаусса, в векторный индекс; однако, если все, что вам нужно сделать, это образец значения из двумерного гаусса, то у Apache есть MultivariateNormalDistribution.

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

double[][] covariance = 
       {{1d, 0d}, 
        {0d, 1d}}; 
+0

Спасибо @Chris, как мне использовать ковариационную матрицу? По какой-то причине моя интуиция говорила мне, что функция потребует один параметр, дисперсию или sd, но для этого требуется матрица 2x2. Я понял, что диагональ ('[0] [0]' и '[1] [1]') является дисперсией x и y отдельно, но я теряюсь с другими значениями ('[0] [1] 'и' [1] [0] '). Для того, что я знаю, матрица ковариации симметрична, когда вы вычисляете ее по данным (например, для корреляций), но здесь, похоже, это не требуется. –

+0

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

+0

Я добавил пример ковариационной матрицы, предполагая, что два направления независимы. Для вас это может быть не так, поскольку в вопросе упоминается, что вы не можете самостоятельно выбирать два дистрибутива 1D. –