Анализ основных компонентов в R: пошаговый пример

Анализ основных компонентов в R: пошаговый пример

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

Цель PCA состоит в том, чтобы объяснить большую часть изменчивости в наборе данных с меньшим количеством переменных, чем в исходном наборе данных.

Для заданного набора данных с переменными p мы могли бы изучить диаграммы рассеяния каждой попарной комбинации переменных, но само количество диаграмм рассеяния может очень быстро стать большим.

Для предикторов p существуют диаграммы рассеяния p(p-1)/2.

Итак, для набора данных с p = 15 предикторов будет 105 различных диаграмм рассеяния!

К счастью, PCA предлагает способ найти низкоразмерное представление набора данных, которое фиксирует как можно больше вариаций данных.

Если мы сможем зафиксировать большую часть изменений всего в двух измерениях, мы сможем спроецировать все наблюдения в исходном наборе данных на простую диаграмму рассеяния.

Находим главные компоненты следующим образом:

Учитывая набор данных с предикторами p : X 1 , X 2 , …, X p, , рассчитайте Z 1 , … , Z M как M линейных комбинаций исходных предикторов p , где:

  • Z m = ΣΦ jm X j для некоторых констант Φ 1m , Φ 2m , Φ pm , m = 1, …, M.
  • Z 1 — это линейная комбинация предикторов, которая фиксирует максимально возможную дисперсию.
  • Z 2 является следующей линейной комбинацией предикторов, которая фиксирует наибольшую дисперсию, будучи ортогональной (т.е. некоррелированной) с Z 1 .
  • Тогда Z 3 является следующей линейной комбинацией предикторов, которая захватывает наибольшую дисперсию, будучи ортогональной Z 2 .
  • И так далее.

На практике мы используем следующие шаги для вычисления линейных комбинаций исходных предикторов:

1. Масштабируйте каждую из переменных так, чтобы среднее значение равнялось 0, а стандартное отклонение равнялось 1.

2. Рассчитайте ковариационную матрицу для масштабированных переменных.

3. Вычислите собственные значения ковариационной матрицы.

Используя линейную алгебру, можно показать, что собственный вектор, соответствующий наибольшему собственному значению, является первой главной компонентой. Другими словами, эта конкретная комбинация предикторов объясняет наибольшую дисперсию данных.

Собственный вектор, соответствующий второму по величине собственному значению, является вторым главным компонентом и так далее.

В этом руководстве представлен пошаговый пример того, как выполнить этот процесс в R.

Шаг 1: Загрузите данные

Сначала мы загрузим пакет tidyverse , который содержит несколько полезных функций для визуализации и управления данными:

library (tidyverse)

В этом примере мы будем использовать набор данных USArrests , встроенный в R, который содержит количество арестов на 100 000 жителей в каждом штате США в 1973 году за убийство , нападение и изнасилование .

Он также включает процент населения в каждом штате, проживающего в городских районах, UrbanPop .

Следующий код показывает, как загрузить и просмотреть первые несколько строк набора данных:

#load data
data ("USArrests")

#view first six rows of data
head(USArrests)

 Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7

Шаг 2: Расчет основных компонентов

После загрузки данных мы можем использовать встроенную функцию R prcomp() для вычисления основных компонентов набора данных.

Обязательно укажите масштаб = TRUE , чтобы каждая из переменных в наборе данных была масштабирована так, чтобы иметь среднее значение 0 и стандартное отклонение 1 перед вычислением основных компонентов.

Также обратите внимание, что собственные векторы в R по умолчанию указывают в отрицательном направлении, поэтому мы умножим на -1, чтобы поменять знаки.

#calculate principal components
results <- prcomp(USArrests, scale = TRUE )

#reverse the signs
results$rotation <- -1\*results$rotation

#display principal components
results$rotation

 PC1 PC2 PC3 PC4
Murder 0.5358995 -0.4181809 0.3412327 -0.64922780
Assault 0.5831836 -0.1879856 0.2681484 0.74340748
UrbanPop 0.2781909 0.8728062 0.3780158 -0.13387773
Rape 0.5434321 0.1673186 -0.8177779 -0.08902432

Мы можем видеть, что первая главная компонента (PC1) имеет высокие значения для Убийства, Нападения и Изнасилования, что указывает на то, что эта главная компонента описывает наибольшую вариацию этих переменных.

Мы также можем видеть, что второй основной компонент (PC2) имеет высокое значение для UrbanPop, что указывает на то, что этот основной компонент уделяет наибольшее внимание городскому населению.

