Умножение по столбцам в numpy
Вы можете легко создавать произвольные массивы произвольного размера с numpy с помощью команд numpy.random.rand(d0, d1, …, dn)
для равномерного распределения или numpy.random.randn(d0, d1, …, dn)
для нормального распределения, где dn
- это числообразцов в n-м измерении.В вашем случае у вас будет d0=500
и d1=2
.
Однако значения будут выбраны из интервала [0, 1) в numpy.random.rand(d0, d1, …, dn)
.Или стандартное нормальное распределение для numpy.random.randn(d0, d1, …, dn)
(т. Е. Среднее = 0 и дисперсия = 1).
Хорошим решением для этого является суммирование и умножение массивов по столбцам, чтобы сдвинуть распределения к желаемым значениям.Чтобы умножить по столбцам массив arr
с вектором vec
, вы можете использовать этот небольшой фрагмент кода arr.dot(np.diag(vec))
.Будьте осторожны, в vec
должно быть столько же элементов, сколько в столбцах arr
.
Этот фрагмент работает путем преобразования vec
в диагональную матрицу (т. Е. Матрицу, в которой все равно нулю, кроме главной диагонали) иумножение arr
на диагональную матрицу.
Для равномерных распределений
Помните, что, чтобы превратить выборку x
из равномерного распределения [0, 1)
в [min, max)
, вы делаете new_x = (max - min) * x + min
.Поэтому, если вам нужно равномерное распределение и вы знаете максимальные и минимальные пределы для обеих переменных, вы можете использовать следующий код:
import numpy as np
n_samples = 500
max_age, min_age = 80, 10
max_hours, min_hours = 10, 0
array = np.random.rand(n_samples, 2) #returns samples from the uniform distribution
range_vector = np.array([max_age - min_age, max_hours - min_hours])
min_vector = np.array([min_age, min_hours])
sample = array.dot(np.diag(range_vector)) + np.ones(array.shape).dot(np.diag(min_vector))
Нормальные распределения
Если вы хотите нормальное распределениераспределение и вы знаете среднее значение и дисперсию обоих столбцов используйте следующий код.Помните, что для смещения выборки x
от стандартного нормального распределения к распределению с другим средним и стандартным отклонением вы идете new_x = deviation * x + mean
.
import numpy as np
n_samples = 500
mean_age, deviation_age = 40, 20
mean_hours, deviation_hours = 5, 2
array = np.random.rand(n_samples, 2) #returns samples from the standard normal distribution
deviation_vector = np.array([deviation_age, deviation_hours])
mean_vector = np.array([mean_age, mean_hours])
sample = array.dot(np.diag(deviation_vector)) + np.ones(array.shape).dot(np.diag(mean_vector))
Однако будьте осторожны, с обычными распределениями вы можетев конечном итоге получим отрицательные значения.
Вы также можете просмотреть всю документацию, которую numpy имеет по случайным переменным: https://docs.scipy.org/doc/numpy/reference/routines.random.html
Наконец, обратите внимание, что умножение по столбцам работает только тогда, когда вы хотитеоба образца должны быть независимыми.