Зв'язок між SVD та PCA. Як використовувати SVD для виконання PCA?


351

Аналіз основних компонентів (PCA) зазвичай пояснюється шляхом власного розкладання коваріаційної матриці. Тим НЕ менше, він також може бути виконаний з допомогою сингулярного розкладання (SVD) матриць даних . Як це працює? Який зв’язок між цими двома підходами? Який взаємозв'язок між SVD та PCA?X

Або іншими словами, як використовувати SVD матриці даних для виконання зменшення розмірності?


8
Я написав це запитання у стилі FAQ разом зі своєю власною відповіддю, оскільки його часто задають у різних формах, але немає канонічної нитки, і тому закрити дублікати складно. Будь ласка, надайте мета коментарі в цій супровідній метапотоці .
амеба


2
На додаток до чудової та детальної відповіді амеби та її подальших посилань, я можу порекомендувати перевірити це , коли PCA розглядається поруч з деякими іншими методами на основі SVD. У дискусії представлена ​​алгебра, майже ідентична амебі, з незначною різницею, що мова, описана PCA, йде про розкладання svd [абоX/X/n ] замість X- що просто зручно, оскільки це стосується PCA, виконаного за допомогою ейгендекомпозиції матриці коваріації. X/n1X
ttnphns

PCA - це особливий випадок SVD. PCA потребує нормалізованих даних, в ідеалі однаковий блок. Матриця nxn в PCA.
Орвар Корвар

@OrvarKorvar: Про яку матрицю nxn ви говорите?
Cbhihe

Відповіді:


412

Нехай матриця даних має розмір n × p , де n - кількість вибірок, а p - кількість змінних. Припустимо, що він по центру , тобто засоби стовпця були відняті і тепер дорівнюють нулю.Xn×pnp

Тоді ковариационной матриці C задається C = ХХ / ( п - 1 ) . Це симетрична матриця, і тому її можна діагоналізувати: C = V L V , де V - матриця власних векторів (кожен стовпець - власний вектор), а L - діагональна матриця з власними значеннями λ i у порядку зменшення по діагоналі . Власні вектори називають головними осями або основними напрямкамиp×pCC=XX/(n1)

C=VLV,
VLλiданих. Проекції даних на головні осі називаються основними компонентами , також відомими як оцінки ПК ; їх можна розглядати як нові, перетворені, змінні. -го основного компонента задається J -го стовпця X V . Координати я -й точка даних в новому просторі ПК задаються я -й рядком X V .jjXViiXV

Якщо ми зараз проведемо сингулярне розкладання значення , отримаємо розклад X = U S V , де U - унітарна матриця, а S - діагональна матриця сингулярних значень s i . Звідси легко видно, що C = V S UU S V/ ( n - 1 ) = V S 2X

X=USV,
USsiозначає, що правильні сингулярні векториVє основними напрямками і що сингулярні значення пов'язані з власними значеннями матриці коваріації черезλi=s 2 i /(n-1). Основні компоненти задаютьсяXV=USVV=US.
C=VSUUSV/(n1)=VS2n1V,
Vλi=si2/(n1)XV=USVV=US

Узагальнити:

  1. Якщо , то стовпці V - основні напрямки / осі.X=USVV
  2. Стовпці це основні компоненти ("бали").US
  3. Сингулярні значення пов'язані з власними значеннями матриці коваріації через . Власні значення λ я показую дисперсії відповідних ПК.λi=si2/(n1)λi
  4. Стандартизовані бали подаються стовпцями і навантаження задаються стовпцямиVS/n1U . Дивіться, наприклад,тутітут,чому "навантаження" не слід плутати з основними напрямками.VS/n1
  5. Сказане вище правильне, лише якщо по центру розміщено XТільки тоді матриця коваріації дорівнює .XX/(n1)
  6. Сказане вище правильне лише для мають зразки у рядках та змінні у стовпцях. Якщо змінні знаходяться у рядках, а зразки - у стовпцях, то U та V обмінюються інтерпретаціями.XUV
  7. Якщо потрібно виконати PCA на кореляційній матриці (замість коваріаційної матриці), то стовпці повинні бути не лише центрировані, а й стандартизовані, тобто поділені на їх стандартні відхилення.X
  8. Щоб зменшити розмірність даних від до K < р , виберіть K перші стовпчики U і K × K верхня ліва частина S . Їх добуток U k S k є необхідною матрицею n × k, що містить перші k ПК.pk<pkUk×kSUkSkn×kk
  9. kVkXk=UkSkVkn×pkXkk
  10. Un×nVp×pn>pnpUSUn×pnpUnp

