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

Введение

Мы живем в трехмерном пространстве, тогда почему мы все видим в двухмерном? Это потому, что все, что мы видим, проецируется на нашу сетчатку в виде двухмерного изображения. Если мы можем видеть только в 2D, то почему мы воспринимаем объекты как 3D? Что ж, человеческий мозг великолепен и использует различные методы, такие как восприятие глубины, воздушная перспектива, затенение и т. д., чтобы воссоздать 3D-модель объекта на основе информации из его 2D-изображения. Таким образом, мы можем сказать, что наша сетчатка кодирует зрение, а мозг декодирует проецируемое изображение, используя различные методы, помогающие нам воспринимать его как трехмерное.

1. Почему PCA?

Допустим, мы работаем над проблемой бинарной классификации и имеем набор данных с 30 функциями. Можно ли визуализировать эти 30-мерные данные? Нет! это невозможно. Но если бы эти же данные были в низкоразмерных настройках, таких как 2D или 3D, нам было бы очень легко их визуализировать. Проклятие размерности относится к различным проблемам, возникающим при работе с данными в многомерных пространствах, которые не возникают в маломерных пространствах. Мы можем преодолеть эту проблему, сжимая данные в более низкие измерения без потери большого количества информации; здесь на сцену выходит PCA.

2. Что такое ППШ?

Анализ основных компонентов (PCA) — это метод обучения без учителя, который используется для уменьшения размерности данных при сохранении большей части информации.

Уменьшение размерности действительно приводит к некоторой потере информации, но преимущества потери информации заключаются в меньших требованиях к памяти, увеличении скорости обучения модели и визуализации данных. Здесь уменьшение размерности не означает выбор k признаков из n признаков (k‹n) из набора данных, это означает создание новых k признаков, которые отражают сущность исходных данных или хорошо объясняют наши исходные данные.

3. Как работает PCA?

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

Рассмотрим небольшой двумерный набор данных.

Глядя на этот набор данных, мы можем заметить одну вещь: все точки лежат на линии y = 2x. Другими словами, мы можем сказать, что все точки данных попадают на линию, натянутую на вектор [x, 2x] (гдеx может быть любым действительным числом, кроме 0). Назовем этот вектор репрезентативным вектором «u». Другой способ представить этот набор данных может быть в виде репрезентативного вектора и коэффициентов.

В исходном наборе данных у нас есть 4 точки данных, каждая из которых находится в пространстве R², поэтому нам нужно 8 чисел для хранения набора данных, но для хранения сжатой версии нам нужно только 6 чисел.

Если вам интересно, как y’ внезапно появился в нашем обсуждении и почему он перпендикулярен x’? Просто подождите, вы сможете соединить все точки, как вы идете вперед.

Глядя на изображение, кажется, что мы повернули оси на угол. Все точки данных теперь попадают на преобразованную ось x (x’) и поэтому не имеют координаты y. Мы также можем наблюдать две вещи —

  1. Дисперсия точек данных по оси x’ значительна, тогда как дисперсия по оси y’ равна нулю. Поскольку ось x’ показывает значительную дисперсию, мы можем сказать, что x’ хорошо объясняет наши данные, а y’ — нет.
  2. Новые оси (x’ и y’) декоррелированы.

ПРИМЕЧАНИЕ. Направления с высокой дисперсией важны, в то время как другие направления с низкой или незначительной дисперсией не имеют большого значения и могут быть проигнорированы. (Этот вопрос возникнет позже, так что имейте это в виду)

Теперь наш преобразованный набор данных выглядит просто и может быть представлен в одномерном подпространстве R².

Если все точки попадают на диапазон репрезентативного вектора (который в данном случае является линией), мы можем легко сжать данные. Что делать, если некоторые точки данных находятся за пределами репрезентативного вектора? Единственное, что мы можем сделать, это спроецировать все такие точки на прямую. Поступая таким образом, мы реконструируем точки данных и заставляем их падать на линию. Когда у нас есть все точки на линии, мы можем легко представить их, используя только одно измерение. Чтобы что-то получить, мы должны что-то потерять. Благодаря реконструкции мы можем представить наши данные в подпространстве меньшей размерности R², но мы также теряем некоторую информацию.

Ошибка реконструкции(e = b — p) — это расстояние между исходной точкой данных и ее проекцией на подпространство меньшего размера (которое в данном случае является линией). Это также можно рассматривать как количество информации, которую мы теряем при восстановлении точек. Одна из наших целей — сохранить как можно больше информации, другими словами, мы хотим, чтобы ошибка реконструкции была как можно меньше. Ошибка реконструкции будет минимальной, если проецируемая точка будет не чем иным, как основанием перпендикуляра. Спроецированная точка, являющаяся основанием перпендикуляра, гарантирует, что мы потеряем наименьшую информацию.

В приведенном выше случае все было довольно просто, потому что набор данных следовал хорошей схеме, и поэтому поиск репрезентативной линии был легкой задачей. К сожалению, наборы данных реального мира не всегда следуют хорошей схеме; поэтому нам также нужно найти линию (или подпространство, натянутое на репрезентативный вектор). Получив линию, мы можем спроецировать на нее наши точки данных.

Выбор любой случайной строки и проецирование на нее точек данных даст тот же уровень сжатия, но мы должны выбрать строку, для которой мы потеряем наименьшую информацию. На изображении выше и зеленые, и красные линии дают одинаковый уровень сжатия, но зеленая линия лучше, чем красная. Что делает зеленую линию лучше, так это меньшая ошибка реконструкции. Из всех строк линия, которая дает нам наименьшую ошибку реконструкции, является «лучшей линией».

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

