ความสัมพันธ์ระหว่าง SVD และ PCA วิธีการใช้ SVD เพื่อทำ PCA


351

การวิเคราะห์องค์ประกอบหลัก (PCA) มักจะอธิบายผ่านการสลายตัวไอเก็นของเมทริกซ์ความแปรปรวนร่วม แต่ก็ยังสามารถดำเนินการผ่านการย่อยสลายมูลค่าเอกพจน์ (SVD) ของเมทริกซ์ข้อมูลXมันทำงานยังไง? การเชื่อมต่อระหว่างสองแนวทางนี้คืออะไร? ความสัมพันธ์ระหว่าง SVD และ PCA คืออะไร?X

หรือกล่าวอีกนัยหนึ่งว่าจะใช้ SVD ของ data matrix เพื่อลดมิติข้อมูลได้อย่างไร?


8
ฉันเขียนคำถามสไตล์คำถามที่พบบ่อยนี้พร้อมกับคำตอบของฉันเองเพราะมันถูกถามบ่อยในรูปแบบต่าง ๆ แต่ไม่มีเธรดที่ยอมรับดังนั้นการปิดซ้ำจึงเป็นเรื่องยาก โปรดแสดงความคิดเห็นเมตาในเมตาดาต้าที่มาพร้อมกับนี้
อะมีบา


2
นอกจากคำตอบของอะมีบาที่ยอดเยี่ยมและมีรายละเอียดพร้อมลิงก์เพิ่มเติมแล้วฉันอาจแนะนำให้ตรวจสอบเรื่องนี้โดยที่ PCA ได้รับการพิจารณาโดยเทคนิคเทคนิค SVD อื่น ๆ การสนทนาที่นั่นนำเสนอพีชคณิตเกือบจะเหมือนกันกับอะมีบาด้วยความแตกต่างเพียงเล็กน้อยที่คำพูดที่นั่นในการอธิบาย PCA ไปเกี่ยวกับการสลายตัว svd ของ [หรือX/X/n ] แทนที่จะเป็น X- ซึ่งสะดวกสบายเพราะเกี่ยวข้องกับ PCA ที่ทำผ่าน eigendecomposition ของเมทริกซ์ความแปรปรวนร่วม X/n1X
ttnphns

PCA เป็นกรณีพิเศษของ SVD PCA ต้องการข้อมูลที่ได้รับการปรับให้เป็นมาตรฐานและเป็นหน่วยเดียวกัน เมทริกซ์คือ nxn ใน PCA
Orvar Korvar

@OrvarKorvar: คุณกำลังพูดถึง nxn matrix อะไร?
Cbhihe

คำตอบ:


412

ให้ data matrix มีขนาดn × pโดยที่nคือจำนวนตัวอย่างและpคือจำนวนของตัวแปร ขอให้เราสมมติว่ามันอยู่ตรงกลางนั่นคือลบคอลัมน์หมายความว่าและตอนนี้เท่ากับศูนย์Xn×pnp

จากนั้นแปรปรวนเมทริกซ์Cจะได้รับจากC = XX / ( n - 1 ) มันเป็นเมทริกซ์สมมาตรและดังนั้นจึงสามารถ diagonalized: C = V L Vโดยที่Vเป็นเมทริกซ์ของ eigenvector (แต่ละคอลัมน์เป็น eigenvector) และLเป็นเมทริกซ์ทแยงมุมที่มี eigenvalues λ iในลำดับลดลงในแนวทแยง . eigenvectors เรียกว่าแกนหลักหรือทิศทางหลักp×pCC=XX/(n1)

C=VLV,
VLλiของข้อมูล การคาดการณ์ของข้อมูลบนแกนหลักจะเรียกว่าองค์ประกอบหลักยังเป็นที่รู้จักคะแนนพีซี ; สิ่งเหล่านี้สามารถถูกมองว่าเป็นตัวแปรใหม่ที่เปลี่ยนแปลงได้ -th องค์ประกอบหลักจะได้รับจากเจคอลัมน์ -th ของX V พิกัดของฉันจุดข้อมูล -th ในพื้นที่คอมพิวเตอร์เครื่องใหม่จะได้รับโดยผมแถว -th ของX VjjXViiXV

ถ้าตอนนี้เราดำเนินการสลายตัวมูลค่าเอกพจน์เราได้รับการสลายตัวX = U S V ,ที่Uเป็นเมทริกซ์รวมและSเป็นเมทริกซ์ทแยงมุมของค่าเอกพจน์sฉัน จากที่นี่เราสามารถเห็นได้ว่าC = V S UU S V/ ( n - 1 ) = V S 2X

X=USV,
USsiหมายความว่าสิทธิเวกเตอร์เอกพจน์Vคือเส้นทางหลักและค่าเอกพจน์ที่เกี่ยวข้องกับลักษณะเฉพาะของความแปรปรวนเมทริกซ์ผ่านλฉัน=s 2 ฉัน /(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. n1UVS/n1
  5. XXX/(n1)
  6. XUV
  7. X
  8. pk<pkUk×kSUkSkn×kk
  9. kVkXk=UkSkVkn×pkXkk
  10. Un×nVp×pn - P U S U n × P n » P U n « หน้าn>pnpUSUn×pnpUจะเป็นอย่างอื่นที่ไม่จำเป็นขนาดใหญ่ เช่นเดียวกับสถานการณ์ตรงข้ามของพีnp

ลิงค์เพิ่มเติม

การหมุนภาพเคลื่อนไหว PCA


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

2
ตัวอย่างโค้ดสำหรับ PCA โดย SVD: stackoverflow.com/questions/3181593/…
optimist

1
อะมีบาฉันมีหน้าที่รับผิดชอบในการเพิ่มอีกหนึ่งลิงก์ให้สอดคล้องกับลิงก์ที่คุณให้ หวังว่าคุณจะเหมาะสม
ttnphns

2
Sλi=si2

1
@sera เพียงแค่เปลี่ยนเมทริกซ์ของคุณและกำจัดปัญหาของคุณ คุณจะสับสนอย่างอื่นเท่านั้น
อะมีบา

22

ฉันเขียน Python & Numpy snippet ที่มาพร้อมกับคำตอบของ @ 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 ของชุดข้อมูล Gaussian ที่สร้างแบบสุ่ม

A=(1201)uivi

SVD สำหรับตัวอย่าง 2x2

ASuivi

XA=X

X=i=1rσiuivjT,

{ui}{vi}Svi

ui=1(n1)λiXvi,

σi

σi2=(n1)λi.

uiXuiXiviX

ผมไปในรายละเอียดมากขึ้นและประโยชน์ของความสัมพันธ์ระหว่าง PCA และ SVD ในบทความนี้อีกต่อไป


ขอบคุณสำหรับ anser Andre ของคุณ เพียงแค่การแก้ไขความผิดพลาดเล็ก ๆ สองประการ: 1. ในย่อหน้าสุดท้ายคุณจะสับสนไปทางซ้ายและขวา 2. ในสูตร (ตัวพิมพ์ใหญ่) สำหรับ X คุณใช้ v_j แทน v_i
Alon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.