Чернетка

Аналіз головних компонент: наочне зменшення розмірності

Багато даних, які створює сучасна машинна мова, живуть у сотнях вимірів. Вбудовані слова 300-dim; характеристики зображення з магістралі CNN 512–2048 затемнені; вбудовані речення 768-dim або більше; векторів генної експресії може бути десятки тисяч. Розглядати точки в просторі такої ширини неможливо — ми можемо намалювати два чи три виміри, а не триста. Аналіз основних компонентів (PCA) є стандартним трюком, щоб обійти це: візьміть d-вимірні точки, знайдіть два (або три) напрямки, уздовж яких вони найбільше змінюються, і спроектуйте все на ці напрямки.

Результатом є двовимірна ділянка, на яку можна дивитися, зі збереженою найвидатнішою структурою оригінального простору. Ви викидаєте більшість вимірів, але виміри, які ви зберігаєте, є тими, які несуть найбільше сигналу.

Перш ніж покладатися на це, варто чітко зрозуміти, що таке PCA. По суті, це техніка розробки функцій/зменшення розмірності — етап попередньої обробки, а не сама прогнозна модель. Він бере багато корельованих функцій і повторно виражає їх у вигляді меншого набору некорельованих (основних компонентів), які потім живлять усе, що буде далі: класифікатор, алгоритм кластеризації або — коли ви зводите весь шлях до двох чи трьох вимірів — ваші власні очі. Ця стаття зосереджена на цьому останньому випадку, візуалізації, тому що вона найкраще розбірлива; але той самий механізм виконує вилучення функцій, шумозаглушення та економію обчислювальних ресурсів щоразу, коли це використовується як етап перед ML. (Ми повернемося до конкретного кадрування далі.)

Ступінь 3 керована карта лінійної алгебри — вона спрямовує ранговий мікроскоп ранг матриці на дані, а не на трансформацію.

Ідея

Уявіть собі хмару з 300-вимірних точок. Більшість із цих 300 напрямків не мають великого поширення — точки щільно згруповані вздовж них, тому вони дуже мало сприяють відрізненню однієї точки від іншої. З іншого боку, кілька напрямків є тими, вздовж яких фактично тягнуться точки. PCA знаходить ті напрямки з високою дисперсією.

Формально: PCA шукає ортогональні осі (напрямки) найбільшої дисперсії в даних. Перший головний компонент - це єдиний напрямок, уздовж якого точки розповсюджені найбільше. Другий – це напрямок наступного найбільшого поширення, перпендикулярного до першого. Третій, перпендикулярний до обох. І так далі, аж до внутрішньої розмірності даних.

Ви можете обчислити ці напрямки з власних векторів коваріаційної матриці даних (або, що еквівалентно, через SVD на центрованій матриці даних). Коли ви їх отримаєте, «проекція на перші 2» просто означає скалярний добуток кожної точки даних з кожним із двох верхніх напрямків — два дійсні числа на точку, готові до побудови.

Що ви втрачаєте: усе, що жило у викинутих напрямках. Що ви зберігаєте: домінуючу структуру, частину, яка найбільше відрізняє точки одна від одної. Для даних із декількома чіткими осями варіації це надзвичайно інформативно. Для даних, де дисперсія рівномірно розподілена між багатьма вимірами, 2D-перегляд PCA багато чого пропустить.

Перед будь-якими коваріаційними матрицями корисно відчути, що означає «напрямок найбільшої дисперсії». Наведений нижче віджет є двовимірною хмарою з однією віссю кандидата, що проходить через її центр. Кожна проекція точки на вісь є порожнистим колом; сірий сегмент - це біт, який ви б відкинули. Покрутіть вісь за допомогою повзунка — або натисніть ОПТИМІЗУВАТИ — і спостерігайте VAR, дисперсію проекцій:

PCA = find the axis of maximum variance
VAR: 1669.39
axis angle0°
Light dots are the data; the yellow line is a candidate axis through their centroid. Each hollow circle is a data point's projection onto that axis, and the grey segment is what projecting throws away — the residual. VAR is the variance of the projections along the line. Drag the slider or hit OPTIMIZE: the axis settles on the direction the cloud is most stretched along — PC1. That same direction maximises the projected variance and minimises the total residual; spreading the projections out and shrinking the grey segments are the same move.