Подальші посилання

Обертається анімація PCA


5
(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2

2
Зразок коду для PCA від SVD: stackoverflow.com/questions/3181593/…
оптиміст

1
Амеба, я взяв на себе відповідальність додати ще одне посилання відповідно до наданих вами посилань. Сподіваюсь, ви вважаєте це доречним.
ttnphns

2
Sλi=si2

1
@sera Просто перенесіть свою матрицю і позбудьтесь своєї проблеми. Ви тільки заплутаєтесь в іншому випадку.
амеба

22

Я написав фрагмент Python & Numpy, який супроводжує відповідь @ amoeba, і залишаю його тут, якщо він комусь корисний. Коментарі в основному взяті з відповіді @ amoeba.

import numpy as np
from numpy import linalg as la
np.random.seed(42)


def flip_signs(A, B):
    """
    utility function for resolving the sign ambiguity in SVD
    http://stats.stackexchange.com/q/34396/115202
    """
    signs = np.sign(A) * np.sign(B)
    return A, B * signs


# Let the data matrix X be of n x p size,
# where n is the number of samples and p is the number of variables
n, p = 5, 3
X = np.random.rand(n, p)
# Let us assume that it is centered
X -= np.mean(X, axis=0)

# the p x p covariance matrix
C = np.cov(X, rowvar=False)
print "C = \n", C
# C is a symmetric matrix and so it can be diagonalized:
l, principal_axes = la.eig(C)
# sort results wrt. eigenvalues
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
# the eigenvalues in decreasing order
print "l = \n", l
# a matrix of eigenvectors (each column is an eigenvector)
print "V = \n", principal_axes
# projections of X on the principal axes are called principal components
principal_components = X.dot(principal_axes)
print "Y = \n", principal_components

# we now perform singular value decomposition of X
# "economy size" (or "thin") SVD
U, s, Vt = la.svd(X, full_matrices=False)
V = Vt.T
S = np.diag(s)

# 1) then columns of V are principal directions/axes.
assert np.allclose(*flip_signs(V, principal_axes))

# 2) columns of US are principal components
assert np.allclose(*flip_signs(U.dot(S), principal_components))

# 3) singular values are related to the eigenvalues of covariance matrix
assert np.allclose((s ** 2) / (n - 1), l)

# 8) dimensionality reduction
k = 2
PC_k = principal_components[:, 0:k]
US_k = U[:, 0:k].dot(S[0:k, 0:k])
assert np.allclose(*flip_signs(PC_k, US_k))

# 10) we used "economy size" (or "thin") SVD
assert U.shape == (n, p)
assert S.shape == (p, p)
assert V.shape == (p, p)

21

μxi

X=(x1TμTx2TμTxnTμT).

Коваріаційна матриця

S=1n1i=1n(xiμ)(xiμ)T=1n1XTX

S

S=VΛVT=i=1rλiviviT,

viiλiiSi

PCA випадково генерованого набору даних Гаусса

A=(1201)uivi

SVD для прикладу 2х2

ASuivi

XA=X

X=i=1rσiuivjT,

{ui}{vi}Svi

ui=1(n1)λiXvi,

σi

σi2=(n1)λi.

uiXuiXiviX

У цій більш довгій статті я детальніше описую переваги стосунків між PCA та SVD .


Дякуємо за ваш ансер Андре. Всього дві невеликі виправлення помилок: 1. В останньому абзаці ви плутаєте ліву і праву. 2. У формулі (капітал) для X ви використовуєте v_j замість v_i.
Алон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.