Что такое метод главных компонент (PCA)?

Ответ

PCA (Principal Component Analysis) — это алгоритм обучения без учителя для снижения размерности данных. Он находит новые оси (главные компоненты), вдоль которых дисперсия данных максимальна, и проецирует данные на эти оси.

Как это работает:

  1. Центрирование данных: Вычитается среднее значение по каждому признаку.
  2. Вычисление ковариационной матрицы.
  3. Собственное разложение: Находятся собственные векторы (главные компоненты) и собственные значения (объяснённая дисперсия).
  4. Проекция: Данные умножаются на матрицу из выбранных главных компонент.

Практическое применение с Scikit-learn:

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# Загрузка данных
iris = load_iris()
X = iris.data
y = iris.target

# КРИТИЧНЫЙ ШАГ: Масштабирование признаков
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Применение PCA для уменьшения до 2 компонент
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print(f"Объяснённая дисперсия каждой компоненты: {pca.explained_variance_ratio_}")
print(f"Суммарная объяснённая дисперсия: {sum(pca.explained_variance_ratio_):.2%}")

# Визуализация
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('Iris dataset после PCA')
plt.show()

Зачем это нужно:

  • Визуализация многомерных данных (сведение к 2D/3D).
  • Ускорение обучения моделей за счёт уменьшения числа признаков.
  • Подавление шума, так как последние компоненты часто несут мало информации.

Важные нюансы:

  • PCA — линейный метод. Для нелинейных данных лучше подходят t-SNE или UMAP.
  • Интерпретируемость новых признаков (PC) теряется — они являются линейными комбинациями исходных.

Ответ 18+ 🔞

А, слушай, вот эта штука — PCA, она же анализ главных компонент. По сути, это когда у тебя данных овердохуища, признаков как грязи, а тебе надо всё это безобразие упростить, чтобы не сойти с ума. Алгоритм без учителя, то есть сам, как хитрая жопа, ищет закономерности.

Как оно, блядь, крутится:

  1. Центровка данных. От каждой фичи отнимаешь её среднее значение, чтобы всё было вокруг нуля. Иначе получится хуй с горы, а не анализ.
  2. Ковариационная матрица. Считаешь, как признаки друг с другом связаны. Если не масштабировать данные перед этим — доверия ебать ноль к результату будет.
  3. Собственные вектора и значения. Вот тут магия: алгоритм находит новые оси (главные компоненты), вдоль которых разброс данных максимальный. Первая компонента — где самый большой разлёт, вторая — поменьше и так далее.
  4. Проекция. Берёшь свои исходные данные и проецируешь на эти новые, найденные оси. Вуаля — размерность упала.

Как это в коде выглядит, на примере ирисов Фишера:

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# Грузим данные
iris = load_iris()
X = iris.data
y = iris.target

# ВАЖНО, БЛЯДЬ! Масштабируем! Без этого PCA будет работать как одноглазый пёс в темноте — нихуя не увидит.
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Применяем PCA, оставляем только две главные компоненты
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

print(f"Объяснённая дисперсия каждой компоненты: {pca.explained_variance_ratio_}")
print(f"Суммарная объяснённая дисперсия: {sum(pca.explained_variance_ratio_):.2%}")

# Картинка для прикола
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y)
plt.xlabel('PC1')
plt.ylabel('PC2')
plt.title('Iris dataset после PCA')
plt.show()

Зачем вообще эта волынка нужна?

  • Визуализация. Свести свои 100500 признаков к 2D или 3D и посмотреть, не сгруппировалось ли что. Удивление пиздец иногда бывает.
  • Ускорение моделей. Меньше признаков — быстрее учится. Особенно если какие-то признаки были просто шумом.
  • Подавление этого самого шума. Последние компоненты обычно несут в себе мало инфы, в основном мусор. Отрезал их — и порядок.

Но есть нюансы, ёпта:

  • PCA — метод линейный. Если у тебя данные закручены спиралью или ещё какой манда с ушами, он нихуя не поможет. Тут уже надо t-SNE или UMAP смотреть.
  • Интерпретируемость новых осей (PC1, PC2) — терпения ноль ебать. Это просто линейные комбинации старых признаков, и понять, что там внутри, можно, но уже надо голову ломать.