Дві речі рухаються разом, коли ви повертаєте лінію. Коли проекції розходяться (високий VAR), сірі залишкові сегменти стають короткими; коли вони збираються (низький VAR), залишки стають довгими. Це не збіг — згідно з теоремою Піфагора, загальний розкид = прогнозована дисперсія + залишковий залишок є константою, тому максимізація дисперсії, яку ви зберігаєте, точно така ж, як мінімізація помилки, яку ви відкидаєте. Вісь, яка виграє обидва, — PC1. (Це кадрування — поворот осі, зчитування дисперсії — запозичено з інтерактивного пояснювача PCA Kynd.)

Звідки походять напрямки: коваріаційна матриця

Обертання осі вручну знаходить PC1, але вам не потрібно шукати — основні напрямки випадають прямо з однієї матриці. Візьміть свої дані як матрицю m × 2 X (m людей, дві характеристики — скажімо, зріст і вага), відніміть середнє значення кожного стовпця, щоб хмара була зосереджена на початку координат, і сформуйте

X⊤X=[var(x1)cov(x1,x2)cov(x1,x2)var(x2)]X^\top X = \begin{bmatrix} \mathrm{var}(x_1) & \mathrm{cov}(x_1, x_2) \\ \mathrm{cov}(x_1, x_2) & \mathrm{var}(x_2) \end{bmatrix}

Це 2 × 2 є коваріаційною матрицею. Його діагональні записи є дисперсією кожної ознаки окремо; поза діагоналлю — це коваріація між ними — наскільки вони рухаються разом. Конкретніше, для трьох людей зростом 5, 6, 7 футів:

  • Якщо вищі люди також важчі (вага 120, 160, 220), недіагональ виходить позитивною (≈ +100) — зріст і вага зростають разом.
  • Повторно перетасуйте так, щоб найвища людина була найлегшою (вага 160, 220, 120), і той самий розрахунок дає негативну недіагональ (≈ −40) — елементи тепер тягнуться одна до одної.

Оскільки XᵀX побудовано з даних, помножених на його власне транспонування, він завжди є квадратним і симетричним — що, судячи з зображення власного вектора, означає, що його власні вектори гарантовано дійсні та ортогональні. І ось суть, до якої все це йшло:

Власні вектори коваріаційної матриці є головними компонентами X. Кожен власний вектор вказує вздовж напрямку зміни даних, а його власне значення є саме дисперсією в цьому напрямку.

Отже, PCA — це просто: відцентруйте дані, побудуйте коваріаційну матрицю, візьміть її власні вектори та відсортуйте їх за власним значенням. Віджет нижче показує, що це відбувається. Перемикайтеся між трьома наборами даних і спостерігайте за недіагональним знаком перевороту коваріаційної матриці, коли хмара нахиляється — і дивіться, як власні вектори (кольорові осі ПК) коливаються, лежачи вздовж розповсюдження даних, причому PC1 завжди заявляє про найбільшу дисперсію:

mean-centred data — coloured lines are the eigenvectors (principal components)
covariance matrix XᵀX / n
4.854.19
4.194.25
diagonal = variance per feature · off-diagonal (pink) = covariance
PC1 (0.73, 0.68) · λ = 8.75 (96% of variance)
PC2 (-0.68, 0.73) · λ = 0.35 (4% of variance)
The eigenvalue is the variance of the data along its eigenvector — so PC1 is the single direction of greatest spread.

Зверніть увагу, що PC1 і PC2 залишаються перпендикулярними в кожному наборі даних — це симетрія коваріаційної матриці, яка виконує свою роботу. Коли характеристики некорельовані, недіагональ знаходиться поблизу нуля, а головні компоненти вирівнюються з вихідними осями; чим більше нахиляється хмара, тим більша коваріація і тим більше PC1 відхиляється від осей, щоб переслідувати поширення.

