Нормализация: как избежать нулевого стандартного отклонения - PullRequest
1 голос
/ 18 февраля 2020

Выполните следующую задачу:

Нормализуйте матрицу по столбцам. Из каждого значения в столбце вычтите среднее (в столбце) и разделите его на стандартное отклонение (в столбце). Ваш вывод не должен содержать nan (вызвано делением на ноль). Замените Nans на 1. Не используйте if и while / for.

Я работаю с numpy, поэтому я написал следующий код:

def normalize(matrix: np.array) -> np.array:
    res = (matrix - np.mean(matrix, axis = 0)) / np.std(matrix, axis = 0, dtype=np.float64)
    return res
matrix = np.array([[1, 4, 4200], [0, 10, 5000], [1, 2, 1000]])
assert np.allclose(
    normalize(matrix),
    np.array([[ 0.7071, -0.39223,  0.46291],
              [-1.4142,  1.37281,  0.92582],
              [ 0.7071, -0.98058, -1.38873]])
)

Ответ Правильно.

Однако мой вопрос: как мне избежать деления на ноль? Если у меня есть столбец с аналогичными числами, у меня будет стандартное отклонение = 0 и значение Nan в результате. Как мне это решить? Буду благодарен!

1 Ответ

1 голос
/ 18 февраля 2020

В вашей задаче указано, что нужно исключить nan в выходных данных и заменить nan, которые встречаются с 1. В нем не указано, что промежуточные результаты могут не содержать nan. Допустимым решением может быть использование numpy.nan_to_num в * 1005. * перед возвратом:

import numpy as np
def normalize(matrix: np.array) -> np.array:
    res = (matrix - np.mean(matrix, axis = 0)) / np.std(matrix, axis = 0, dtype=np.float64)
    return np.nan_to_num(res, False, 1.0)
matrix = np.array([[2, 4, 4200], [2, 10, 5000], [2, 2, 1000]])
print(normalize(matrix))

выход:

[[ 1.         -0.39223227  0.46291005]
 [ 1.          1.37281295  0.9258201 ]
 [ 1.         -0.98058068 -1.38873015]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...