Mối quan hệ giữa SVD và PCA. Làm thế nào để sử dụng SVD để thực hiện PCA?


352

Phân tích thành phần chính (PCA) thường được giải thích thông qua phân tách riêng của ma trận hiệp phương sai. Tuy nhiên, nó cũng có thể được thực hiện thông qua giá trị số ít phân hủy (SVD) của ma trận dữ liệu . Làm thế nào nó hoạt động? Mối liên hệ giữa hai phương pháp này là gì? Mối quan hệ giữa SVD và PCA là gì?X

Hay nói cách khác, làm thế nào để sử dụng SVD của ma trận dữ liệu để thực hiện giảm kích thước?


8
Tôi đã viết câu hỏi kiểu FAQ này cùng với câu trả lời của riêng tôi, bởi vì nó thường được hỏi dưới nhiều hình thức khác nhau, nhưng không có chủ đề chính tắc và vì vậy việc đóng các bản sao rất khó. Vui lòng cung cấp ý kiến ​​meta trong chủ đề meta đi kèm này .
amip


2
Ngoài câu trả lời tuyệt vời và chi tiết của amip với các liên kết xa hơn, tôi có thể khuyên bạn nên kiểm tra điều này , trong đó PCA được xem xét cạnh nhau một số kỹ thuật dựa trên SVD khác. Cuộc thảo luận ở đó trình bày đại số gần giống với amip với sự khác biệt nhỏ mà bài phát biểu ở đó, khi mô tả PCA, nói về sự phân rã svd của [hoặc ] thay vì - đơn giản là thuận tiện vì nó liên quan đến PCA được thực hiện thông qua việc xuất tinh của ma trận hiệp phương sai. X/X/n XX/n1X
ttnphns

PCA là trường hợp đặc biệt của SVD. PCA cần dữ liệu được chuẩn hóa, lý tưởng là cùng một đơn vị. Ma trận là nxn trong PCA.
Orvar Korvar

@OrvarKorvar: Bạn đang nói về ma trận nxn nào?
Cbhihe

Câu trả lời:


412

Đặt ma trận dữ liệu có kích thước , trong đó là số lượng mẫu và là số lượng biến. Chúng ta hãy giả sử rằng nó là trung tâm , nghĩa là cột có nghĩa đã bị trừ và bây giờ bằng không.Xn pn×pnp

Sau đó, ma trận hiệp phương sai được đưa ra bởi . Đó là một ma trận đối xứng và do đó nó có thể được diagonalized: nơi là ma trận vector riêng (mỗi cột là một eigenvector) và là một ma trận đường chéo với eigenvalues theo thứ tự giảm dần trên đường chéo. Các hàm riêng được gọi là trục chính hoặc hướng chính của dữ liệu. Dự báo dữ liệu trên các trục chính được gọi là các thành phần chính , còn được gọi là điểm số PCC C = XX / ( n - 1 ) C = V L V , V L λ i j j X V i i X Vp×pCC=XX/(n1)

C=VLV,
VLλi; chúng có thể được xem như là các biến mới, biến đổi. Thành phần chính thứ được cho bởi cột thứ của . Các tọa độ của điểm dữ liệu thứ trong không gian PC mới được cho bởi hàng thứ của .jjXViiXV

Nếu bây giờ chúng ta thực hiện phân rã giá trị số ít của , chúng ta sẽ có được một phép phân tách trong đó là ma trận đơn vị và là ma trận đường chéo của giá trị số ít . Từ đây, người ta có thể dễ dàng thấy rằng có nghĩa là các vectơ số ít bên phải là các hướng chính và các giá trị số ít có liên quan đến giá trị riêng của ma trận hiệp phương sai thông qua . Thành phần chính được đưa ra bởiX = U S V , U S s i C = V S UU S V/ ( n - 1 ) = V S 2X