Є другий маршрут у тих самих напрямках. Замість того, щоб формувати XᵀX і брати його власні вектори, ви можете виконати SVD безпосередньо на центрованій матриці даних X = U Σ Vᵀ — стовпці V виходять рівними власним векторам вище, а квадрат сингулярних значень у Σ пропорційний власним значенням (відхилення). Це та сама лінія, знайдена іншим шляхом. На практиці це маршрут, яким насправді користуються такі бібліотеки, як scikit-learn, тому що формування XᵀX зводить число умови в квадрат і втрачає точність, тоді як SVD працює на X прямо. Це також шлях статті word2vec, коли він стискає матрицю спільного входження слово за словом до щільних вбудовувань — та сама ідея «знайти основні напрямки варіації та спроектувати на них», застосована до матриці V × V замість 2D-хмари.

Приклад іграшки: 2D → 1D

Перш ніж масштабувати до 300 розмірів, це допоможе побачити механіку в налаштуваннях, які ви можете намалювати. Ось десять точок у 2D — п’ять кіл і п’ять трикутників — які лежать приблизно вздовж лінії 45°:

baby PCA · 2D → 1D
A. original
x₁x₂
B. rotated axes
PC1PC2
C. project onto PC1
PC1
Panel A: ten 2D points in two clusters that happen to lie along a 45° line. Panel B: the dashed yellow line is the direction of greatest variance — call it PC1. The blue line, perpendicular to it, is PC2 (very little spread along this axis). Panel C: drop PC2 and keep only the PC1 coordinate of each point. The clusters stay separated — we threw away one dimension and lost almost nothing.

Сенс панелі A полягає в тому, щоб помітити, що дві функції x₁ і x₂ насправді не є незалежними. Знання точки x₁ багато розповість про її x₂, оскільки точки простягаються в одному напрямку. Дисперсія вздовж діагоналі 45° велика; перпендикулярна до нього дисперсія мала.

Панель B робить це спостереження. Пунктирна жовта лінія — це перший головний компонент (PC1) — напрямок, уздовж якого дані поширюються найбільше. Синя лінія — PC2, перпендикулярна до неї. PC2 фіксує невелике коливання по діагоналі.

Панель C є проекцією: збережіть лише координату PC1 кожної точки, відкиньте PC2. Ми перейшли від 2D до 1D, але кола все ще чітко розташовані ліворуч від трикутників. Структура, яка мала значення для розрізнення двох кластерів, існувала повністю вздовж PC1, тому вимір, який ми відкинули, коштував нам майже нічого.

Ви навіть можете використовувати проекцію для класифікації нових точок. Передайте моделі форму без міток, спроектуйте її на PC1 і перевірте, чи вона розташована ліворуч чи праворуч від межі між двома групами — цього достатньо, щоб назвати її колом чи трикутником. Заковика в тому, що це працює лише в тому випадку, якщо нову точку взято з того самого розподілу, що й дані PCA. Якщо базова геометрія змінилася, PC1 більше не є правою віссю для проектування, а «ліворуч від межі» перестає означати те, що було раніше.

Це PCA в мініатюрі. Та сама процедура масштабується: у 300 вимірах знайдіть напрямок найбільшої дисперсії, потім наступний найбільший перпендикуляр до нього, потім наступний і збережіть стільки, скільки у вас є місця для побудови. 2D, який ви зберігаєте, вартий того, щоб його зберегти.

Реальний приклад: набір даних Iris, 4D → 2D

Приклад іграшки був 2D, тому ми могли намалювати і дані, і проекцію. Однак сенс PCA полягає в тому випадку, коли ви не можете намалювати дані. Класичний приклад — той, який представив PCA поколінням статистиків — виміри райдужки Едгара Андерсона, зібрані Р. А. Фішером у 1936 році. Це 150 квіток трьох видів — setosa, versicolor, virginica — з чотирма характеристиками, виміряними на кожному: довжина чашолистка, ширина чашолистка, довжина пелюстки, ширина пелюстки. Це створює матрицю даних 150 × 4. Чотири функції означають, що кожна квітка є точкою в 4D-просторі, а 4D — це рівно один вимір за тим, що ми можемо намалювати.

