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

Анализ основных компонентов хорошо зарекомендовал себя в области науки о данных как метод уменьшения размерности данных, и в Интернете доступно множество фрагментов кода / блогов, которые помогут вам понять, как реализовать PCA для данных по вашему выбору с помощью язык программирования или инструмент аналитики по вашему выбору. Но когда я порылся в Интернете в поисках последовательного объяснения теории PCA, произошло одно из следующих двух: 1. Объяснения представлены в форме исследовательской работы или диссертации, которая является отличной и подробной, но редко бывает сложной для начинающих. понять. 2. Объяснения доступны по частям в сообщениях блога или только объясняют части процесса PCA.

Некоторые из нас могут быть полными новичками в PCA, некоторые из нас могут знать, как это реализовать, но не знать, как это работает, некоторые из нас могут знать, что он использует собственные значения и собственные векторы, но не совсем уверены, как и почему. У меня тоже были все эти вопросы. Этот пост — моя попытка задокументировать последовательное объяснение того, почему PCA работает. У нас будет изрядное количество математики в посте, но я постараюсь объяснить все подробно, чтобы мы вместе отправились в это путешествие. Итак, начнем!!

Что такое PCA? — Краткий обзор

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

Давайте представим набор данных с 1000 признаков (переменные, объясняющие точку данных) и 1 выходной переменной (переменная, которую мы пытаемся предсказать) и 1000 таких точек данных. Если бы нам нужно было обучить простую модель линейной регрессии, нам пришлось бы изучить 1000 параметров. Из 1000 функций некоторые функции могут сильно коррелировать с другими функциями. Мы могли бы намного лучше изучить что-то полезное, если бы уменьшили количество функций, чтобы количество параметров для изучения было намного меньше. Именно здесь PCA помогает нам преобразовать эти 1000 функций в меньшее количество некоррелированных функций. Он уменьшает функции, НЕ отбрасывая некоторые функции, а изменяя основные оси, которые используются для объяснения этих функций.

Change of Basis – это концепция из линейной алгебры, которая в основном используется в PCA. Проще говоря, для двумерной плоскости изменение базиса означает нахождение двух ортогональных линий, отличных от существующих осей X и Y. В некотором смысле эти новые линии становятся вашими «новыми» осями X и Y. Наша цель — найти определенный набор новых базисов, чтобы не было (или было как можно меньше) корреляции между точками данных, когда данные представлены с использованием нового базиса. Рис.1 представляет собой очень конкретный пример изменения базиса и того, как это может привести к уменьшению размерности фиктивных двумерных данных. Вы можете ясно видеть на рис. 1 (а), что функция 1 и функция 2 имеют положительную корреляцию (т. е. один увеличивается, если увеличивается другой), а также линейно зависят (т. е. лежат на прямой линии). На рис.1(b) новый базис показан красной и зеленой линиями (новые оси!). Теперь мы определим точки данных как проекции на этой новой основе. Так, например, точка P1, которая имела координаты (5,5) в пространстве, где Объект 1 и Объект 2 являются нашей основой, теперь будет иметь координаты (7.07,0), как показано на Рис.1(b). что означает 7,07 единиц по красной оси и 0 единиц по зеленой оси.

Вариантность данных – еще одна концепция, имеющая решающее значение для понимания PCA. Интуитивно можно рассматривать дисперсию как «разброс» точек данных в пространстве. Математически это сумма величин, на которые данные изменяются в направлении каждого базиса. Поскольку мы никоим образом не сдвигаем/перемещаем точки данных, а относительные расстояния между любыми двумя точками данных в пространстве не меняются при изменении базиса, «разброс» данных остается прежним, т. е. дисперсия остается той же.

Эти новые оси называются «основными компонентами» этого набора данных. Теоретически принципиальных компонентов может быть столько же, сколько признаков в данных, поскольку простое изменение базиса не уменьшает количество осей, необходимых для представления данных. В случае вышеприведенного фиктивного примера можно прямо игнорировать главный компонент Грина, поскольку данные по этому компоненту вообще не меняются. Красный основной компонент является единственным «важным» основным компонентом, поэтому мы выбираем его и представляем данные, используя его, как показано на рис. 1 (c). Но реальные данные почти никогда не будут вести себя так удобно (на рис. 2 показан случай двумерных данных, где признаки не так сильно коррелированы). Так как же мы тогда это решим?