X=USV,
USsiVλi=s 2 i /(n-1)XV=USVV=US
C=VSUUSV/(n1)=VS2n1V,
Vλi=si2/(n1)XV=USVV=US .

Để tóm tắt:

  1. Nếu , thì các cột của là các hướng / trục chính.X=USVV
  2. Các cột của là các thành phần chính ("điểm số").US
  3. Các giá trị số ít liên quan đến giá trị riêng của ma trận hiệp phương sai thông qua . Eigenvalues hiển thị phương sai của các PC tương ứng.λi=si2/(n1)λi
  4. Điểm chuẩn được đưa ra bởi các cột của và tải được cho bởi các cột của . Xem ví dụ ở đâyở đây để biết tại sao "tải" không nên bị nhầm lẫn với các hướng chính.n1UVS/n1
  5. Ở trên chỉ đúng nếu được căn giữa. XChỉ sau đó, ma trận hiệp phương sai bằng .XX/(n1)
  6. Ở trên chỉ đúng khi có mẫu trong hàng và biến trong cột. Nếu các biến nằm trong các hàng và mẫu trong các cột, thì và diễn giải trao đổi.XUV
  7. Nếu một người muốn thực hiện PCA trên ma trận tương quan (thay vì ma trận hiệp phương sai), thì các cột của không chỉ được đặt ở giữa mà còn được chuẩn hóa, tức là chia cho độ lệch chuẩn của chúng.X
  8. Để giảm số chiều của dữ liệu từ đến , chọn cột đầu tiên của , và phần trên bên trái của . Sản phẩm của họ là ma trận có chứa PC đầu tiên .pk<pkUk×kSUkSkn×kk
  9. Hơn nữa nhân đầu tiên máy tính bằng cách tương ứng trục chính sản lượng ma trận mà có bản gốc kích thước nhưng là thứ hạng thấp hơn (của thứ hạng ). Ma trận này cung cấp một bản dựng lại dữ liệu gốc từ PC đầu tiên . Nó có lỗi tái thiết thấp nhất có thể, xem câu trả lời của tôi ở đây .kVkXk=UkSkVkn×pkXkk
  10. Nói đúng ra, có kích thước và có kích thước . Tuy nhiên, nếu thì các cột cuối cùng của là tùy ý (và các hàng tương ứng của không đổi); do đó, người ta nên sử dụng một SVD có kích thước tiết kiệm (hoặc mỏng ) trả về có kích thước , bỏ các cột vô dụng. Đối với , ma trận nếu không sẽ rất lớn không cần thiết. Điều tương tự cũng áp dụng cho một tình huống ngược lại củaUn×nVp×pn>pnpUSUn×pnpUnp.

Liên kết khác

Xoay hoạt hình PCA


