Cách thực hiện giảm kích thước với PCA trong R


30

Tôi có một bộ dữ liệu lớn và tôi muốn thực hiện giảm kích thước.

Bây giờ ở mọi nơi tôi đọc rằng tôi có thể sử dụng PCA cho việc này. Tuy nhiên, tôi dường như vẫn không biết phải làm gì sau khi tính toán / thực hiện PCA. Trong R điều này được thực hiện dễ dàng với lệnh princomp.

Nhưng phải làm gì sau khi tính PCA? Nếu tôi quyết định tôi muốn sử dụng thành phần chính đầu tiên , làm cách nào để giảm chính xác dữ liệu của tôi?100


Câu hỏi này không rõ ràng lắm (100 PC tập dữ liệu của bạn về chiều giảm), nhưng cụ thể là về việc tái cấu trúc các biến ban đầu (chủ đề của câu trả lời được chấp nhận) xem thêm: Làm thế nào để đảo ngược PCA và tái cấu trúc các biến ban đầu từ một số thành phần chính?
amip nói rằng Phục hồi lại

Câu trả lời:


35

Tôi tin rằng những gì bạn đang nhận được trong câu hỏi của bạn liên quan đến việc cắt dữ liệu bằng cách sử dụng số lượng nhỏ hơn các thành phần chính (PC). Đối với các hoạt động như vậy, tôi nghĩ rằng chức năngprcomp này có tính minh họa cao hơn ở chỗ dễ hình dung hơn về phép nhân ma trận được sử dụng trong tái thiết.