Задача PCA состоит в том, чтобы подобрать k «наиболее важных» основных компонентов, которые по-прежнему объясняют «большую часть» дисперсии. Следующим шагом для нас является понимание того, что означает «самый важный» и как один (или PCA) выбирает его?

Погружение в математику

Пусть P(a,b) — точка в двумерном пространстве. Это означает, что точка может быть описана единицами измерения 'a' вдоль оси Feature 1 и единицами измерения 'b' вдоль Ось 2. Как только мы найдем главные компоненты, как показано на диаграмме справа, P'(a', b') можно будет объяснить с помощью a' единиц величины вдоль PC₁ (основной компонент 1) и b' единиц величины вдоль PC₂ (основной компонент 2).

В дальнейшем мы будем рассматривать P как одну точку ‘x’ как m-мерный вектор. В приведенном выше случае m=2 и вектор равен [a b]. Тогда [a' b'] является векторным представлением точки P' в преобразованном пространстве, где PC₁ и PC₂ — это новая база. Поскольку a' является проекцией P на PC₁, его величина (т.е. a') может быть найдена с помощью a' = [a b] ⋅ PC₁ и аналогично b' = [a b] ⋅ PC₂. Поскольку a’ и b’ являются действительными числами (а не векторами), по размерам, уравновешивающим PC₁ и PC₂, оба должны быть векторами-столбцами 2 x 1.

Таким образом, для одной точки данных x x’ = x * [PC₁ PC₂]

Если мы сложим n таких точек данных в матрицу X (размерами n x m), мы сможем расширить эта логика говорит о том, что преобразованные точки данных для X могут быть найдены путем умножения матриц X *[PC₁ PC₂]. Размер полученной матрицы будет равен n x m. (До этого момента мы просто ссылались на PC₁ и PC₂ как на базисные векторы преобразованного пространства. Таким образом, преобразованный X не будет иметь сокращения в размерности, т. е. он по-прежнему будет иметь элементы m, но в трансформированном пространстве. Мы не сделали ничего особенного для того, чтобы эти новые базисы действительно были «Основными компонентами»)

Пусть эта преобразованная матрица будет Z, а матрица основных компонентов будет U.
Итак, Z = XU
где
Z = [[a₁' b₁'] [a₂' b₂']….[ aₙ' bₙ']] — размер n x m
U = [PC₁ PC₂ …. PC] — Размер m x m, где PC₁ как u₁, PC₂ как u₂ и так далее
X = [[a₁ b₁] [a₂ b₂]….[aₙ bₙ]] — размер n x m

Для уменьшения размеров нам нужно выбрать только k главных компонент с k‹m, чтобы размер нашего U уменьшился до m x k , таким образом уменьшая размер Z до n x k. Но для этого нам нужно иметь специальное свойство для нового базиса, которое мы выбрали, которое фактически делает их основными компонентами.

Чтобы наше k было меньше, чем m, нам придется пожертвовать объяснением некоторой дисперсии данных. С другой стороны, мы должны быть уверены, что наш новый k-мерный базис объясняет большую часть дисперсии данных. В простом случае, когда о PCA ничего не известно, одним из способов сделать это может быть просто вычисление дисперсии данных по каждому исходному базису. Для двумерных данных мы можем выполнить это действие и выяснить, насколько велика дисперсия по признаку 1 и признаку 2 соответственно, а затем проигнорировать вариант с меньшей дисперсией, поскольку эта функция дает нам меньше информации о распространении данных. Но мы можем лучше!!
Поскольку мы преобразуем пространство в новый базис, интуитивно понятно выбрать один из базисных векторов нового базиса таким образом, чтобы дисперсия данных вдоль этого базисного вектора была максимальной, чтобы, когда время приходит к выбору верхних k базисных векторов, мы автоматически выбираем те, которые объясняют наибольшую долю дисперсии исходных данных. Таким образом, наш первый базисный вектор (который также будет нашим «первым» главным компонентом) всегда должен быть вектором, вдоль которого дисперсия данных является самой высокой. (Это также можно рассматривать как подбор линии по данным, которые имеют минимальную ошибку реконструкции — линию наилучшего соответствия, но это объяснение с самой высокой дисперсией имеет решающее значение для нашей математики в дальнейшем)

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

Дисперсия n чисел в вектор-столбце L= [L₁, L₂, … Lₙ]' в терминах линейной алгебры определяется как 1/n*(L' L)
(С этого момента мы используем 'как символ транспонирования вектора или матрицы, т.е. если A — вектор или матрица, то A' — его транспонирование)

