При масштабировании признаков деление на ноль и близкие к нулю значения — одна из основных причин числовой нестабильности.

Типичная ситуация:

При стандартизации

проблема возникает, если для какого-то признака

Это означает, что признак константный: все значения одинаковы.

Что происходит в NumPy:

Z = (X - X.mean(axis=0)) / X.std(axis=0)

– деление на 0 даёт inf или nan
– дальше эти значения распространяются по всем вычислениям
– модели ломаются неявно и трудно диагностируются

Почему это плохо с численной точки зрения:

  1. Потеря определённости
    nan и inf не несут статистического смысла, но участвуют в матричных операциях.
  2. Эффект домино
    Один нестабильный признак делает нестабильным весь результат:
    – градиенты
    – потери
    – собственные значения
  3. Ложная уверенность
    Код работает без ошибок, но результат некорректен.

Практики, которые используют в реальности:

  1. Явная обработка нулевой дисперсии
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]
  1. Удаление константных признаков
    Если признак не меняется, он не несёт информации.
  2. Добавление малого ε (осторожно)
Z = (X - mu) / (sigma + 1e-8)

Используется, но это уже инженерный хак, а не строгая математика. Его стоит явно осознавать.

  1. Проверки перед масштабированием
np.any(sigma == 0)

Числовая стабильность шире деления на ноль:

– очень маленькие σ → огромные значения после деления
– потеря точности при вычитании близких чисел
– плохая обусловленность матриц

Интуитивно:
масштабирование усиливает шум, если признак почти константный.

Коротко:
деление на ноль при масштабировании — индикатор плохого признака, а числовая стабильность требует явной обработки нулевой или почти нулевой дисперсии, а не молчаливого деления.