Собственная реализация scale — это явная и контролируемая версия стандартизации признаков, без скрытой логики и «магии».

Базовая идея:

– считаем mean и std по столбцам
– обрабатываем нулевую дисперсию
– возвращаем стандартизованную матрицу и параметры масштабирования

Минимальная реализация:

import numpy as np
 
def scale(X):
    mu = X.mean(axis=0)
    sigma = X.std(axis=0)
    mask = sigma > 0
 
    Z = np.zeros_like(X, dtype=float)
    Z[:, mask] = (X[:, mask] - mu[mask]) / sigma[mask]
 
    return Z, mu, sigma

Что здесь важно концептуально:

  1. Масштабирование по столбцам
    axis=0 — каждый признак обрабатывается независимо.
  2. Явная обработка нулевой дисперсии
    Константные признаки:
    – не дают информации
    – не масштабируются
    – не порождают nan и inf
  3. Возврат параметров
    mu и sigma нужны для:
    – применения к тестовой выборке
    – воспроизводимости
    – интерпретации модели

Применение к новым данным:

def scale_apply(X, mu, sigma):
    mask = sigma > 0
    Z = np.zeros_like(X, dtype=float)
    Z[:, mask] = (X[:, mask] - mu[mask]) / sigma[mask]
    return Z

Если нужен более инженерный вариант с ε:

def scale_eps(X, eps=1e-6):
    mu = X.mean(axis=0)
    sigma = X.std(axis=0)
    return (X - mu) / (sigma + eps), mu, sigma

Здесь добавка — компромисс между строгостью и устойчивостью. Это не «чистая» статистика, а практический приём.

Коротко:
своя реализация scale полезна, когда важны прозрачность, контроль над числовой стабильностью и воспроизводимость масштабирования.