สำหรับเมทริกซ์แบบสุ่ม SVD ไม่ควรอธิบายอะไรเลยหรือ ผมทำอะไรผิดหรือเปล่า?


13

ถ้าฉันสร้างเมทริกซ์ 2 มิติที่ประกอบด้วยข้อมูลสุ่มทั้งหมดฉันคาดว่าส่วนประกอบ PCA และ SVD จะไม่อธิบายอะไรเลย

แต่ดูเหมือนว่าคอลัมน์ SVD แรกจะปรากฏขึ้นเพื่ออธิบาย 75% ของข้อมูล วิธีนี้สามารถเป็นไปได้จะเป็นอย่างไร? ผมทำอะไรผิดหรือเปล่า?

นี่คือพล็อต:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือรหัส 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)

ปรับปรุง

ขอบคุณ @Aaron การแก้ไขตามที่คุณบันทึกไว้คือการเพิ่มสเกลในเมทริกซ์เพื่อให้ตัวเลขอยู่กึ่งกลางประมาณ 0 (เช่นค่าเฉลี่ยคือ 0)

m <- scale(m, scale=FALSE)

นี่คือรูปภาพที่ถูกแก้ไขซึ่งแสดงเมทริกซ์พร้อมข้อมูลสุ่มคอลัมน์ SVD แรกใกล้เคียงกับ 0 ตามที่คาดไว้

ภาพที่ถูกต้อง


4
เมทริกซ์ของคุณประมาณการกระจายแบบสม่ำเสมอบนคิวบ์หน่วย[0,1]100R100Rnn1/3n/3(n1)/121/12(n/3(n1)/12)/(n/3)=3/4+1/(4n)n=10075.25

คำตอบ:


11

พีซีเครื่องแรกอธิบายว่าตัวแปรไม่ได้อยู่กึ่งกลางรอบศูนย์ การปรับขนาดก่อนหรือการวางตัวแปรสุ่มให้อยู่กึ่งกลางรอบศูนย์จะได้ผลลัพธ์ตามที่คุณต้องการ ตัวอย่างเช่นสิ่งเหล่านี้:

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
คุณยกประเด็นที่ดี แต่ฉันคิดว่านี่เป็นเพียงส่วนหนึ่งของเรื่อง แน่นอนฉันเดาว่า OP จะลองแต่ละสิ่งและยังคงประหลาดใจกับผลลัพธ์ ความจริงของเรื่องนี้ก็คือว่าเพราะค่าเอกพจน์มีการสั่งซื้อในการส่งออกพวกเขาจะไม่ปรากฏ (และแน่นอนไม่ได้) กระจายอย่างสม่ำเสมอตามที่คาดว่าจะไร้เดียงสาจากข้อมูล "สุ่ม" การแจกจ่าย Marchenko-Pasturควบคุมพฤติกรรมของพวกเขาในกรณีนี้
พระคาร์ดินัล

@Aaron ขอบคุณคุณพูดถูก ฉันได้เพิ่มกราฟของผลลัพธ์ที่แก้ไขด้านบนเพื่อแสดงว่าผลลัพธ์นั้นสวยงามอย่างไร
Contango

1
@cardinal ขอบคุณสำหรับความคิดเห็นของคุณคุณพูดถูก (ดูกราฟที่สร้างโดยรหัสที่แก้ไขด้านบน) ฉันเชื่อว่าค่า SVD จะกระจายอย่างสม่ำเสมอน้อยกว่าเนื่องจากเมทริกซ์มีขนาดเล็กลงเนื่องจากเมทริกซ์ขนาดเล็กจะมีโอกาสมากขึ้นในการมีรูปแบบที่จะไม่ถูกบีบอัดโดยกฎจำนวนมาก
Contango

3

ฉันจะเพิ่มคำตอบให้กับคำถามของคุณผ่านการเปรียบเทียบแบบจำลองแบบ null ขั้นตอนการสุ่มข้อมูลในแต่ละคอลัมน์เพื่อรักษาความแปรปรวนโดยรวมในขณะที่ความแปรปรวนร่วมระหว่างตัวแปร (คอลัมน์) หายไป สิ่งนี้ถูกดำเนินการหลายครั้งและการแจกแจงผลลัพธ์ของค่าเอกพจน์ในเมทริกซ์ที่สุ่มถูกเปรียบเทียบกับค่าดั้งเดิม

ฉันใช้prcompแทนsvdการสลายตัวเมทริกซ์ แต่ผลลัพธ์ที่คล้ายกัน:

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

การเปรียบเทียบโมเดลแบบ null จะดำเนินการกับเมทริกซ์กึ่งกลางด้านล่าง:

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)

ต่อไปนี้เป็นพล็อตบ็อกซ์ของเมทริกซ์ที่เรียงสับเปลี่ยนกับปริมาณ 95% ของค่าเอกพจน์แต่ละค่าที่แสดงเป็นเส้นทึบ ค่าดั้งเดิมของ PCA ของmคือจุด ทั้งหมดนี้อยู่ใต้เส้น 95% - ดังนั้นแอมพลิจูดของพวกเขาจึงแยกไม่ออกจากสัญญาณรบกวนแบบสุ่ม

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนเดียวกันสามารถทำได้ในเวอร์ชันที่ไม่อยู่กึ่งกลางของmผลลัพธ์เดียวกัน - ไม่มีค่าเอกพจน์ที่สำคัญ:

