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 .Xnguyênn × pviết sai rồipX 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:
Để 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 đó:V ⊤ X = Z V ⊤ = X V V ⊤ X thô μpV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+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 V ⊤XVV⊤pVV⊤
Đ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 V ⊤zx^=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
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=USV⊤kzUkpS⊤1: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