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, правильно ли я делаю?


Ответы (0 шт):