Các thành phần của PCA có thực sự đại diện cho tỷ lệ phần trăm chênh lệch? Họ có thể tổng hợp đến hơn 100%?


13

"Học máy cho tin tặc" của O'Reilly nói rằng mỗi thành phần chính đại diện cho một tỷ lệ phần trăm chênh lệch. Tôi đã trích dẫn phần có liên quan của trang bên dưới (chương 8, tr.207). Nói chuyện với một chuyên gia khác, họ đồng ý đó là tỷ lệ phần trăm.

Tuy nhiên, 24 thành phần tổng cộng tới 133,2095%. Làm thế nào mà có thể được?

Đã thuyết phục bản thân rằng chúng ta có thể sử dụng PCA, làm thế nào để chúng ta làm điều đó trong R? Một lần nữa, đây là nơi R tỏa sáng: toàn bộ PCA có thể được thực hiện trong một dòng mã. Chúng tôi sử dụng chức năng Princeomp để chạy PCA:

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])

Nếu chúng ta chỉ cần nhập pca vào R, chúng ta sẽ thấy một bản tóm tắt nhanh chóng về các thành phần chính:

Call:
princomp(x = date.stock.matrix[, 2:ncol(date.stock.matrix)])
Standard deviations:
Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
29.1001249 20.4403404 12.6726924 11.4636450 8.4963820 8.1969345 5.5438308
Comp.8 Comp.9 Comp.10 Comp.11 Comp.12 Comp.13 Comp.14
5.1300931 4.7786752 4.2575099 3.3050931 2.6197715 2.4986181 2.1746125
Comp.15 Comp.16 Comp.17 Comp.18 Comp.19 Comp.20 Comp.21
1.9469475 1.8706240 1.6984043 1.6344116 1.2327471 1.1280913 0.9877634
Comp.22 Comp.23 Comp.24
0.8583681 0.7390626 0.4347983
24 variables and 2366 observations.

Trong bản tóm tắt này, độ lệch chuẩn cho chúng ta biết bao nhiêu phương sai trong tập dữ liệu được tính bởi các thành phần chính khác nhau. Thành phần đầu tiên, được gọi là Comp.1, chiếm 29% phương sai, trong khi thành phần tiếp theo chiếm 20%. Cuối cùng, thành phần cuối cùng, Comp.24, chiếm ít hơn 1% phương sai. Điều này cho thấy rằng chúng ta có thể tìm hiểu rất nhiều về dữ liệu của mình bằng cách chỉ nhìn vào thành phần chính đầu tiên.

[Mã và dữ liệu có thể được tìm thấy trên github .]


6
Tôi nghĩ rằng sự giải thích của tác giả Standard deviationslà hơi tắt. Vì độ lệch chuẩn thực tế là độ lệch chuẩn, chúng ta phải bình phương chúng để xem mức độ sai lệch của mỗi thành phần. Thành phần đầu tiên sẽ đại diện cho phần trăm của tổng phương sai. 100×29.1001249229.10012492++0.43479832
giả định

4
Câu hỏi này xuất phát từ hai lỗi cơ bản, tôi e ngại: (1) nó bỏ lỡ tiêu đề thông báo rằng các số là "Độ lệch chuẩn" và nhầm chúng là sai lệch và (2) nó cho rằng những số đó là phần trăm, nhưng chúng không phải. (Đơn vị của họ là bất cứ thứ gì mà cổ phiếu được đo bằng: đô la hoặc phần trăm thay đổi mỗi năm hoặc bất cứ điều gì.) Không có lỗi nào ở đây cả: nhận xét của @Max giải thích cách tìm phần trăm của tổng phương sai.
whuber

1
@whuber Có lẽ tôi nên sử dụng "lỗi đánh máy" thay vì "lỗi"? :-) " Comp.1, chiếm 29% phương sai " là sai và nên đọc " Comp.1, chiếm 46% phương sai "
Darren Cook

1
Cảm ơn bạn, Darren: Tôi đã hiểu nhầm rằng sự nhầm lẫn đã có trong cuốn sách và tôi đã lấy "lỗi" để chỉ Rchính phần mềm. Phát hiện ra lỗi đó là một nhược điểm tốt (tôi hy vọng bạn thấy nó bổ ích khi tìm hiểu điều gì đang thực sự xảy ra với PCA)!
whuber