# 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)

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับการเปรียบเทียบลองดูชุดข้อมูลที่มีชุดข้อมูลที่ไม่สุ่ม: 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)

ป้อนคำอธิบายรูปภาพที่นี่

ค่าเอกพจน์ที่ 1 มีความสำคัญและอธิบายความแปรปรวนได้มากกว่า 92%:

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

+1 ตัวอย่างของชุดข้อมูล Iris นั้นน่าสนใจเพราะดูที่พีซีสองเครื่องแรก (เช่นในโพสต์ของคุณเองที่นี่stats.stackexchange.com/a/88092 ) มันค่อนข้างชัดเจนว่าอันที่สองมีสัญญาณบ้าง การทดสอบการเรียงสับเปลี่ยน (aka shuffling) บ่งชี้ว่ามีเพียงอันแรกเท่านั้นที่มีความหมายว่า เป็นที่ชัดเจนว่าการสับแบบมีแนวโน้มที่จะประเมินจำนวนพีซีต่ำเกินไป: ความแปรปรวนขนาดใหญ่ของพีซีจริงเครื่องแรกจะได้รับ "การแพร่กระจาย" ไปทั่วพีซีแบบสับและจะยกระดับทั้งหมดของพวกเขาเริ่มจากวินาที หนึ่งสามารถคิดการทดสอบที่ละเอียดอ่อนมากที่บัญชีสำหรับการที่ แต่ไม่ค่อยทำ
อะมีบาพูดว่า Reinstate Monica

@amoeba - ความคิดเห็นที่ยอดเยี่ยม ฉันสงสัยเกี่ยวกับเอฟเฟกต์ "แพร่กระจาย" มาระยะหนึ่งแล้ว ฉันคิดว่าการทดสอบการตรวจสอบข้ามอาจเป็นหนึ่งในการทดสอบที่ละเอียดอ่อนมากขึ้นที่คุณอ้างอิง (เช่นคำตอบของคุณที่นี่ )? จะดีมากถ้าคุณสามารถให้ตัวอย่าง / การอ้างอิง
Marc ในกล่อง

ฉันมักจะชอบใช้การตรวจสอบข้าม (ขึ้นอยู่กับข้อผิดพลาดการสร้างใหม่ตามคำตอบของฉันที่นี่ ) แต่จริง ๆ แล้วฉันไม่แน่ใจว่ามันไม่ได้รับความทุกข์ทรมานจากความไม่รู้สึกแบบเดียวกันหรือไม่ อาจเหมาะสมที่จะลองใช้กับชุดข้อมูลของ Iris เกี่ยวกับวิธีการแบบสับผมไม่ทราบข้อมูลอ้างอิงเกี่ยวกับการบัญชีสำหรับ "การแพร่กระจาย" นี้ฉันเพิ่งรู้ว่ามีคนที่ทำงานเกี่ยวกับเรื่องนี้ ฉันคิดว่าพวกเขาต้องการที่จะเขียนขึ้นในไม่ช้า แนวคิดคือการแนะนำปัจจัยการลดขนาดบางอย่างสำหรับความแปรปรวนของพีซีแบบสับที่สูงขึ้น
อะมีบาพูดว่า Reinstate Monica

@amoeba - ขอบคุณสำหรับลิงค์นั้น มันอธิบายได้มากมายสำหรับฉัน ฉันพบว่าน่าสนใจอย่างยิ่งที่จะเห็นว่าการตรวจสอบข้ามใน PCA ใช้วิธีการที่สามารถทำงานกับชุดข้อมูลที่มีค่าที่ขาดหายไป ฉันใช้ความพยายามสองสามครั้งในวิธีการนี้และ (ตามที่คุณระบุ) วิธีการสับเปลี่ยนแบบ null นั้นมีแนวโน้มที่จะประเมินจำนวนพีซีที่มีนัยสำคัญน้อยเกินไป อย่างไรก็ตามสำหรับชุดข้อมูลของไอริสฉันส่งคืนพีซีหนึ่งเครื่องอย่างสม่ำเสมอเพื่อหาข้อผิดพลาดในการสร้างใหม่ สิ่งที่น่าสนใจคือสิ่งที่คุณพูดถึงเกี่ยวกับเนื้อเรื่อง อาจเป็นได้ว่าหากเราวัดความผิดพลาดตามการคาดการณ์ของสปีชีส์ผลลัพธ์อาจแตกต่างกัน
Marc ในกล่อง

จากความอยากรู้ฉันลองใช้ข้อมูล Iris ที่จริงแล้วฉันจะได้รับพีซีที่สำคัญสองเครื่องด้วยวิธีการตรวจสอบข้าม ฉันอัพเดทโพสต์ที่เชื่อมโยงของฉันโปรดดูที่นั่น
อะมีบาพูดว่า Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.