Собственная реализация 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Что здесь важно концептуально:
- Масштабирование по столбцам
axis=0— каждый признак обрабатывается независимо. - Явная обработка нулевой дисперсии
Константные признаки:
– не дают информации
– не масштабируются
– не порождаютnanиinf - Возврат параметров
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 полезна, когда важны прозрачность, контроль над числовой стабильностью и воспроизводимость масштабирования.