python numpy нормализовать двумерный массив с помощью .mean и .std
Есть такая задачка:
В задачах машинного обучения часто требуется нормализовать данные перед тем, как их использовать. Пусть в переменной
Xнаходится двумерныйnp.array, по строкам которого записаны разные объекты, а по столбцам — признаки. Вам необходимо написать функциюnormalize(X), принимающую на вход массивXи нормализующий все переменные таким образом, чтобы их среднее равнялось 0, а стандартное отклонение 1. Иными словами, для каждого столбца необходимо из всех элементов вычесть среднее по этому столбцу и результат разделить на стандартное отклонение по этому столбцу. Более формально: если $X=(x_{ij})$ — наша матрица, $x_{ij}$ — элемент, который стоит в её $i$-й строке и $j$-м столбце, и $x_{\cdot j}$ — $j$-й столбец, то в новой матрице на $i$-й строке в $j$-м столбце будет стоять элемент$$\widehat{x}{ij}=\frac{x{ij}-\overline{x_{\cdot j}}}{\sigma_{x_{\cdot j}}},$$ где $\overline{x_{\cdot j}}$ — выборочное среднее (среднее арифметическое) всех элементов $j$-го столбца, $\sigma_{x_{\cdot j}}$ — стандартное отклонение всех элементов $j$-го столбца.
Подсказка. Вычислить среднее можно с помощью метода
.mean(), стандартное отклонение — с помощью.std(). Обе функции принимают на вход параметрaxis, с помощью которого можно применять их к строкам или столбцам двумерного массива. Использовать циклы, как обычно, запрещено. Задачу можно решить в одну строчку.
Пробую решить ее, придерживаясь условия: без циклов и в одну строку.
Мое решение:
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
def normalize(x):
return (x - x.mean(axis=0)) / x.std(axis=0)
print(normalize(x))
Вывод:
[[-1.22474487 -1.22474487 -1.22474487]
[ 0. 0. 0. ]
[ 1.22474487 1.22474487 1.22474487]]
Кажется, что все сходится, а конкретно, что среднее арифметическое равно 0 и квадратное отклонение равно 1 (для столбцов)
Подскажите, пожалуйстa, правильно ли я делаю?