Ответ
PCA (Principal Component Analysis) — это алгоритм обучения без учителя для снижения размерности данных. Он находит новые оси (главные компоненты), вдоль которых дисперсия данных максимальна, и проецирует данные на эти оси.
Как это работает:
- Центрирование данных: Вычитается среднее значение по каждому признаку.
- Вычисление ковариационной матрицы.
- Собственное разложение: Находятся собственные векторы (главные компоненты) и собственные значения (объяснённая дисперсия).
- Проекция: Данные умножаются на матрицу из выбранных главных компонент.
Практическое применение с 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, она же анализ главных компонент. По сути, это когда у тебя данных овердохуища, признаков как грязи, а тебе надо всё это безобразие упростить, чтобы не сойти с ума. Алгоритм без учителя, то есть сам, как хитрая жопа, ищет закономерности.
Как оно, блядь, крутится:
- Центровка данных. От каждой фичи отнимаешь её среднее значение, чтобы всё было вокруг нуля. Иначе получится хуй с горы, а не анализ.
- Ковариационная матрица. Считаешь, как признаки друг с другом связаны. Если не масштабировать данные перед этим — доверия ебать ноль к результату будет.
- Собственные вектора и значения. Вот тут магия: алгоритм находит новые оси (главные компоненты), вдоль которых разброс данных максимальный. Первая компонента — где самый большой разлёт, вторая — поменьше и так далее.
- Проекция. Берёшь свои исходные данные и проецируешь на эти новые, найденные оси. Вуаля — размерность упала.
Как это в коде выглядит, на примере ирисов Фишера:
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) — терпения ноль ебать. Это просто линейные комбинации старых признаков, и понять, что там внутри, можно, но уже надо голову ломать.