Trước tiên, đưa ra một tập dữ liệu tổng hợp Xt, bạn thực hiện PCA (thông thường bạn sẽ căn giữa các mẫu để mô tả PC liên quan đến ma trận hiệp phương sai:

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n

#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)

#PCA
res <- prcomp(Xt, center = TRUE, scale = FALSE)
names(res)

Trong kết quả hoặc prcomp, bạn có thể thấy PC ( res$x), giá trị riêng ( res$sdev) cung cấp thông tin về cường độ của từng PC và tải ( res$rotation).

res$sdev
length(res$sdev)
res$rotation
dim(res$rotation)
res$x
dim(res$x)

Bằng cách bình phương các giá trị riêng, bạn có được phương sai được giải thích bởi mỗi PC:

plot(cumsum(res$sdev^2/sum(res$sdev^2))) #cumulative explained variance

Cuối cùng, bạn có thể tạo một phiên bản rút gọn của dữ liệu của mình bằng cách chỉ sử dụng các PC hàng đầu (quan trọng):

pc.use <- 3 # explains 93% of variance
trunc <- res$x[,1:pc.use] %*% t(res$rotation[,1:pc.use])

#and add the center (and re-scale) back to data
if(res$scale != FALSE){
	trunc <- scale(trunc, center = FALSE , scale=1/res$scale)
}
if(res$center != FALSE){
    trunc <- scale(trunc, center = -1 * res$center, scale=FALSE)
}
dim(trunc); dim(Xt)

Bạn có thể thấy rằng kết quả là một ma trận dữ liệu mượt mà hơn một chút, với các tính năng quy mô nhỏ được lọc ra:

RAN <- range(cbind(Xt, trunc))
BREAKS <- seq(RAN[1], RAN[2],,100)
COLS <- rainbow(length(BREAKS)-1)
par(mfcol=c(1,2), mar=c(1,1,2,1))
image(Xt, main="Original matrix", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()
image(trunc, main="Truncated matrix (3 PCs)", xlab="", ylab="", xaxt="n", yaxt="n", breaks=BREAKS, col=COLS)
box()

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

Và đây là một cách tiếp cận rất cơ bản mà bạn có thể thực hiện ngoài chức năng prcomp:

#alternate approach
Xt.cen <- scale(Xt, center=TRUE, scale=FALSE)
C <- cov(Xt.cen, use="pair")
E <- svd(C)
A <- Xt.cen %*% E$u

#To remove units from principal components (A)
#function for the exponent of a matrix
"%^%" <- function(S, power)
     with(eigen(S), vectors %*% (values^power * t(vectors)))
Asc <- A %*% (diag(E$d) %^% -0.5) # scaled principal components

#Relationship between eigenvalues from both approaches
plot(res$sdev^2, E$d) #PCA via a covariance matrix - the eigenvalues now hold variance, not stdev
abline(0,1) # same results

Bây giờ, quyết định giữ lại PC nào là một câu hỏi riêng biệt - một câu hỏi mà tôi đã quan tâm một thời gian trước . Mong rằng sẽ giúp.


2
Marc, bạn không cần phải ghi lại trung tâm và quy mô rõ ràng, prcomplàm điều đó cho bạn. Có một cái nhìn res$centerres$scale. IMHO ít bị lỗi hơn khi sử dụng những điều này (không có sự khác biệt ngẫu nhiên về việc định tâm hay không / chia tỷ lệ hoặc không giữa cuộc gọi rõ ràng scaleprcompcuộc gọi).
cbeleites hỗ trợ Monica

1
Câu trả lời này cần mở rộng vì nó không trả lời các câu hỏi của OP về what to do after calculating the PCA hay how do I reduce my dataset exactly? Cho rằng OP đã tiến hành PCA trên mẫu của mình, câu hỏi của anh ta là phải làm gì với nó và điều gì thực sự xảy ra với các mẫu phụ này; không làm thế nào để làm PCA. Chúng tôi cũng có thể đề xuất làm E <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsđể có được một cách khác để có được điểm số (đó thực sự là những gì hoàng tử làm stats:::princomp.default).
usεr11852 nói Phục hồi Monic

1
@ user11852 - câu hỏi đặc biệt làm tham chiếu đến việc giảm tập dữ liệu (nghĩa là cắt ngắn mà tôi đã trình bày ở đây). Tôi sẽ để anh ta quyết định xem đây có phải là thứ anh ta đang tìm kiếm hay không.
Marc trong hộp

1
@Marc, cảm ơn đã phản hồi. Tôi nghĩ rằng tôi có thể cần phải lùi lại và đọc lại mọi thứ một lần nữa, bởi vì tôi bị mắc kẹt về cách bất kỳ câu trả lời nào ở trên liên quan đến việc giảm kích thước. Bởi vì như bạn chỉ ra, dim (trunc) = dim (Xt). Lợi ích của nó là gì, sự giảm bớt không bị giảm đi.
B_Miner

2
@B_Miner - Hãy nhớ rằng việc cắt xén được sử dụng để tập trung vào các mẫu chính trong dữ liệu và để lọc ra các mẫu tỷ lệ nhỏ và nhiễu. Dữ liệu bị cắt không nhỏ hơn về kích thước của nó, nhưng "sạch hơn". Tuy nhiên, việc cắt bớt không làm giảm lượng dữ liệu trong đó toàn bộ ma trận có thể được xây dựng lại chỉ bằng một vài vectơ. Một ví dụ điển hình là việc sử dụng PCA để nén hình ảnh, trong đó một số lượng PC nhỏ hơn có thể được sử dụng để tái tạo lại hình ảnh. Tập hợp con nhỏ hơn này của các vectơ chiếm ít bộ nhớ hơn, nhưng việc xây dựng lại sẽ có một số mất mát trong chi tiết quy mô nhỏ.
Marc trong hộp

3

Những câu trả lời khác rất hay và chi tiết, nhưng tôi tự hỏi liệu bạn có thực sự hỏi một câu hỏi cơ bản hơn nhiều không: bạn sẽ làm gì khi có PC?

Mỗi PC đơn giản trở thành một biến mới. Giả sử PC1 chiếm 60% tổng biến thể và PC2 chiếm 30%. Vì đó là 90% tổng biến thể chiếm, bạn chỉ cần lấy hai biến mới (PC) này làm phiên bản đơn giản hóa của các biến ban đầu. Điều này có nghĩa là điều chỉnh chúng phù hợp với các mô hình, nếu đó là điều bạn quan tâm. Khi đến lúc diễn giải kết quả của bạn, bạn sẽ làm như vậy trong bối cảnh các biến ban đầu tương quan với mỗi PC.

Xin lỗi nếu tôi đã đánh giá thấp phạm vi của câu hỏi!


2

tôiλtôiΣk= =1pλk Ở đâu p là kích thước ban đầu của mẫu của bạn (p= =784trong trường hợp của bạn). [Hãy nhớ vì ma trận hiệp phương sai của bạn không âm Xác định bạn sẽ không có giá trị riêng âmλ.] Bây giờ, theo định nghĩa, các hàm riêng là trực giao với nhau. Điều đó có nghĩa là các phép chiếu tương ứng của chúng cũng trực giao và trong đó ban đầu bạn có một mẫu biến có thể tương quan lớn, bây giờ bạn có một mẫu độc lập tuyến tính nhỏ hơn (đáng kể) ("điểm số").

Thực tế với PCA, bạn đang sử dụng các phép chiếu của PC ("điểm số") làm dữ liệu thay thế cho mẫu ban đầu của bạn. Bạn thực hiện tất cả các phân tích về điểm số và sau đó bạn xây dựng lại mẫu ban đầu của mình bằng PC để tìm hiểu điều gì đã xảy ra trên không gian ban đầu của bạn (về cơ bản là Hồi quy thành phần chính ). Xóa không quan tâm đến việc tái thiết chút nào :)

Nói chung, bạn "sau khi tính toán PCA" phụ thuộc vào mục tiêu phân tích của bạn. PCA chỉ cung cấp cho bạn một mẫu con độc lập tuyến tính với dữ liệu của bạn là tối ưu theo tiêu chí tái cấu trúc RSS. Bạn có thể sử dụng nó để phân loại, hoặc hồi quy hoặc cả hai hoặc như tôi đã đề cập, bạn có thể muốn nhận ra các chế độ trực giao có ý nghĩa của các biến thể trong mẫu của bạn.

Nhận xét : Tôi nghĩ rằng cách ngây thơ tốt nhất để quyết định số lượng thành phần cần giữ lại là dựa trên ước tính của bạn về một số biến thể mẫu mà bạn muốn giữ lại trong mẫu chiều giảm của mình thay vì chỉ một số tùy ý, ví dụ. 3, 100, 200. Như user4959 đã giải thích, bạn có thể kiểm tra biến thể tích lũy đó bằng cách kiểm tra trường có liên quan của danh sách dưới $loadingstrường trong đối tượng danh sách được tạo bởi princomp.


1
Như bạn đã đề cập đến hồi quy thành phần chính, trong R được cung cấp theo gói. Đối với số lượng thành phần được giữ lại, tôi không thấy bất kỳ lợi thế thực sự nào của việc quyết định% phương sai so với không. về các thành phần (có thể là do tôi làm việc với dữ liệu có mức độ nhiễu rất khác nhau. Như @ Marc-in-the-box đề cập, có rất nhiều cách tiếp cận khác nhau để xác định số lượng PC phù hợp và chiến lược sẽ ( nên) phụ thuộc cả vào dữ liệu loại và loại phân tích dữ liệu cần tuân theo.
cbeleites hỗ trợ Monica

Tôi nói cách ngây thơ ; không có sơ đồ scree, không có giá trị riêng trung bình, không có sơ đồ log-eigenvalue, không có kiểm tra tương quan một phần. Không có khung xác suất cho mô hình của bạn. Bởi vì đó không phải là những gì OP yêu cầu. (Tôi đã không đề cập đếnpls gói bằng cách này, princomp {stats}) Có một lợi thế rõ ràng của việc sử dụng% của cum. phương sai trên một số tùy ý: Bạn biết chất lượng tái thiết của mình. Nếu bạn chỉ muốn làm mờ. giảm xuốngK kích thước (K < D, Dlà kích thước mẫu ban đầu của bạn) cũng tốt nhưng bạn không thực sự biết chất lượng giảm kích thước của mình.
usεr11852 nói Phục hồi Monic

1
vâng, nó ngây thơ. Tôi không đồng ý rằng việc đặt% tùy ý của phương sai được giải thích có một lợi thế nội tại của bất kỳ sự cắt đứt tùy ý nào khác. Nhưng dù sao cũng không đáng để tranh cãi về vấn đề này vì a) OP không bao giờ hỏi lời khuyên về việc chọn không. của PC để giữ và b) Tôi nghĩ rằng chúng tôi đồng ý rằng việc kiểm tra đúng mô hình PCA nên được thực hiện bằng mọi cách.
cbeleites hỗ trợ Monica

Không vấn đề gì; dù sao đó cũng chỉ là một bình luận mà tôi đã đưa ra trước câu trả lời của mình. (Tôi sẽ đặt đoạn bình luận của mình cuối cùng khi tôi nghĩ nó gây bối rối thay vì làm rõ những gì tôi muốn nói)
usεr11852 nói Phục hồi Monic

0

Sau khi thực hiện PCA, bạn có thể chọn hai thành phần và âm mưu đầu tiên .. Bạn có thể thấy biến thể của các thành phần bằng cách sử dụng biểu đồ scree trong R. Ngoài ra, sử dụng chức năng tóm tắt với loadings = T bạn có thể điều chỉnh biến thể của các tính năng với các thành phần.

Bạn cũng có thể nhìn vào cái này http://www.statmethods.net/advstats/factor.htmlhttp://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf

Hãy cố gắng nghĩ những gì bạn muốn. Bạn có thể diễn giải rất nhiều điều từ phân tích PCA.

Abhik hay nhất

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.