Тож ми запускаємо рецепт із останнього розділу, лише з чотирма функціями замість двох:

  1. Виправте середнє значення 150 × 4 матриці X (по центру кожного стовпця).
  2. Сформуйте коваріаційну матрицю XᵀX — a 4 × 4 = (4×150)·(150×4), квадратну та симетричну, тож вона має чотири дійсних ортогональних власних вектора.
  3. Відсортуйте власні вектори за їхніми власними значеннями та збережіть два верхніх, складаючи їх у матрицю 4 × 2 W_r (“W-зменшена”).
  4. Проект: T = X · W_r, матриця 150 × 2. Кожна квітка тепер має два числа — її координати вздовж PC1 і PC2 — і нові осі більше не означають «ширину пелюстки»; кожна з них є сумішшю всіх чотирьох оригінальних ознак, зважених за тим, наскільки кожна з них сприяє цьому напрямку дисперсії.

Для райдужної оболонки ця проекція топ-2 надзвичайно достовірна: лише PC1 фіксує 92% загальної дисперсії, а два верхніх разом фіксують 98%, тому 2D-зображення майже нічого не викидає. Ось результат — почніть лише з проекції, а потім розкрийте позначки видів (яких PCA ніколи не бачив):

PC1 · 92% of variancePC2 · 5%
150 flowers, 4 features each, projected onto the top 2 principal components. One tight group sits well apart from a larger, looser group — already visible without any labels.

Без жодних ярликів проекція вже показує одну тісну групу, яка сидить далеко від більшої, вільнішої. Розфарбуйте за справжніми видами, і ви зрозумієте, чому: setosa лінійно розділяється вздовж PC1, тоді як versicolor і virginica перекриваються — їх справді важче відрізнити від цих чотирьох вимірювань, і PCA чесно говорить про це, а не винаходить поділ, якого немає.

Виплата - третя кнопка. Оскільки спроектовані точки вже належать до видимих ​​груп, ви можете передати немічені 2D-дані алгоритму кластеризації — K-means з k=3, який виконує ітерацію, щоб знайти три центроїди та призначає кожну точку найближчій — і він відновлює вид приблизно 89% часу, по суті, з усіма помилками в перекритті versicolor/virginica. PCA знайшов структуру; K-значить назвав це; жодному з них ніколи не казали, що таке райдужка. Це об’єднання — зменшення розмірів за допомогою PCA, а потім кластер — це робоча конячка дослідницького аналізу даних.

Конкретний приклад: word2vec пари країна/велика

Вбудовані слова роблять чітку ілюстрацію. Навчена модель word2vec призначає кожному слову у своєму словнику вектор у деякому просторі — як правило, 300 вимірів. Пари споріднених слів, як-от france/paris, germany/berlin, japan/tokyo, мають узгоджені векторні зсуви: напрямок france → paris є приблизно таким же напрямком, як germany → berlin і japan → tokyo. Це знаменита «аналогічна арифметика» — paris − france + germany ≈ berlin.

Геометрія існує в 300 вимірах, але зсув «країна → столиця» здебільшого є одним напрямком. PCA, враховуючи кілька пар країна/столиця, має вважати його одним із основних основних компонентів — і двовимірна проекція має зробити видимим паралелізм.

Наведений нижче віджет виконує PCA на векторах GloVe-300 для 12 пар країни/столиці, проектує їх у 2D і з’єднує кожну пару пунктирною лінією:

country/capital pairs · 2D PCA of GloVe-300 vectors
francegermanyitalyspainportugaljapanchinarussiaegyptgreecepolandturkeyparisberlinromemadridlisbontokyobeijingmoscowcairoathenswarsawankara
country
capital
country → capital
vectors: glove-wiki-gigaword-300
the dashed lines are the "capital-of" relation projected to 2D. they're roughly parallel — the same offset that takes france → paris also takes germany → berlin, russia → moscow, and so on. that parallelism is what makes v(paris) − v(france) + v(germany) ≈ v(berlin) work. PCA preserves only the strongest two directions; in the full 300-dimensional space the alignment is much cleaner.

