Đối với một ma trận ngẫu nhiên, không nên giải thích một SVD nào cả? Tôi đang làm gì sai?


13

Nếu tôi xây dựng ma trận 2 chiều bao gồm toàn bộ dữ liệu ngẫu nhiên, tôi sẽ mong các thành phần PCA và SVD không giải thích được gì.

Thay vào đó, có vẻ như cột SVD đầu tiên xuất hiện để giải thích 75% dữ liệu. Làm thế nào điều này có thể có thể được? Tôi đang làm gì sai?

Đây là cốt truyện:

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

Đây là mã R:

set.seed(1)
rm(list=ls())
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
svd1 <- svd(m, LINPACK=T)
par(mfrow=c(1,4))
image(t(m)[,nrow(m):1])
plot(svd1$d,cex.lab=2, xlab="SVD Column",ylab="Singluar Value",pch=19)

percentVarianceExplained = svd1$d^2/sum(svd1$d^2) * 100
plot(percentVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD Column",ylab="Percent of variance explained",pch=19)

cumulativeVarianceExplained = cumsum(svd1$d^2/sum(svd1$d^2)) * 100
plot(cumulativeVarianceExplained,ylim=c(0,100),cex.lab=2, xlab="SVD column",ylab="Cumulative percent of variance explained",pch=19)

Cập nhật

Cảm ơn bạn @Aaron. Cách khắc phục, như bạn đã lưu ý, là thêm tỷ lệ vào ma trận sao cho các số được căn giữa 0 (nghĩa là trung bình là 0).

m <- scale(m, scale=FALSE)

Dưới đây là hình ảnh được sửa, hiển thị cho một ma trận có dữ liệu ngẫu nhiên, cột SVD đầu tiên gần bằng 0, như mong đợi.

Sửa ảnh


4
Ma trận của bạn xấp xỉ phân phối đồng đều trên khối đơn vị trong R 100 . SVD tính toán các khoảnh khắc quán tính của nó về nguồn gốc . Trong R n các "tổng phương sai" phải n lần so với khoảng thời gian đơn vị, đó là 1 / 3 . Thật đơn giản để tính toán rằng thời điểm dọc theo trục chính của khối lập phương (phát ra từ gốc) bằng n / 3 - ( n - 1 ) / 12 và tất cả các khoảnh khắc khác - nhờ tính đối xứng - bằng[0,1]100R100Rnn1/3n/3-(n-1)/12 . Do đó eigenvalue đầu tiên là ( n / 3 - ( n - 1 ) / 12 ) / ( n / 3 ) = 3 / 4 + 1 / ( 4 n ) tổng số. Với n = 100 đó là 75,25 %, hiển thị trong ô thứ ba. 1/12(n/3-(n-1)/12)/(n/3)= =3/4+1/(4n)n= =10075,25
whuber

Câu trả lời:


11

PC đầu tiên đang giải thích rằng các biến không tập trung quanh 0. Thu nhỏ đầu tiên hoặc căn giữa các biến ngẫu nhiên của bạn quanh 0 sẽ có kết quả mà bạn mong đợi. Ví dụ: một trong hai:

m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)
m <- scale(m, scale=FALSE)

m <- matrix(runif(10000,min=-25,max=25), nrow=100,ncol=100)

3
Bạn nêu lên một điểm tốt, nhưng tôi nghĩ điều này chỉ kể một phần của câu chuyện. Thật vậy, tôi đoán rằng OP sẽ thử từng thứ trong số này và vẫn ngạc nhiên với kết quả. Thực tế của vấn đề là bởi vì các giá trị số ít được sắp xếp ở đầu ra, chúng sẽ không xuất hiện (và thực tế là không) được phân phối thống nhất như có thể được mong đợi một cách ngây thơ từ dữ liệu "ngẫu nhiên". Các phân phối Marchenko-Pastur điều chỉnh hành vi của họ trong trường hợp này.
Đức hồng y

@Aaron Cảm ơn bạn, bạn đã hoàn toàn đúng. Tôi đã thêm một biểu đồ về đầu ra đã hiệu chỉnh ở trên để cho thấy kết quả đẹp như thế nào.
Contango

1
@cardinal Cảm ơn bình luận của bạn, bạn hoàn toàn đúng (xem biểu đồ được tạo bởi mã đã sửa, ở trên). Tôi tin rằng các giá trị SVD sẽ trở nên phân phối ít đồng đều hơn khi ma trận trở nên nhỏ hơn, vì một ma trận nhỏ hơn sẽ có nhiều khả năng có các mẫu không bị phá vỡ bởi luật số lượng lớn.
Contango

3

Tôi sẽ thêm một câu trả lời trực quan hơn cho câu hỏi của bạn, thông qua việc sử dụng so sánh mô hình null. Quy trình xáo trộn ngẫu nhiên dữ liệu trong mỗi cột để bảo toàn phương sai tổng thể trong khi hiệp phương sai giữa các biến (cột) bị mất. Điều này được thực hiện nhiều lần và phân phối kết quả của các giá trị số ít trong ma trận ngẫu nhiên được so sánh với các giá trị ban đầu.

Tôi sử dụng prcompthay vì svdphân tách ma trận, nhưng kết quả tương tự nhau:

set.seed(1)
m <- matrix(runif(10000,min=0,max=25), nrow=100,ncol=100)

