Анализ главных компонентов (PCA) используется в приложениях машинного обучения для уменьшения размерности данных. Это было особенно полезно для сжатия изображений среди других приложений. В этом посте мы рассмотрим Учебное пособие по анализу основных компонентов Линдси Смит с его реализацией на Python.

Наша цель - развить интуицию для PCA, изложив математические формулировки, и выйти за рамки методов fit и fit_transform. Прежде чем двигаться дальше, полезно ознакомиться с мерами распространения и линейной алгеброй. Не стесняйтесь переходить к реализации, если объяснения кажутся тривиальными.

Меры распространения

Дисперсия

Дисперсия - это мера разброса, которая показывает, насколько набор чисел отличается от своего среднего значения. для одномерного массива X дисперсия s2 равна:

  • Xi = значение i-й записи массива X
  • Панель X = среднее значение X
  • n = количество записей

Ковариация между двумя измерениями

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

  • Xi = значение i-й записи массива X
  • Yi = значение i-й записи массива Y
  • X bar = среднее значение массива X
  • Полоса Y = среднее значение массива Y
  • n = количество записей, то же самое для X и Y

Глядя на результат ковариации, важно смотреть на знак. Если он положительный, то существует положительная корреляция, означающая, что X и Y увеличиваются вместе; если отрицательный, то оба увеличиваются. Если нас волнует значение, лучше использовать коэффициент корреляции Пирсона.

Ковариация между n измерениями

Что, если мы используем n-мерные данные, как измерить ковариацию? Напомним, что ковариация существует только между двумя измерениями, поэтому результатом является ковариационная матрица. Полезно знать, что количество значений ковариации, которые мы можем вычислить, составляет:

  • n = количество измерений

Например, если у нас есть набор данных с размерами x, y и z, тогда наша ковариационная матрица C будет:

Линейная алгебра

Собственные векторы

Когда мы перемножаем две совместимые матрицы, мы фактически выполняем линейное преобразование. Рассмотрим квадратную матрицу A и вектор v и следующее свойство:

  • A = квадратная матрица
  • v = вектор
  • λ = скалярное значение

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

Если A является диагонализуемой матрицей n x n, то она имеет n собственных векторов. Важным свойством собственных векторов является то, что все они ортогональны. Позже мы увидим, как мы можем выразить данные в терминах этих векторов вместо их исходных размеров.

Собственные значения

В предыдущем разделе мы вычислили собственное значение, не осознавая этого: это не что иное, как λ. При вычислении собственных векторов мы также вычисляем собственные значения. Вычислить эти значения можно вручную, как показано в этом руководстве. Однако, как только размеры A превышают 3x3, получение собственных значений и собственных векторов может быть очень утомительным и трудоемким.

Реализация СПС

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

Шаг 1. Получите данные

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

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

Глядя на данные на трехмерной диаграмме рассеяния:

Шаг 2: вычтите среднее

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

Шаг 3. Вычислите матрицу ковариации.

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

Напомним, что недиагональные члены - это ковариация одного измерения с другим. Например, в приведенном ниже примере вывода нас больше не интересуют значения, а скорее знаки. Здесь X и Y отрицательно коррелированы, тогда как Y и Z положительно коррелированы.

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

Мы вычисляем собственные векторы v и собственные значения w с помощью пакета линейной алгебры numpy: numpy.linalg.eig. Собственные векторы нормализованы так, что столбец v [:, i] является собственным вектором, соответствующим собственному значению w [i]. Вычисленные собственные значения не обязательно упорядочивать, это будет актуально на следующем шаге.

Шаг 5: Выбор компонентов и нового вектора функций

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

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

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

Шаг 6: получение нового набора данных

В последней части мы берем транспонированный вектор и умножаем его слева от исходного набора данных.

В приведенном выше коде транспонированный вектор признаков - это вектор признаков-строк, где собственные векторы теперь находятся в строках, так что наиболее значимые собственные векторы находятся вверху. Корректировка данных строки - это перенесенные средние скорректированные данные, где каждая строка содержит отдельное измерение. Наши новые данные выглядят следующим образом:

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

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

Шаг -1: возврат старых данных

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

Мы можем перевернуть выражение, чтобы получить:

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

Наконец, мы добавляем среднее значение, которое мы вычитали с самого начала:

В коде Python это выглядит так:

Заключение

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

Хотя мы не вдавались в подробности того, почему это работает, мы можем уверенно интерпретировать вывод таких пакетов, как sklearn’s PCA.

Полный код Python можно найти в этой записной книжке.