SVD ve PCA arasındaki ilişki. PCA gerçekleştirmek için SVD nasıl kullanılır?


352

Temel bileşen analizi (PCA) genellikle kovaryans matrisinin bir öz-ayrışmasıyla açıklanır. Bununla birlikte, veri matrisinin tekil değer ayrıştırması (SVD) yoluyla da gerçekleştirilebilir . O nasıl çalışır? Bu iki yaklaşım arasındaki bağlantı nedir? SVD ile PCA arasındaki ilişki nedir?X

Başka bir deyişle, boyutsallık azaltma gerçekleştirmek için veri matrisinin SVD'si nasıl kullanılır?


8
Bu SSS tarzı soruyu kendi cevabımla birlikte yazdım, çünkü sıkça çeşitli şekillerde soruluyor, ancak kanonik bir konu yok ve bu yüzden kopyaları kapatmak zor. Lütfen bu beraberindeki meta dizisine meta yorumlar yazın .
amip


2
Onun daha da bağlantıları ile mükemmel ve ayrıntılı Amoeba'nın cevap ek olarak ben kontrol etmek önerebilir bu PCA yan yana diğer bazı SVD tabanlı teknikler tasavvur edilmektedir. Buradaki tartışma, amiplerin neredeyse aynısı olan amip ile aynı olan cebirini, PCA'yı tarif ederken, [veya ] ' in svd ayrışmasıyla ilgili ufak bir farkla hemen hemen aynıdır. yerine - kovaryans matrisinin eigende bir araya getirilmesiyle yapılan PCA ile ilgili olduğu için kullanışlıdır. X/nX/n1X
ttnphns,

PCA, SVD'nin özel bir halidir. PCA'nın normalize edilmiş verilere, ideal olarak aynı üniteye ihtiyacı var. Matris PCA'da nxn'dir.
Orvar Korvar

@OrvarKorvar: Hangi nxn matrisinden bahsediyorsun?
Cbhihe

Yanıtlar:


412

Let veri matrisi olması boyutu, numune sayısıdır ve değişken sayısıdır. Bunun ortalanmış olduğunu , yani sütun araçlarının çıkarıldığını ve şimdi sıfıra eşit olduğunu kabul edelim .Xn×pnp

Sonra kovaryans matrisi verilir . Bu simetrik bir matristir ve bu yüzden köşegenleştirilebilir: bir özvektör matrisi (her bir sütun, bir özvektördür) ve bir olduğu köşegendeki azalan düzende özdeğerleri olan bir köşegen matris . Özvektörler ana eksen veya verinin ana yönleri olarak adlandırılır . Ana eksenlerdeki verilerin projeksiyonlarına, PC puanları olarak da bilinen ana bileşenler denir.p×pCC=XX/(n1)

C=VLV,
VLλi; bunlar yeni, dönüştürülmüş değişkenler olarak görülebilir. temel bileşen ile verilir-inci ve inci kolonu . Yeni PC alanındaki inci veri noktasının koordinatları inci satırında verilmiştir .jjXViiXV

Şimdi tekil değer ayrışımı gerçekleştirmek ise , elde ettiğimiz bir ayrışma yekpare bir matris ve bir köşegen matris tekil değerler . Buradan kolayca görülebilir ki yani sağ tekil vektörler ana yönler olduğu ve tekil değerlerin ile kovaryans matrisinin özdeğerleri ile ilgili olduğu anlamına gelir. . Ana bileşenler tarafından verilmektedir.X

X=USV,
USsi
C=VSUUSV/(n1)=VS2n1V,
Vλi=si2/(n1)XV=USVV=US .

Özetlemek:

  1. Eğer , daha sonra sütun ana yön / eksenlerdir.X=USVV
  2. sütunları ana bileşenlerdir ("puanlar").US
  3. Tekil değerler kovaryans matrisinin özdeğerleriyle . Özdeğerler , ilgili PC'lerin varyanslarını göstermektedir.λi=si2/(n1)λi
  4. Standart puanlar sütunlarıyla, yükler ise sütunlarıyla verilir . Örneğin, "yüklemelerin" neden ana talimatlarla karıştırılmaması gerektiğine dair örneğin burada ve burada görün .n1UVS/n1
  5. Yukarıdaki sadece ortalanmışsa doğrudur . XAncak o zaman kovaryans matrisi eşittir .XX/(n1)
  6. Yukarıdakiler yalnızca satırlardaki örneklere ve sütunlardaki değişkenlere sahip olan için doğrudur . Değişkenler satırlar halinde ve sütunlarda örnekler ise, ve alışverişi yorumlar.XUV
  7. Eğer biri PCA'yı bir korelasyon matrisi üzerinde (bir kovaryans matrisi yerine) gerçekleştirmek isterse, o zaman sütunları sadece ortalanmamalı, standartlaştırılmalı, yani standart sapmalarına bölünmelidir.X
  8. Veri boyutunu azaltmak için için , seçme ilk sütun ve sol üst kısmını . Onların ürünleri , ilk PC içeren gerekli matrisidir .pk<pkUk×kSUkSkn×kk
  9. İlk PC'leri karşılık gelen ana eksenler verimleri matrisinin orjinal değerine sahip olması size fakat daha düşük bir değere sahip ( ). Bu matris , ilk PC'lerden gelen orijinal verilerin yeniden oluşturulmasını sağlar . Olası en düşük yeniden yapılandırma hatası var, cevabımı burada gör .kVkXk=UkSkVkn×pkXkk
  10. Açıkça söylemek gerekirse, , boyutunda ve , boyutundadır. Bununla birlikte, eğer o zaman nun son sütunları keyfidir (ve karşılık gelen sıraları sıfırdır); Bu nedenle bir tanesi kullanmalıdır ekonomi boyutu (ya da ince döner) SVD ve gereksiz sütun bırakarak, boyut. Büyük matrisi için aksi takdirde gereksiz yere çok büyük olur. Aynısı tersi durum için de geçerlidir.Un×nVp×pn>pnpUSUn×pnpUnp.

