При масштабировании признаков деление на ноль и близкие к нулю значения — одна из основных причин числовой нестабильности.
Типичная ситуация:
При стандартизации
проблема возникает, если для какого-то признака
Это означает, что признак константный: все значения одинаковы.
Что происходит в NumPy:
Z = (X - X.mean(axis=0)) / X.std(axis=0)– деление на 0 даёт inf или nan
– дальше эти значения распространяются по всем вычислениям
– модели ломаются неявно и трудно диагностируются
Почему это плохо с численной точки зрения:
- Потеря определённости
nanиinfне несут статистического смысла, но участвуют в матричных операциях. - Эффект домино
Один нестабильный признак делает нестабильным весь результат:
– градиенты
– потери
– собственные значения - Ложная уверенность
Код работает без ошибок, но результат некорректен.
Практики, которые используют в реальности:
- Явная обработка нулевой дисперсии
mu = X.mean(axis=0)
sigma = X.std(axis=0)
mask = sigma > 0
Z = np.zeros_like(X)
Z[:, mask] = (X[:, mask] - mu[mask]) / sigma[mask]- Удаление константных признаков
Если признак не меняется, он не несёт информации. - Добавление малого ε (осторожно)
Z = (X - mu) / (sigma + 1e-8)Используется, но это уже инженерный хак, а не строгая математика. Его стоит явно осознавать.
- Проверки перед масштабированием
np.any(sigma == 0)Числовая стабильность шире деления на ноль:
– очень маленькие σ → огромные значения после деления
– потеря точности при вычитании близких чисел
– плохая обусловленность матриц
Интуитивно:
масштабирование усиливает шум, если признак почти константный.
Коротко:
деление на ноль при масштабировании — индикатор плохого признака, а числовая стабильность требует явной обработки нулевой или почти нулевой дисперсии, а не молчаливого деления.