Пунктирні лінії приблизно паралельні. Завдяки такому паралелізму арифметика аналогії працює: вектор, який ви б додали до france, щоб приземлитися на paris, приблизно такий самий вектор, який ви б додали до germany, щоб потрапити на berlin, або russia, щоб приземлитися на moscow. Відношення «столиці» має послідовний напрямок у вихідному просторі 300-dim, і PCA зберігає його достатньо, щоб 2D-проекція була видимою.

Кілька речей, які варто звернути на цю точку зору:

  • PCA не знає міток. Не було сказано, які пункти є країнами, а які столицями, або що вони йдуть парами. Він знайшов напрямки найбільшої дисперсії в необроблених векторах і спроектував на два верхні. Розділення країна/столиця випадає через те, як точки фактично розташовуються в просторі 300-dim — столиці справді знаходяться в іншому регіоні, ніж країни, тому що вони з’являються в інших контекстах у навчальному корпусі.
  • Паралелізм не ідеальний. Деякі лінії більш жорсткі, ніж інші. У повному просторі 300-dim вирівнювання набагато чистіше; двовимірна проекція відкидає більшість розмірів, і частина цієї втраченої дисперсії сприяла напрямку «столиці». Отже, візуалізація є вірним, але дещо деградованим зображенням фактичної структури.
  • Зберігається лише домінантна структура. Інші напрямки в оригінальному просторі — дієслівні часові зміщення, гендерні зсуви, формально-неформальні зсуви — існують, але їх пригнічують у цьому 2D-поданні, оскільки вони відбуваються вздовж осей, які не входять до двох верхніх для цієї конкретної підмножини точок. Якщо ви запустите PCA на іншій підмножині словника, ви побачите іншу структуру, що вискочить, оскільки 2 головних напрямки дисперсії зміниться.

Крім візуалізації: PCA як попередня обробка

Дотепер усе використовувало PCA, щоб бачити — стискати багатовимірні дані до 2D і переглядати їх. Але та сама проекція так само часто є етапом попередньої обробки, який подає іншу модель, а не людське око. Три речі роблять його там корисним:

  • Вилучення функцій. Основними компонентами є нові функції, кожна з яких є зваженим поєднанням оригіналів, упорядкованих за кількістю відмінностей, які вони несуть. Збереження кількох верхніх дає компактний, декорельований набір функцій, який зберігає більшу частину сигналу.
  • Зменшення шуму. Дисперсія, яка живе в напрямках низьких власних значень, які відхиляються, часто є джиттером або шумом вимірювання, а не структурою. Відмова від цих напрямків може діяти як шумопоглинач, згладжуючи осі, уздовж яких дані ледве рухаються.
  • Економія обчислень. Менша кількість функцій означає менше тренувань — швидші підгонки, менший обсяг пам’яті, а іноді й краще узагальнення, оскільки модель із меншою кількістю вхідних даних має менше способів переоформлення.

Яскравий приклад із реального світу походить з анестезіології за допомогою книги Аніла Анантасвамі Чому машини навчаються. Емері Браун і його колеги записали ЕЕГ десяти пацієнтів, які отримували пропофол, перетворюючи кожен двосекундний інтервал у 100-вимірний вектор характеристик спектральної щільності потужності. Сім слотів суб’єктів складаються в матрицю 37,800 × 100 X (7 × 5400 часових інтервалів). Запустіть рецепт: середнє-правильне, сформуйте коваріаційну матрицю 100 × 100 XᵀX, візьміть її власні вектори.

Ось поворот, який робить приклад вартим розповіді. Вони зберегли перші три власні вектори — матрицю 100 × 3 — а потім викинули перший. PC1 фіксує найбільшу дисперсію, але ця домінуюча варіація виявилася не має нічого спільного зі свідомістю; це був інший, більший вплив на ЕЕГ. Зберігаючи його, ви витратили б дорогоцінну вісь на фактор неприємностей. Отже, Wᵣ стає матрицею 100 × 2 — другий і третій компоненти — і проектування даних 5,400 × 100 суб’єкта через неї (5,400 × 100 · 100 × 2) дає матрицю 5,400 × 2: кожні дві секунди стану як одна точка на площині.

