Làm thế nào để đảo ngược PCA và xây dựng lại các biến ban đầu từ một số thành phần chính?


113

Phân tích thành phần chính (PCA) có thể được sử dụng để giảm kích thước. Sau khi giảm kích thước như vậy được thực hiện, làm thế nào người ta có thể tái cấu trúc các biến / tính năng ban đầu từ một số lượng nhỏ các thành phần chính?

Ngoài ra, làm thế nào người ta có thể loại bỏ hoặc loại bỏ một số thành phần chính khỏi dữ liệu?

Nói cách khác, làm thế nào để đảo ngược PCA?


Cho rằng PCA có liên quan chặt chẽ với phân rã giá trị số ít (SVD), câu hỏi tương tự có thể được hỏi như sau: làm thế nào để đảo ngược SVD?


10
Tôi đang đăng chủ đề Hỏi & Đáp này, vì tôi mệt mỏi khi thấy hàng tá câu hỏi hỏi chính điều này và không thể đóng chúng dưới dạng trùng lặp vì chúng tôi không có chủ đề chính tắc về chủ đề này. Có một số chủ đề tương tự với câu trả lời đàng hoàng nhưng dường như tất cả đều có những hạn chế nghiêm trọng, ví dụ như tập trung hoàn toàn vào R.
amip

4
Tôi đánh giá cao nỗ lực này - Tôi nghĩ rằng cần phải thu thập thông tin về PCA, những gì nó làm, những gì nó không làm, vào một hoặc một số chủ đề chất lượng cao. Tôi rất vui vì bạn đã tự mình làm điều này!
Sycorax

1
Tôi không tin rằng câu trả lời kinh điển này "dọn dẹp" phục vụ mục đích của nó. Những gì chúng ta có ở đây là một câu hỏi và câu trả lời chung chung xuất sắc, nhưng mỗi câu hỏi có một số điểm tinh tế về PCA trong thực tế bị mất ở đây. Về cơ bản, bạn đã thực hiện tất cả các câu hỏi, thực hiện PCA cho chúng và loại bỏ các thành phần chính thấp hơn, trong đó đôi khi, chi tiết quan trọng và phong phú được ẩn giấu. Hơn nữa, bạn đã trở lại với sách giáo khoa Ký hiệu đại số tuyến tính, chính xác là điều khiến PCA trở nên mờ nhạt đối với nhiều người, thay vì sử dụng ngôn ngữ của các nhà thống kê thông thường, đó là R.
Thomas Browne

1
@Thomas Cảm ơn. Tôi nghĩ rằng chúng tôi có một sự bất đồng, vui vẻ thảo luận về nó trong trò chuyện hoặc trong Meta. Rất ngắn gọn: (1) Thực sự có thể tốt hơn để trả lời từng câu hỏi, nhưng thực tế khắc nghiệt là nó không xảy ra. Nhiều câu hỏi không được trả lời, như bạn có thể sẽ có. (2) Cộng đồng ở đây rất thích câu trả lời chung chung hữu ích cho nhiều người; bạn có thể nhìn vào loại câu trả lời nào được đưa ra nhiều nhất. (3) Đồng ý về toán học, nhưng đó là lý do tại sao tôi đã cung cấp mã R ở đây! (4) Không đồng ý về ngôn ngữ chung; cá nhân, tôi không biết R.
amip

@amoeba Tôi e rằng tôi không biết cách tìm kiếm trò chuyện đã nói vì tôi chưa bao giờ tham gia vào các cuộc thảo luận meta trước đây.
Thomas Browne

Câu trả lời:


147

PCA tính toán các hàm riêng của ma trận hiệp phương sai ("trục chính") và sắp xếp chúng theo giá trị riêng của chúng (lượng phương sai được giải thích). Dữ liệu trung tâm sau đó có thể được chiếu lên các trục chính này để mang lại các thành phần chính ("điểm số"). Đối với mục đích giảm kích thước, người ta chỉ có thể giữ một tập hợp con của các thành phần chính và loại bỏ phần còn lại. (Xem tại đây để giới thiệu về giáo dân về PCA .)

Đặt là ma trận dữ liệu n × p với n hàng (điểm dữ liệu) và cột p (biến hoặc tính năng). Sau khi trừ đi giá trị trung bình vector từ mỗi hàng, chúng tôi nhận được trung tâm dữ liệu ma trận . Đặt là ma trận của một số hàm riêng mà chúng ta muốn sử dụng; chúng thường sẽ là các hàm riêng có giá trị riêng lớn nhất. Sau đó, ma trận của các phép chiếu PCA ("điểm số") sẽ được đưa ra đơn giản bởi .Xrawn×pnpX V p × k k k n × k Z = X VμXVp×kkkn×kZ=XV

Điều này được minh họa trong hình bên dưới: biểu đồ con đầu tiên hiển thị một số dữ liệu trung tâm (cùng dữ liệu mà tôi sử dụng trong hoạt hình của mình trong luồng được liên kết) và các hình chiếu của nó trên trục chính đầu tiên. Subplot thứ hai chỉ hiển thị các giá trị của phép chiếu này; chiều đã giảm từ hai xuống một:

nhập mô tả hình ảnh ở đây

Để có thể xây dựng lại hai biến ban đầu từ một thành phần chính này, chúng ta có thể ánh xạ nó trở lại kích thước với . Thật vậy, các giá trị của mỗi PC nên được đặt trên cùng một vectơ như được sử dụng để chiếu; so sánh các ô con 1 và 3. Kết quả sau đó được đưa ra bởi . Tôi đang hiển thị nó trên subplot thứ ba ở trên. Để có bản dựng lại cuối cùng , chúng ta cần thêm vectơ trung bình vào đó:VX = Z V = X V VX thô μpVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