Если zᵢ (столбец в Z) дает проекции всех точек на uⱼ(или PCⱼ —одна из главные компоненты), j-й столбец матрицы U, тогда zⱼ = Xuⱼ

Если обозначить дисперсию преобразованных данных Z вдоль вектора uⱼ (т. е. дисперсию массива zᵢ, который содержит проекции всех точек из Z на uⱼ)как σ²(uⱼ),
затем σ²(uⱼ)
= 1/N(zⱼ'zⱼ)
= 1/N((Xuⱼ)'(Xuⱼ))
= 1/N(uⱼ'X'Xuⱼ)
= uⱼ'(1/n *(X'X))uⱼ
= uⱼ'Sₓuⱼ
[∵ Sₓ — ковариационная матрица для исходной матрицы данных X, Sₓ = 1/n*(X'X)]

Если мы можем найти вектор, вдоль которого дисперсия максимальна, то мы нашли одну из наших главных компонент. Итак, мы хотим найти uⱼ такое, что σ²(uⱼ) максимизируется. Мы также хотим найти uⱼ в качестве единичного вектора, потому что мы хотим использовать его в качестве основы для нашего нового пространства.

Таким образом, это превращается в задачу оптимизации
Максимизировать σ²(uⱼ) по uⱼ при условии uⱼ’uⱼ = 1

т. е. max {uⱼ’Sₓuⱼ} с.т. uⱼ’uⱼ = 1

Используя множитель Лагранжа, становится

𝔏(uⱼ, λ) = max {uⱼ’Sₓuⱼ - λ(uⱼ’uⱼ -1)}

Стационарные точки (минимумы, максимумы или седловые точки) исходной ограниченной цели существуют, когда производная лагранжиана относительно. uⱼ равно 0, т. е.
d (𝔏(uⱼ, λ))/d uⱼ = 0
∴ d(uⱼ'Sₓuⱼ)/d uⱼ -λ*d (uⱼ'uⱼ - 1)/d uⱼ = 0
(Sₓuⱼ)' + (uⱼSₓ) -λ*(uⱼ' + uⱼ') = 0 [с использованием цепного правила]< br />2uⱼ'Sₓ = 2λuⱼ'
uⱼ'Sₓ = λuⱼ'
∴ (uⱼ' Sₓ)' = (λuⱼ')' [Транспонирование обеих сторон]
Sₓ'uⱼ = λuⱼ
Sₓuⱼ = λuⱼ [∵ Sₓ = сₓ']

Экстремумы возникают при выполнении этого условия.

Приведенное выше уравнение такое же, как и для нахождения собственных векторов для ковариационной матрицы Sₓ. Не вдаваясь слишком глубоко в собственные векторы, резюмируя, когда мы видим уравнение вида Av = λv, где A — матрица, v — вектор, а λ — действительное число, мы говорим, что v — это Собственный вектор матрицы A, а соответствующее значение λ — это собственное значение, соответствующее этому собственному вектору.
Этассылка — отличный ресурс для интуитивного понимания собственных векторов и собственных значений.

И значения в этих точках решения для цели можно найти, поместив вышеуказанное условие в uⱼ’Sₓuⱼт.е. значение целевой величины в критических точках равно uⱼ’Sₓuⱼ = uⱼ’λuⱼ = λuⱼ’uⱼ = λ, т. е. собственное значение, соответствующее собственному вектору.

Задача оптимизации имеет столько решений, сколько собственных векторов ковариационной матрицы, поэтому существует столько возможных значений uⱼ, сколько собственных векторов для Sₓ, и каждое из этих имеет соответствующее собственное значение.

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

Если λⱼ является собственным значением для собственного вектора (и, следовательно, главного компонента) uⱼ, то
∑ ⱼ λⱼ = σ²(Z) = σ²(X) (дисперсия исходных данных), если мы рассмотрим все возможные собственные векторы и сделаем не уменьшать размерность данных.
Итак, тогда
Explained_Variance_Frac(j) = λⱼ / (∑ ⱼ λⱼ) фактически даст долю дисперсии исходных данных, объясненную главным компонентом uⱼ.
На практике мы выбираем top k главных компонент, таких, что
∑ ⱼ Explained_Variance_Frac(j) максимально возможное значение.

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

Некоторые предостережения

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

Центрирование данных — важный первый шаг перед началом поиска собственных векторов. Sₓ = 1/N(X’X) — ключевое тождество, которое мы использовали в нашем выводе, и для того, чтобы это тождество было верным, X должна быть матрицей центрированных точек данных. Другими словами, для каждой точки данных, если исходное значение Feature 1 равно v, тогда значение в матрице X должно быть v -mean(Feature 1),и т. д. для всех функций. Отсутствие центрирования данных также повлияет на ориентацию (направление) основных компонентов, которые мы находим. Эта ветка на stackexchange.com дает отличное объяснение того, как это могло произойти.

Масштабирование данных имеет важное значение, чтобы привести все функции к сопоставимому диапазону. Немасштабированная переменная означает, что диапазоны функции 1 и функции 2 могут сильно отличаться друг от друга. Поскольку наш алгоритм, который мы изучали до сих пор, будет пытаться найти вектор, который максимизирует дисперсию вдоль него, будет доминировать объект с большим диапазоном и пытаться приблизить вектор к его ориентации, что будет несправедливо по отношению к дисперсии по другому признаку. Дисперсия по признаку после масштабирования фактически дает нам правильную форму («разброс») данных и, следовательно, приводит к правильным основным компонентам.
Например, на рис. 3 дисперсия данных по определенному направлению «кажется» значительно выше только потому, что Функция 2 варьируется в диапазоне примерно от -27 до 27 когда Признак 1 изменяется только от -5 до 5 в немасштабированных данных. Естественно, красный основной компонент в немасштабированной версии будет объяснять более высокую долю дисперсии, но это только из-за преобладания признака 2. Масштабирование признаков делает диапазоны сопоставимыми и, таким образом, дает нам лучшее представление о вариациях данных и, следовательно, о их разбросе.

Фу!! Долгий путь, но мы закончили.

Давайте попробуем подытожить процесс PCA в двух словах:

  1. Матрица данных X размерностей n x m (n — количество точек данных, а m количество функций)
  2. Центрировать и масштабировать матрицу данных X.
    Для каждого столбца c в X :
    c_new = (c — c_mean)/c_std
    Где «c_mean» — это среднее значение столбца c, а «c_std» — значение стандартного отклонения столбца c
    X
    теперь будет состоять из значений c_new , т. е. центрированных и масштабированных данных
  3. Вычислите ковариационную матрицу Sₓ (которая также будет корреляционной матрицей, поскольку наши данные масштабированы).
  4. Выполните разложение по собственным значениям на Sₓ.
  5. Расположите собственные векторы в порядке убывания собственных значений. Возьмите собственные векторы с верхними k собственными значениями и сформируйте
    матрицу U = [Eigen_Vector₁ Eigen_Vector₂ ……. Eigen_Vector] размера m x k
    где каждый Eigen_Vectorᵢ представляет собой вектор-столбец размером m x 1
  6. У нас есть матрица главных компонентов U. Просто выполните Z = XU, где Z представляет собой преобразованный набор функций, содержащий теперь k функций, где k‹‹m.

Поздравляем!! вы успешно поняли, почему и как работает PCA!!

Ссылки

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