Оценить плотность вероятности гауссовского распределения на квадратной сетке

Мне нужно сгенерировать маску изображения размером m × n, соответствующую двумерному гауссову с центром в µ = (i, j) и σ^2 = 25, используя NumPy.

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

  • Сгенерированная матрица не является маской (двоичная)
  • Ковариация (σ^2) задается как матрица, а не как целое число

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

1 ответ

Решение

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

Самое простое, что можно сделать, это использовать scipy.stats.multivariate_normal.pdf функция следующим образом:

m, n = 100, 100
lims = (-3, 3) # support of the PDF
xx, yy = np.meshgrid(np.linspace(*lims, m), np.linspace(*lims, n))
points = np.stack((xx, yy), axis=-1)
mean = (1, 2) # Whatever your (i, j) is
covariance = 25.0
pdf = scipy.stats.multivariate_normal.pdf(points, mean, covariance)

pdf теперь дает высоту гауссовой функции в каждой из точек на плоскости между -3 и 3 на осях x и y.

Вы можете применить это окно к любым изображениям, которые вы хотите, просто выполнив image * pdf,

редактирует:

Спасибо CrazyIvan за указание на pdf Функция принимает сетку точек напрямую. Также обратите внимание, что np.linspace(*lims, m) использует специфичную для Python3 распаковку кортежей. Если у вас есть старая версия, просто сделайте np.linspace(lims[0], lims[1], m),

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