Линейная алгебра · модуль 5 из 14
Метод главных компонент: сжатие признаков
Точки — серверы: по осям нагрузка CPU и потребление RAM в стандартных отклонениях. Собственные векторы матрицы ковариаций показывают направления наибольшего разброса.
- PC1: главная компонента
- PC2
- серверы (160 точек)
Теория
Пусть есть $n$ объектов с двумя признаками, например нагрузкой CPU и потреблением RAM. После центрирования (вычитания среднего) разброс данных описывает выборочная матрица ковариаций:
$$ \Sigma = \frac{1}{n - 1} X^{\mathsf T} X = \begin{pmatrix} \operatorname{Var}(x_1) & \operatorname{Cov}(x_1, x_2) \\ \operatorname{Cov}(x_1, x_2) & \operatorname{Var}(x_2) \end{pmatrix}. $$
Матрица $\Sigma$ симметрична, поэтому у неё есть ортонормированный базис собственных векторов:
$$ \Sigma v_i = \lambda_i v_i, \qquad \lambda_1 \ge \lambda_2 \ge 0 . $$
Вектор $v_1$ (первая главная компонента, PC1) — направление наибольшего разброса данных, $\lambda_1$ — дисперсия вдоль него. Вектор $v_2$ перпендикулярен $v_1$.
Сжатие. Проекция $z = X v_1$ заменяет два признака одним. Доля сохранённой информации измеряется долей объяснённой дисперсии:
$$ \frac{\lambda_1}{\lambda_1 + \lambda_2}, \qquad \text{потеря} = \frac{\lambda_2}{\lambda_1 + \lambda_2}. $$
Чем сильнее коррелируют признаки, тем вытянутее облако точек и тем меньше теряется при отбрасывании PC2. При нулевой корреляции и одинаковом масштабе признаков обе компоненты равноценны, и сжатие теряет около половины информации.
Где это применяется в IT
Метод главных компонент сжимает данные с десятками признаков до нескольких самых информативных направлений. Его применяют перед обучением моделей, для визуализации эмбеддингов и для поиска аномалий в метриках серверов.
- Новые оси. Собственные векторы матрицы ковариаций задают новые оси, собственные числа равны дисперсии вдоль них.
- Корреляция. Чем сильнее связаны признаки, тем меньше теряется при отбрасывании последних компонент.
- Подготовка данных. Перед PCA данные центрируют, а признаки в разных единицах измерения ещё и нормируют.
Код на Python
Загружаю пример…