Нанесіть ці точки — сірі кружечки для свідомості, чорні трикутники для несвідомості — і два стани розділяться на здебільшого окремі кластери. Не ідеально: кілька трикутників розташовано серед кіл і навпаки, тому жодна пряма лінія не розділяє їх чітко, що означає, що перцептрон ніколи не сходиться, але наївний класифікатор Байєса чи k-найближчого сусіда все одно знаходить придатну межу. Тренуйте цей класифікатор на 2D-точках, а потім перевірте на трьох відкладених суб’єктах: спроектуйте кожен із їхніх векторів 100-dim через той самий Wᵣ, запитайте класифікатора «свідоме чи несвідоме?» і перевірте правдивість на землі. PCA виконав важку роботу — згорнув 100 зашумлених вимірів до двох важливих — і простий класифікатор завершив роботу.

Цей хід «відмовтеся від PC1, тому що його дисперсія є неправильною дисперсією» є практичним обличчям припущення, закладеного глибоко в PCA, яке варто вивчити безпосередньо.

Що PCA зберігає, що втрачає

PCA - це лінійна проекція. Це має два важливі наслідки:

  • Зберігає лінійну структуру — прямі лінії у вихідному просторі стають прямими лініями в проекції, паралельні зміщення залишаються (приблизно) паралельними, а відстані вздовж верхніх компонентів зберігаються. Ось чому виживають відносини «послідовного векторного зміщення», як-от країна/столиця.
  • Це може спотворити нелінійну структуру — кластери, які вигинаються через вихідний простір, або структура, для перегляду якої потрібні нелінійні комбінації розмірів, виглядатимуть гірше, ніж є. У таких випадках нелінійні методи, такі як t-SNE або UMAP, є сильнішими; вони створені для збереження місцевих околиць ціною спотворення глобальної геометрії.

Простий спосіб подумати про компроміс: 2D-вид PCA відповідає на питання: «Якщо мені потрібно намалювати це за допомогою однієї лінійної проекції, яка з них найкраща?» t-SNE та UMAP відповідають: “Яке двовимірне розташування зберігає, які точки знаходяться поруч одна з одною?” Вони дають різні погляди та корисні для різних питань.

Існує глибше припущення, закладене в PCA, яке варто назвати: воно прирівнює відмінність до важливості. Виміри, які ви відкидаєте, є маловаріантними, але напрямок, у якому дані ледве рухаються, все одно може бути тим, який насправді розділяє класи, які вас цікавлять. Трапляється й протилежне: напрямок із високою дисперсією може просто фіксувати шум, артефакти масштабу або якийсь домінуючий неприємний фактор, який не має нічого спільного з тим, що ви намагаєтеся передбачити — саме те, що сталося з PC1 у наведеному вище прикладі ЕЕГ. PCA не контролюється — він не знає ваших міток — тому «найвищий компонент» означає лише «найбільшу дисперсію», а не «найпередбачуваніший». Коли ця прогалина має значення, підконтрольні двоюрідні брати, такі як лінійний дискримінантний аналіз (LDA), знаходять напрямки, які розділяють відомі класи, а не напрямки, які максимізують загальне поширення.

Коли звертатися до PCA

PCA є правильним першим інструментом, коли:

  • У вас є безперервні високовимірні вектори з глобальною структурою, яку варто побачити — вбудовування, зчитування датчиків, профілі експресії генів.
  • Вам потрібна детермінована проекція, яку можна інтерпретувати — головні компоненти PCA — це чітко визначені напрямки, які можна обчислити, зберегти та застосувати до нових точок (на відміну від t-SNE/UMAP, які підходять для кожного набору даних).
  • Ви хочете розуміти дисперсію — PCA також повідомляє вам, яку дисперсію охоплює кожен компонент, що є справді інформативним («2 найвищі компоненти пояснюють 65% загальної дисперсії» є значущим твердженням).

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

Подальше читання

Перегляд зображення

Змінюйте масштаб жестом щипка або клавішами + / −. Переміщуйте зображення перетягуванням або стрілками. Esc — закрити.