Обратите внимание, что оценки основных компонентов для каждого состояния хранятся в results$x.Мы также умножим эти оценки на -1, чтобы поменять местами знаки:

#reverse the signs of the scores
results$x <- -1\*results$x

#display the first six scores
head(results$x)

 PC1 PC2 PC3 PC4
Alabama 0.9756604 -1.1220012 0.43980366 -0.154696581
Alaska 1.9305379 -1.0624269 -2.01950027 0.434175454
Arizona 1.7454429 0.7384595 -0.05423025 0.826264240
Arkansas -0.1399989 -1.1085423 -0.11342217 0.180973554
California 2.4986128 1.5274267 -0.59254100 0.338559240
Colorado 1.4993407 0.9776297 -1.08400162 -0.001450164

Шаг 3. Визуализируйте результаты с помощью биплота

Затем мы можем создать двойную диаграмму — график, который проецирует каждое из наблюдений в наборе данных на диаграмму рассеяния, которая использует первый и второй главные компоненты в качестве осей:

Обратите внимание, что масштаб = 0 гарантирует, что стрелки на графике масштабируются для представления нагрузок.

biplot(results, scale = 0 )
Биграф для анализа основных компонентов в R

На графике мы можем видеть каждое из 50 состояний, представленных в простом двумерном пространстве.

Состояния, которые находятся близко друг к другу на графике, имеют схожие шаблоны данных в отношении переменных в исходном наборе данных.

Мы также можем видеть, что определенные состояния более тесно связаны с одними преступлениями, чем с другими. Например, штат Джорджия ближе всего к переменной Убийство в сюжете.

Если мы посмотрим на штаты с самым высоким уровнем убийств в исходном наборе данных, мы увидим, что Грузия на самом деле находится в верхней части списка:

#display states with highest murder rates in original dataset
head(USArrests[ order (-USArrests$Murder),])

 Murder Assault UrbanPop Rape
Georgia 17.4 211 60 25.8
Mississippi 16.1 259 44 17.1
Florida 15.4 335 80 31.9
Louisiana 15.4 249 66 22.2
South Carolina 14.4 279 48 22.5
Alabama 13.2 236 58 21.2

Шаг 4: Найдите дисперсию, объясненную каждым основным компонентом

Мы можем использовать следующий код для расчета общей дисперсии в исходном наборе данных, объясненной каждым основным компонентом:

#calculate total variance explained by each principal component
results$sdev^2 / sum (results$sdev^2)

[1] 0.62006039 0.24744129 0.08914080 0.04335752

По результатам мы можем наблюдать следующее:

  • Первый главный компонент объясняет 62% общей дисперсии в наборе данных.
  • Второй главный компонент объясняет 24,7% общей дисперсии в наборе данных.
  • Третий главный компонент объясняет 8,9% общей дисперсии в наборе данных.
  • Четвертый главный компонент объясняет 4,3% общей дисперсии в наборе данных.

Таким образом, первые два основных компонента объясняют большую часть общей дисперсии данных.

Это хороший знак, потому что предыдущая побочная диаграмма проецировала каждое из наблюдений из исходных данных на диаграмму рассеяния, которая учитывала только первые два основных компонента.

Таким образом, можно смотреть на шаблоны в побочной диаграмме, чтобы идентифицировать состояния, которые похожи друг на друга.

Мы также можем создать график осыпи — график, который отображает общую дисперсию, объясненную каждым основным компонентом, — чтобы визуализировать результаты PCA:

#calculate total variance explained by each principal component
var_explained = results$sdev^2 / sum (results$sdev^2)

#create scree plot
qplot(c(1:4), var_explained) + 
 geom_line() + 
 xlab(" Principal Component ") + 
 ylab(" Variance Explained ") +
 ggtitle(" Scree Plot ") +
 ylim(0, 1) 
Осыпной участок в R

Анализ основных компонентов на практике

На практике PCA используется чаще всего по двум причинам:

1. Исследовательский анализ данных. Мы используем PCA, когда впервые изучаем набор данных и хотим понять, какие наблюдения в данных наиболее похожи друг на друга.

2. Регрессия основных компонентов.Мы также можем использовать PCA для расчета основных компонентов, которые затем можно использовать в регрессии основных компонентов.Этот тип регрессии часто используется, когда между предикторами в наборе данных существует мультиколлинеарность .


Полный код R, использованный в этом руководстве, можно найти здесь .

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.