5
Vâng, đây chắc chắn là một lỗi trong cuốn sách. Có một vài nơi tôi sử dụng sai lệch tiêu chuẩn thay vì phương sai. (Ví dụ: có một điểm trong đó chúng tôi sử dụng RMSE thay vì MSE để tính bình phương R.) Tôi hy vọng chúng ta có thời gian để ngồi xuống và sửa các loại lỗi này trong tương lai gần.
John Myles White

Câu trả lời:


11

Sử dụng summary.princompđể xem "Tỷ lệ phương sai" và "Tỷ lệ tích lũy".

pca <- princomp(date.stock.matrix[,2:ncol(date.stock.matrix)])
summary(pca)

1
Cảm ơn Joshua. Vì vậy, thành phần đầu tiên thực sự là 46% của phương sai. Tôi sẽ gửi một báo cáo lỗi cho cuốn sách.
Darren Cook

"Tỷ lệ phương sai" được tính như thế nào? Số hiển thị là 0,4600083. Nhưng sqrt(pca$sdev[1]/sum(pca$sdev))(đại khái sqrt(29.1/133.2)) cho 0.4673904.
Darren Cook

3
@DarrenCook: sdevngụ ý rằng bạn đang nhìn vào độ lệch chuẩn , tức là căn bậc hai của phương sai (hoặc , sử dụng ký hiệu từ câu trả lời của tôi), sẽ giải thích sự khác biệt. Hãy thửthay thế. λTôipca$sdev[1]^2/sum(pca$sdev^2)
MånsT

2
@DarrenCook: sử dụng nguồn ... stats:::print.summary.princompcho bạn thấy rằng nó bình phương sdevthành phần, stats:::princomp.defaulthiển thị là sqrtgiá trị eigen.
Joshua Ulrich

11

Họ nên tổng hợp đến 100 %.

Tổng phương sai của một -variate biến ngẫu nhiên X có hiệp phương sai ma trận Σ được định nghĩa là t r ( Σ ) = σ 11 + σ 22 + + σ p p .pXΣ

tr(Σ)=σ11+σ22++σpp.

Bây giờ, các dấu vết của một ma trận đối xứng là tổng giá trị riêng của nó Do đó, tổng phương sai là t r ( Σ ) = λ 1 + + λ p nếu chúng tôi sử dụng λ i để biểu thị giá trị riêng của Σ . Lưu ý rằng λ p0λ1λ2Giáo dụcλp.

tr(Σ)= =λ1++λp
λTôiΣλp0 kể từ ma trận hiệp phương sai là dương-semidefinite , do đó tổng phương sai là không âm.

Tuy nhiên, thành phần chủ yếu được đưa ra bởi , nơi e ii : thứ eigenvector (tiêu chuẩn có chiều dài 1 ), tương ứng với eigenvalue λ i . Đúng của nó là V một r ( e i X ) = e ' i Σ e i = λ i đ ' i đ i = λ i và do đó là người đầu tiên k thành phần chủ yếu tạo nên + eTôiXeTôiTôi1λi

Var(eiX)=eiΣei=λieiei=λi
k
(λ1++λkλ1++λp100) %
100 %k=p

1
Bạn có thấy bình luận (gần đây hơn) của @Max cho câu hỏi không? Anh đóng đinh câu trả lời.
whuber

@whuber: Tôi chưa thấy nó, cảm ơn. Tôi đã nhận xét tương tự trong một nhận xét cho câu trả lời của Joshua.
MånsT

4

Dưới đây là một số mã R để bổ sung cho các câu trả lời trước đó ( pca[["sdev"]]thường được viết pca$sdev, nhưng nó gây ra định dạng sai trong đoạn trích bên dưới).

# Generate a dummy dataset.
set.seed(123)
x <- matrix(rnorm(400, sd=3), ncol=4)
# Note that princomp performs an unscaled PCA.
pca1 <- princomp(x)
# Show the fraction variance of each PC.
pca1[["sdev"]]^2
cumsum(pca1[["sdev"]]^2)/sum(pca1[["sdev"]]^2)
# Perform a scaled PCA.
pca2 <- princomp(x, cor=TRUE)
pca2[["sdev"]]^2
cumsum(pca2[["sdev"]]^2)/sum(pca2[["sdev"]]^2)

Vì vậy, như @Max chỉ ra, làm việc với phương sai thay vì độ lệch chuẩn và không quên chia cho tổng phương sai giải quyết vấn đề.

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.