Diğer bağlantılar

Dönen PCA animasyonu


5
@Antoine, kovaryans matrisi tanım gereği değerine , burada köşeli ayraçlar ortalama değeri belirtir . Tüm bir matris satır olarak istiflendiyse , bu ifade eşittir . Eğer daha sonra ortalanmış basitleştirir için . Varyansı düşünün; değerine eşittir . Fakat eğer (yani veriler merkezlenmişse), o zaman sadece ortalama değeridir .(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2
amip,

2
PCA için SVD'den bir kod örneği: stackoverflow.com/questions/3181593/…
optimist

1
Amip, sağladığınız linkler doğrultusunda bir link daha ekleyerek sorumluluk aldım. Umarım uygun bulursunuz.
ttnphns

2
@ amoeba evet, ama neden kullanıyorsun? Ayrıca, aynı paydayı için kullanmak mümkün müdür ? Sorun şu ki, burada formülleri bunları nasıl kullanacağımı anlamaya çalışıyorum? Sλi=si2
karartır

1
@sera Sadece matrisinizi çevirin ve probleminizden kurtulun. Sadece aksi takdirde kafan karışacak.
amip

22

@ Amoeba'nın cevabına eşlik eden bir Python & Numpy pasajı yazdım ve biri için faydalı olması durumunda burada bıraktım. Yorumlar çoğunlukla @ amoeba'nın yanıtından alınmıştır.

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

PCA ile başlayalım. Her birinin d sayısından (veya boyutundan) oluşan n veri noktanız olduğunu varsayalım. Bu verileri her veri vektöründen ortalama veri noktasını çıkarın ) bir matris yapmak için verileri yığınlandırabilirsiniz.μxi

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

Kovaryans matrisi

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

Verilerinizin verildiği farklı koordinatların ne dereceye kadar olduğu ölçüler birlikte değişir. Bu nedenle, verilerinizin varyasyonunu yakalamak için tasarlanan PCA'nın kovaryans matrisi açısından verilebilmesi şaşırtıcı değildir. Özellikle, özdeğer ayrışma olduğu ortaya çıkıyorS

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

burada olan -inci Ana bileşen ya da PC ve olan -inci özdeğer arasında ve birlikte veri varyans eşittir -inci PC. Bu ayrışma lineer cebir genel teoremi geliyor ve bazı iş gelmez PCA için relatino motive etmek yapılması gerekmektedir.viiλiiSi

Rastgele Oluşturulmuş Gauss Veri Kümesinin PCA'si

SVD, matrisi sütun boşluğu ve satır boşluğu açısından anlamanın genel bir yoludur. (Herhangi bir matrisi satır ve sütun alanıyla sezgisel bir ilişkisi olan diğer matrisler açısından yeniden yazmanın bir yolu.) Örneğin, matrisi için Etki alanında ve yönlerini bulabiliriz ;A=(1201)uivi

2x2 bir örnek için SVD

Bunları, lineer bir dönüşüm olarak bir birim küre bir elips için nasıl göz önünde bulundurarak bulabilirsiniz : elipsin temel yarı eksenleri ve ile aynı onların ön görüntüleridir.ASuivi

Her durumda, yukarıdaki veri matrisi için (gerçekten, sadece ayarını yapın), SVD yazmamıza izin verirXA=X

X=i=1rσiuivjT,

burada ve özdeğer dekompozisyon ile vectors.A karşılaştırma ortonormal kümeleridir "doğru tekil vektörleri" olduğunu ortaya koymaktadır bilgisayarlar eşittir, "doğru tekil vektörleri" olarak{ui}{vi}Svi

ui=1(n1)λiXvi,

ve "tekil değerler" , veri matrisi ile ilgilidir.σi

σi2=(n1)λi.

Bu, doğru tekil vektörlerin sütun uzayını genel bir gerçektir . Bu özel durumda, bize veri bir ölçekli çıkıntı elde yönünde üzerine 'inci ana bileşen. Genel olarak sol tekil vektörler genel olarak sıra uzayını kapsar ki bu bize PC'lere benzer şekilde yayılan bir dizi ortonormal vektör verir.uiXuiXiviX

Bu uzun makalede PCA ile SVD arasındaki ilişkinin bazı detaylarına ve faydalarına değiniyorum .


Cevabınız Andre için teşekkürler. Sadece iki küçük yazım hatası düzeltmesi: 1. Son paragrafta sola ve sağa kafa karıştırıyorsunuz. 2. X için (büyük) formülde, v_i yerine v_j kullanıyorsunuz.
Alon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.