Lưu ý rằng người ta có thể đi trực tiếp từ ô phụ đầu tiên sang ô thứ ba bằng cách nhân với ma trận ; nó được gọi là ma trận chiếu . Nếu tất cả các vector riêng được sử dụng, sau đó là ma trận nhân dân (không giảm chiều được thực hiện, do đó "tái thiết" là hoàn hảo). Nếu chỉ có một tập hợp con của hàm riêng, nó không phải là danh tính.V V p V VXVVpVV

Điều này hoạt động cho một điểm tùy ý trong không gian PC; nó có thể được ánh xạ tới không gian ban đầu thông qua .x = z Vzx^=zV

Loại bỏ (loại bỏ) PC hàng đầu

Đôi khi, người ta muốn loại bỏ (để loại bỏ) một hoặc một số PC hàng đầu và giữ phần còn lại, thay vì giữ các PC hàng đầu và loại bỏ phần còn lại (như trên). Trong trường hợp này, tất cả các công thức giữ nguyên chính xác , nhưng nên bao gồm tất cả các trục chính ngoại trừ các công thức mà người ta muốn loại bỏ. Nói cách khác, phải luôn bao gồm tất cả các PC mà một người muốn giữ.VVV

Hãy cẩn thận về PCA về mối tương quan

Khi PCA được thực hiện trên ma trận tương quan (chứ không phải ma trận hiệp phương sai), dữ liệu thô không chỉ được căn giữa bằng cách trừ mà còn được chia tỷ lệ bằng cách chia mỗi cột cho độ lệch chuẩn của nó . Trong trường hợp này, để xây dựng lại dữ liệu gốc, người ta cần phải chia tỷ lệ lại các cột của với và chỉ sau đó thêm lại vectơ trung bình . μ σ i X σ i μXrawμσiX^σiμ


Ví dụ xử lý ảnh

Chủ đề này thường xuất hiện trong bối cảnh xử lý hình ảnh. Hãy xem xét Lenna - một trong những hình ảnh tiêu chuẩn trong tài liệu xử lý hình ảnh (theo các liên kết để tìm xem nó đến từ đâu). Bên dưới bên trái, tôi hiển thị biến thể thang độ xám của hình ảnh (tệp có sẵn ở đây ).512×512

Hai phiên bản thang độ xám của hình ảnh Lenna.  Một bên phải là sần sùi nhưng chắc chắn có thể nhận ra.

Chúng ta có thể coi hình ảnh thang độ xám này là ma trận dữ liệu . Tôi thực hiện PCA trên đó và tính toán bằng 50 thành phần chính đầu tiên. Kết quả được hiển thị bên phải.X liệu X thô512×512XrawX^raw


Hoàn nguyên SVD

PCA liên quan rất chặt chẽ đến phân rã giá trị số ít (SVD), xem Mối quan hệ giữa SVD và PCA. Làm thế nào để sử dụng SVD để thực hiện PCA? để biết thêm chi tiết. Nếu một ma trận là SVD-ed như và là một trong lựa chọn một chiều vector đại diện cho quan điểm trong "giảm" -space của kích thước, sau đó để ánh xạ nó trở lại kích thước người ta cần nhân nó với .X X = U S V k z U k p S 1 : k , 1 : k V : , 1 : kn×pXX=USVkzUkpS1:k,1:kV:,1:k


Ví dụ trong R, Matlab, Python và Stata

Tôi sẽ tiến hành PCA trên dữ liệu của Fisher Iris và sau đó xây dựng lại nó bằng hai thành phần chính đầu tiên. Tôi đang làm PCA trên ma trận hiệp phương sai, không phải trên ma trận tương quan, tức là tôi không mở rộng các biến ở đây. Nhưng tôi vẫn phải thêm ý nghĩa trở lại. Một số gói, như Stata, chăm sóc điều đó thông qua cú pháp tiêu chuẩn. Cảm ơn @StasK và @Kodiologist đã giúp đỡ về mã.

Chúng tôi sẽ kiểm tra việc xây dựng lại datapoint đầu tiên, đó là:

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

Đầu ra:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

Đầu ra:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

Để tìm ra ví dụ R về tái tạo hình ảnh PCA, xem thêm câu trả lời này .

Con trăn

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

Đầu ra:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

Lưu ý rằng điều này hơi khác với kết quả trong các ngôn ngữ khác. Đó là bởi vì phiên bản dữ liệu Iris của Python chứa lỗi .

Thánh tích

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
Trong MATLAB, bạn có thể truy xuất mu từ các đầu ra PCA tiêu chuẩn và cũng có thể cung cấp số lượng thành phần trong các đầu vào.
Aksakal

2
μnComp

3
Tôi sẽ xóa mọi thứ khỏi câu trả lời không liên quan đến câu trả lời trực tiếp cho câu hỏi, chẳng hạn như xử lý hình ảnh và hình ảnh của cô gái dễ thương đó. Nếu ai đó không quan tâm đến hình ảnh, điều đó làm cho việc tiêu thụ trở nên khó khăn. Hãy nhớ rằng bất cứ ai đang đặt câu hỏi đã bị nhầm lẫn sâu sắc.
Aksakal

5
Lenna là một bộ dữ liệu chuẩn như iris.
StasK

2
@amoeba Tôi đã nói về kích thước, độ sâu bit, thậm chí là các pixel đen ở viền. Tôi không có phiên bản dứt khoát http://www.ece.rice.edu/~wakin/images/ : "Dường như có nhiều phiên bản hình ảnh thử nghiệm của Lena (còn gọi là" Lenna "). Vấn đề này được Shapiro ghi nhận trong bài báo zerotree năm 1993 của mình và nó vẫn còn đúng đến ngày hôm nay "
Laurent Duval
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.