5
@Antoine, ma trận hiệp phương sai theo định nghĩa bằng , trong đó dấu ngoặc nhọn biểu thị giá trị trung bình . Nếu tất cả được xếp thành các hàng trong một ma trận , thì biểu thức này bằng . Nếu là trung tâm thì nó đơn giản hóa thành . Hãy nghĩ về phương sai; nó bằng . Nhưng nếu (tức là dữ liệu được căn giữa), thì đó đơn giản là giá trị trung bình của .(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2
amip

2
Một mẫu mã cho PCA theo SVD: stackoverflow.com/questions/3181593/ triệt
lạc quan

1
Amoeba, tôi chịu trách nhiệm thêm một liên kết phù hợp với các liên kết do bạn cung cấp. Hy vọng bạn tìm thấy nó thích hợp.
ttnphns

2
@amoeba có, nhưng tại sao lại dùng nó? Ngoài ra, có thể sử dụng cùng mẫu số cho không? Vấn đề là tôi thấy các công thức trong đó và cố gắng hiểu, làm thế nào để sử dụng chúng? Sλi=si2
Dims

1
@sera Chỉ cần hoán chuyển ma trận của bạn và thoát khỏi vấn đề của bạn. Bạn sẽ chỉ nhận được nhầm lẫn khác.
amip

22

Tôi đã viết một đoạn mã Python & Numpy đi kèm với câu trả lời của @ amoeba và tôi để nó ở đây trong trường hợp nó hữu ích cho ai đó. Các ý kiến ​​chủ yếu được lấy từ câu trả lời của @ 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

Hãy để tôi bắt đầu với PCA. Giả sử rằng bạn có n điểm dữ liệu bao gồm các số d (hoặc kích thước) mỗi điểm. Nếu bạn căn giữa dữ liệu này (trừ điểm dữ liệu trung bình từ mỗi vectơ dữ liệu ), bạn có thể xếp chồng dữ liệu để tạo ma trậnμxi

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

Ma trận hiệp phương sai

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

đo lường mức độ tọa độ khác nhau trong đó dữ liệu của bạn được cung cấp khác nhau cùng nhau. Vì vậy, có lẽ không có gì đáng ngạc nhiên khi PCA - được thiết kế để nắm bắt sự biến đổi của dữ liệu của bạn - có thể được đưa ra dưới dạng ma trận hiệp phương sai. Cụ thể, sự phân rã eigenvalue của hóa ra làS

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

trong đó là Thành phần chính thứ hoặc PC và là giá trị riêng thứ của và cũng bằng với phương sai của dữ liệu trên PC thứ . Phân hủy này xuất phát từ một định lý nói chung trong đại số tuyến tính, và một số công việc không phải được thực hiện để thúc đẩy các relatino để PCA.viiλiiSi

PCA của bộ dữ liệu Gaussian được tạo ngẫu nhiên

SVD là một cách chung để hiểu một ma trận theo không gian cột và không gian hàng của nó. (Đây là cách viết lại bất kỳ ma trận nào theo các ma trận khác có liên quan trực quan đến không gian hàng và cột.) Ví dụ: đối với ma trận chúng ta có thể tìm thấy hướng và trong miền và phạm vi sao choA=(1201)uivi

SVD cho một ví dụ 2x2

Bạn có thể tìm thấy những điều này bằng cách xem xét như một phép biến đổi tuyến tính biến hình cầu đơn vị trong miền của nó thành hình elip: bán trục chính của hình elip thẳng hàng với và là tiền đề của chúng.ASuivi

Trong mọi trường hợp, đối với ma trận dữ liệu ở trên (thực sự, chỉ cần đặt ), SVD cho phép chúng tôi viếtXA=X

X=i=1rσiuivjT,

nơi và là tập trực giao của vectors.A so sánh với sự phân hủy eigenvalue của tiết lộ rằng "vectơ đặc biệt đúng" đều bình đẳng để các máy tính, các "vectơ đặc biệt đúng" là{ v i } S v i{ui}{vi}Svi

ui=1(n1)λiXvi,

và "giá trị số ít" có liên quan đến ma trận dữ liệu thông quaσi

σi2=(n1)λi.

Đó là một thực tế chung mà các vectơ đặc biệt đúng span các không gian cột của . Trong trường hợp cụ thể này, cung cấp cho chúng tôi hình chiếu tỷ lệ của dữ liệu theo hướng của thành phần chính thứ . Các vectơ số ít bên trái nói chung trải rộng không gian hàng của , cung cấp cho chúng ta một tập các vectơ trực giao kéo dài dữ liệu giống như PC. X u i X i v i XuiXuiXiviX

Tôi đi sâu vào một số chi tiết và lợi ích của mối quan hệ giữa PCA và SVD trong bài viết dài hơn này .


Cảm ơn vì anser của bạn Andre. Chỉ cần sửa hai lỗi chính tả: 1. Trong đoạn cuối bạn sẽ nhầm lẫn trái và phải. 2. Trong công thức (viết hoa) cho X, bạn đang sử dụng v_j thay vì v_i.
Alon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.