S <- svd(scale(m, center = TRUE, scale=FALSE))
P <- prcomp(m, center = TRUE, scale=FALSE)
plot(S$d, P$sdev) # linearly related

So sánh mô hình null được thực hiện trên ma trận trung tâm bên dưới:

library(sinkr) # https://github.com/marchtaylor/sinkr

# centred data
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

Sau đây là một boxplot của ma trận hoán vị với lượng tử 95% của mỗi giá trị số ít được hiển thị dưới dạng đường thẳng. Các giá trị ban đầu của PCA mlà các dấu chấm. tất cả đều nằm dưới đường 95% - Do đó, biên độ của chúng không thể phân biệt được với nhiễu ngẫu nhiên.

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

Quy trình tương tự có thể được thực hiện trên phiên bản không tập trung mvới cùng kết quả - Không có giá trị số ít đáng kể:

# centred data
Pnull <- prcompNull(m, center = FALSE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda[,1:20], ylim=range(Pnull$Lambda[,1:20], Pnull$Lambda.orig[1:20]), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=TRUE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

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

Để so sánh, chúng ta hãy xem một tập dữ liệu với một tập dữ liệu không ngẫu nhiên: iris

# iris dataset example
m <- iris[,1:4]
Pnull <- prcompNull(m, center = TRUE, scale=FALSE, nperm = 100)
Pnull$n.sig
boxplot(Pnull$Lambda, ylim=range(Pnull$Lambda, Pnull$Lambda.orig), outline=FALSE, col=8, border="grey50", log="y", main=paste("m (center=FALSE); n sig. =", Pnull$n.sig))
lines(apply(Pnull$Lambda, 2, FUN=quantile, probs=0.95))
points(Pnull$Lambda.orig[1:20], pch=16)

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

Ở đây, giá trị số 1 là rất đáng kể và giải thích hơn 92% tổng phương sai:

P <- prcomp(m, center = TRUE)
P$sdev^2 / sum(P$sdev^2)
# [1] 0.924618723 0.053066483 0.017102610 0.005212184

+1. Ví dụ về tập dữ liệu Iris rất thú vị, bởi vì nhìn vào hai PC đầu tiên (ví dụ như trong bài đăng của riêng bạn ở đây stats.stackexchange.com/a/88092 ) thì rõ ràng là cái thứ hai có một số tín hiệu. Thử nghiệm hoán vị (hay còn gọi là xáo trộn) chỉ ra rằng chỉ có cái đầu tiên là "đáng kể". Rõ ràng là việc xáo trộn có xu hướng đánh giá thấp số lượng PC: phương sai lớn của PC thực sự đầu tiên sẽ bị "lây lan" trên các PC bị xáo trộn và sẽ nâng tất cả chúng bắt đầu từ thứ hai. Người ta có thể nghĩ ra các bài kiểm tra nhạy cảm hơn, nhưng điều này hiếm khi được thực hiện.
amip nói rằng Phục hồi lại

@amoeba - Nhận xét tuyệt vời. Bây giờ tôi đã tự hỏi về hiệu ứng "dàn trải". Tôi cho rằng một bài kiểm tra xác thực chéo có thể là một trong những bài kiểm tra nhạy cảm hơn mà bạn tham khảo (ví dụ: câu trả lời của bạn ở đây )? Sẽ là tuyệt vời nếu bạn có thể cung cấp một ví dụ / tài liệu tham khảo.
Marc trong hộp

Tôi thường thích sử dụng xác nhận chéo (dựa trên lỗi tái cấu trúc, theo câu trả lời của tôi ở đây ), nhưng tôi thực sự không chắc chắn liệu nó có phải là do một loại vô cảm tương tự hay không. Có thể có ý nghĩa để thử nó trên bộ dữ liệu Iris. Về các cách tiếp cận dựa trên xáo trộn, tôi không biết bất kỳ tài liệu tham khảo nào cho việc tính toán cho "sự dàn trải" này, tôi chỉ biết một số người đang thực hiện nó gần đây. Tôi nghĩ rằng họ muốn viết nó lên sớm. Ý tưởng là giới thiệu một số yếu tố thu hẹp đối với phương sai của các PC bị xáo trộn cao hơn.
amip nói rằng Phục hồi lại

@amoeba - Cảm ơn liên kết đó. Nó giải thích rất nhiều cho tôi. Tôi thấy đặc biệt thú vị khi thấy rằng xác thực chéo trong PCA sử dụng các phương thức có thể hoạt động trên các bộ dữ liệu với các giá trị bị thiếu. Tôi đã thực hiện một vài nỗ lực cho phương pháp này và (như bạn nêu) phương pháp xáo trộn mô hình null thực sự có xu hướng đánh giá thấp số lượng PC quan trọng. Tuy nhiên, đối với tập dữ liệu mống mắt, tôi liên tục trả về một PC duy nhất cho lỗi tái cấu trúc. Thú vị cho những gì bạn đề cập về cốt truyện. Có thể là nếu chúng ta đánh giá lỗi dựa trên dự đoán loài, kết quả có thể khác.
Marc trong hộp

Vì tò mò, tôi đã thử nó trên dữ liệu Iris. Trên thực tế, tôi có hai máy tính quan trọng với phương thức xác thực chéo. Tôi cập nhật bài viết liên kết của tôi, xin vui lòng xem ở đó.
amip nói rằng Phục hồi Monica
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.