Давайте сначала центрируем наш набор данных

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

Средняя ошибка реконструкции для набора данных определяется выражением

Мы можем решить эту оптимизацию с ограничениями, используя множитель Лагранжа.

В итоге мы получили уравнение Эйгена. Таким образом, желаемый вектор «d» является собственным вектором ковариационной матрицы C. Вектор, который максимизирует дисперсию или f (d), связан с наибольшим собственным значением. Это хорошая новость, потому что мы можем легко найти собственные значения и собственные векторы ковариационной матрицы.

Ковариационная матрица ( C )

Ковариационная матрица представляет собой квадратную матрицу размера m x m (где m — количество признаков), которая дает ковариацию между каждой парой признаков в наборе данных.

Ковариационная матрица является симметричной и положительно полуопределенной (это означает, что все собственные значения являются неотрицательными действительными значениями и det (C) ≥ 0). Главная диагональ этой матрицы содержит дисперсию каждого признака.

Мы получим m собственных векторов ковариационной матрицы, и, поскольку ковариационная матрица симметрична, все эти собственные векторы единичной длины также будут ортогональны.

Я думаю, это объясняет, почему я нарисовал y’ и это слишком перпендикулярно x’. Двумерные данные приводят к ковариационной матрице 2 x 2 и двум собственным векторам, ортогональным друг другу.

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

В PCA мы называем эти собственные векторы «главными компонентами».

PCA обрабатывает мультиколлинеарность —основные компоненты, которые мы получаем, представляют собой декоррелированные направления.

В приведенном выше коде собственные векторы отображаются по столбцам в матрице eigen_vectors. Первый столбец представляет первый собственный вектор, а второй столбец представляет второй собственный вектор.

ПРИМЕЧАНИЕ. Мы также можем найти собственные векторы, используя разложение по сингулярным значениям (SVD). Мы можем рассматривать это как еще один способ найти главные компоненты. Я не обсуждаю здесь этот метод, он излишне растянет пост.

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

Какова роль собственных значений и собственных векторов в PCA?

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

Как собственное значение указывает на дисперсию?

Это доказывает, что собственные значения указывают на дисперсию

Чтобы узнать о собственных значениях и собственных векторах, вы можете посмотреть это невероятное видео, созданное 3 Blue 1 Brown — https://youtu.be/PFDu9oVAE-g

Сколько основных компонентов мы должны выбрать?

На практике мы выбираем только верхние k-измерения, вдоль которых дисперсия высока. Как правило, мы должны выбрать количество основных компонентов (k) таким образом, чтобы сохранить 95% дисперсии или информации. Возможно, в некоторых случаях мы хотим сохранить 99% информации, выбор k зависит от типа проблемы, над которой вы работаете.

Сжатие данных — последний шаг!

Теперь у нас есть k главных компонент или, можно сказать, k репрезентативных векторов.

Последним шагом является сжатие данных, которое может быть выполнено путем проецирования точек данных в n-мерном пространстве на k-мерное подпространство (где k ‹ n), натянутое на главные компоненты. Основные компоненты в основном образуют новую основу, на которую мы проецируем точки данных, чтобы уменьшить размерность.

Проекция на подпространство задается выражением

Это уравнение выглядит сложным и также включает вычисление обратной матрицы, которое обычно представляет собой операцию O(n³). У нас есть лучший метод? Да, в самом деле! Поскольку мы проецируем наши точки данных на ортонормированную основу, мы можем спроецировать наши точки данных, используя уравнение, приведенное ниже:

Если вы не знаете, как мы получили это уравнение, вы можете обратиться к этому видео из Академии Хана — https://youtu.be/we829K4NOq8

По сути, мы просто представляем X на другой основе. Если вам нужно представление меньшего размера, вы можете сохранить первые k столбцов и отбросить остальные. Например, если мы просто сохраним первые два собственных вектора, то получим матрицу n x 2, представляющую преобразованный набор данных.

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

Рецепт PCA

  1. Центрировать или нормализовать набор данных
  2. Построить ковариационную матрицу.
  3. Найти собственные значения и собственные векторы ковариационной матрицы.
  4. Выберите k лучших собственных векторов (или главных компонентов) таким образом, чтобы сохранить 95 % информации или дисперсии.
  5. Проецирование точек данных в n-мерном пространстве на новый базис или k-мерное подпространство, образованное главными компонентами.

Например, если у нас есть трехмерные данные с n точками данных, которые мы хотим сжать в 2 измерения, мы можем выбрать 2 верхних собственных вектора (главные компоненты PC1 и PC2) и, наконец, спроецировать наши точки данных на двумерное подпространство. охваченный ПК1 и ПК2.

Мы можем жестко закодировать вышеуказанный алгоритм, но sklearn помогает нам выполнить PCA всего несколькими строками кода.

Я использовал набор данных по раку молочной железы в приведенном ниже коде — https://www.kaggle.com/datasets/uciml/breast-cancer-wisconsin-data.

Ух ты! Сжатая версия 30-мерных данных в 3-х измерениях захватывает большую часть информации и показывает четкое разделение между злокачественной опухолью и доброкачественной опухолью.

Что дальше?

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

Спасибо за чтение, и я надеюсь, вам понравился этот пост. Если вам нравится моя работа, вы можете подписаться на меня, и если вы обнаружите какие-либо ошибки или неточности, сообщите мне об этом в комментариях.

Счастливого обучения!