Как определить процент потерянной дисперсии при использовании метода PCA?

Ответ

Процент потерянной дисперсии — это доля информации (дисперсии), которая не сохранилась после проецирования данных на выбранные главные компоненты. Он рассчитывается как 1 - сумма объяснённой дисперсии выбранных компонент.

В scikit-learn объяснённая дисперсия для каждой компоненты хранится в атрибуте explained_variance_ratio_.

Пример расчёта:

from sklearn.decomposition import PCA
import numpy as np

# Генерация синтетических данных
np.random.seed(42)
X = np.random.randn(100, 10)  # 100 объектов, 10 признаков

# Применяем PCA, оставляя 3 главные компоненты
pca = PCA(n_components=3)
X_transformed = pca.fit_transform(X)

# Суммарная объяснённая дисперсия
explained_variance_total = np.sum(pca.explained_variance_ratio_)

# Потерянная дисперсия
lost_variance = 1 - explained_variance_total

print(f"Объяснённая дисперсия: {explained_variance_total:.2%}")
print(f"Потерянная дисперсия: {lost_variance:.2%}")

Практическое применение: Этот показатель помогает принять решение о количестве компонент. Например, можно подбирать n_components так, чтобы потерянная дисперсия не превышала заданный порог (например, 5%).

Ответ 18+ 🔞

Давай разберём эту тему, а то у некоторых от этих терминов глаза на лоб лезут, как будто они мартышлюшки в цирке увидели.

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

В scikit-learn всё уже для тебя приготовили, небось. Каждая компонента после PCA тащит с собой свою долю объяснённой дисперсии, и лежит это добро в атрибуте explained_variance_ratio_. Красота, а не жизнь.

Смотри, как на практике выглядит:

from sklearn.decomposition import PCA
import numpy as np

# Нагенерим данных от фонаря
np.random.seed(42)
X = np.random.randn(100, 10)  # 100 строк, 10 столбцов — обычное дело

# Запускаем PCA, оставляя только три главные компоненты
pca = PCA(n_components=3)
X_transformed = pca.fit_transform(X)

# Считаем, сколько дисперсии наши три героя унесли
explained_variance_total = np.sum(pca.explained_variance_ratio_)

# А вот и наша потеряшка
lost_variance = 1 - explained_variance_total

print(f"Объяснённая дисперсия: {explained_variance_total:.2%}")
print(f"Потерянная дисперсия: {lost_variance:.2%}")

Зачем это вообще нужно? А затем, чувак, чтобы не облажаться. Смотри: если потерянная дисперсия подскакивает, скажем, до 30%, это уже пиздец как много — значит, ты выкинул почти треть информации, и твоя модель теперь будет как слепой котёнок. Обычно ставят порог, например, 5% — и подбирают число компонент так, чтобы потеря не превышала этот уровень. Всё просто, как три копейки: меньше потерял — лучше сохранил суть данных. А если потерял слишком много, то твоя модель — просто хитрая жопа, которая нихрена не покажет.