Получение значений дисперсии для случайных выборок, сгенерированных из стандартного нормального распределения с использованием numpy

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

y_means = [1,2,3,4]
y_variance = [0.01,0.02,0.03,0.04]

Мне нужно сделать следующий расчет средних значений, чтобы продолжить остальную часть моей программы:

y_means = np.array(y_means)
y_means = np.reshape(y_means,(y_means.size,1))
A = np.random.randn(10,y_means.size)
y_means = np.matmul(A,y_means)

Здесь я использовал функцию numpy.random.randn для создания случайных выборок из стандартного нормального распределения, а затем умножил их на матрицу со средним значением, чтобы получить новую выходную матрицу. Тогда размер выходной матрицы будет иметь размер (10 x 1).

Мне нужно сделать аналогичный расчет, чтобы мои output_variances также были матрицей (10 x 1). Но нет смысла умножать таким же образом дисперсии на случайные выборки из стандартного нормального распределения, потому что это также приведет к отрицательным значениям. Это нежелательно, потому что моей конечной целью было бы создать нормальное распределение с этими средними значениями и соответствующими им значениями дисперсии, используя:

torch.distributions.normal.Normal(loc=y_means, scale=y_variance)

Итак, мой вопрос: есть ли какой-либо метод, с помощью которого я получаю значение дисперсии для каждой случайной выборки, сгенерированной numpy.random.randn? Потому что тогда умножение такой матрицы имело бы больше смысла с output_variance.

Или, если есть какая-либо другая стратегия для этого, о которой я мог бы не знать, пожалуйста, дайте мне знать.


person Ishwar Venugopal    schedule 04.09.2020    source источник


Ответы (1)


Проблема, упомянутая в вопросе, требовала другой матрицы той же размерности, что и A, которая соответствовала мере дисперсии для случайных выборок, присутствующих в A.

Взятие дисперсии по строкам или столбцам матрицы, обозначенной A, с использованием numpy.var() не дало аналогичного < em>матрица 10 x 4 для умножения на y_variance.

Я решил вышеуказанную проблему, используя следующий подход:

Сначала создайте матрицу с теми же размерами, что и A, но с нулевыми элементами, используя следующую строку кода:

A_var = np.zeros_like(A)

затем с помощью torch.distributions создайте нормальное распределение со значениями в A в качестве среднего и нулями в качестве дисперсии:

dist_A = torch.distributions.normal.Normal(loc=torch.Tensor(A), scale=torch.Tensor(A_var))

https://pytorch.org/docs/stable/distributions.html перечислены все операции возможны в нормальном распределении в PyTorch. Метод sample() может генерировать выборки из заданного распределения любого размера. Это свойство было использовано для создания выборочной матрицы размера 10 X 10 x 4, а затем для вычисления дисперсии по оси 0.

np.var(np.array(dist2.sample((10,))),axis=0)

В результате получится матрица отклонений размером 10 x 4, которую можно использовать для расчетов с y_variance.

person Ishwar Venugopal    schedule 07.09.2020