วิธีการลดขนาดด้วย PCA ใน R


30

ฉันมีชุดข้อมูลขนาดใหญ่และฉันต้องการลดขนาดข้อมูล

ตอนนี้ทุกที่ฉันอ่านว่าฉันสามารถใช้ PCA สำหรับสิ่งนี้ อย่างไรก็ตามฉันยังดูเหมือนจะไม่ได้สิ่งที่ต้องทำหลังจากการคำนวณ / การแสดง PCA princompในการวิจัยนี้จะกระทำได้อย่างง่ายดายด้วยคำสั่ง

แต่จะทำอย่างไรหลังจากคำนวณ PCA หากฉันตัดสินใจว่าจะใช้ส่วนประกอบหลักแรกฉันจะลดชุดข้อมูลของฉันได้อย่างไร100


คำถามนี้ไม่ชัดเจน (100 ชิ้นเป็นชุดข้อมูลของคุณที่มีการลดขนาด) แต่เฉพาะเกี่ยวกับการสร้างตัวแปรดั้งเดิม (หัวข้อของคำตอบที่ยอมรับ) ดูเพิ่มเติม: วิธีการย้อนกลับ PCA และสร้างตัวแปรดั้งเดิมจากองค์ประกอบหลักหลายประการ
อะมีบาพูดว่า Reinstate Monica

คำตอบ:


35

ฉันเชื่อว่าสิ่งที่คุณได้รับในคำถามของคุณเกี่ยวข้องกับการตัดข้อมูลโดยใช้ส่วนประกอบหลัก (PC) จำนวนน้อยลง สำหรับการดำเนินการดังกล่าวฉันคิดว่าฟังก์ชั่นprcompเป็นตัวอย่างที่ชัดเจนว่ามันง่ายต่อการมองเห็นการคูณเมทริกซ์ที่ใช้ในการสร้างใหม่

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

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

ในผลลัพธ์หรือprcompคุณสามารถดูพีซี ( res$x), ค่าลักษณะเฉพาะ ( res$sdev) ที่ให้ข้อมูลเกี่ยวกับขนาดของพีซีแต่ละเครื่องและโหลด ( res$rotation)

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

ด้วยการหาค่าลักษณะเฉพาะคุณจะได้รับความแปรปรวนที่อธิบายโดยพีซีแต่ละเครื่อง:

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

สุดท้ายคุณสามารถสร้างข้อมูลที่ถูกตัดทอนโดยใช้พีซีที่สำคัญ (สำคัญ) เท่านั้น:

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)

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

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

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

และนี่คือวิธีการพื้นฐานที่คุณสามารถทำได้นอกฟังก์ชั่น 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

ตอนนี้การตัดสินใจว่าจะเก็บพีซีเครื่องใดเป็นคำถามที่แยกต่างหาก - คำถามหนึ่งที่ฉันสนใจในขณะนี้ หวังว่าจะช่วย


2
มาร์คคุณไม่จำเป็นต้องบันทึกศูนย์และปรับขนาดอย่างชัดเจนprcompทำเพื่อคุณ มีลักษณะที่และres$center res$scaleIMHO มีข้อผิดพลาดน้อยที่จะใช้สิ่งเหล่านี้ (ไม่มีความแตกต่างโดยไม่ตั้งใจเกี่ยวกับการจัดกึ่งกลางหรือไม่ / ปรับขนาดหรือไม่ระหว่างการโทรที่ชัดเจนถึงscaleการprcompโทร
cbeleites รองรับโมนิก้า

1
คำตอบนี้ต้องการการขยายตัวเพราะมันไม่ได้ตอบคำถามของ OP เกี่ยวกับwhat to do after calculating the PCAหรือhow do I reduce my dataset exactly? เนื่องจาก OP ได้ดำเนินการ PCA กับตัวอย่างของเขาคำถามของเขาคือสิ่งที่ต้องทำกับมันและสิ่งที่เกิดขึ้นจริงกับชุดย่อยนี้ ไม่ใช่วิธีการทำ PCA เราอาจเสนอให้ทำเช่นE <- eigen(cov(Sample)); A<- scale(scale=F, Sample) %*% E$vectorsกันเพื่อรับคะแนนอีกวิธีหนึ่งด้วย (ซึ่งจริงๆแล้วสิ่งที่ princomp ทำstats:::princomp.default)
usεr11852พูดว่า Reinstate Monic

1
@ user11852 - คำถามเฉพาะอ้างอิงถึงการลดลงของชุดข้อมูล (เช่นการตัดทอนที่ฉันได้แสดงให้เห็นที่นี่) ฉันจะปล่อยให้เขาตัดสินใจว่านี่คือสิ่งที่เขาต้องการหรือไม่
Marc ในกล่อง

1
@ Marc ขอบคุณสำหรับการตอบสนอง ฉันคิดว่าฉันอาจต้องย้อนกลับไปอ่านทุกอย่างอีกครั้งเพราะฉันติดอยู่กับคำตอบข้อใดข้อหนึ่งข้างต้นเกี่ยวกับการลดขนาด เพราะตามที่คุณแสดงสลัว (trunc) = dim (Xt) ประโยชน์ของมันคืออะไรมิติไม่ได้ลดลง
B_Miner

2
@B_Miner - โปรดทราบว่าการตัดปลายจะใช้เพื่อเน้นที่รูปแบบหลักในข้อมูลและเพื่อกรองรูปแบบขนาดเล็กและเสียงรบกวน ข้อมูลที่ถูกตัดทอนไม่ได้มีขนาดเล็กลงในแง่ของมิติข้อมูล แต่ "สะอาด" อย่างไรก็ตามการตัดทอนจะลดจำนวนข้อมูลลงซึ่งเมทริกซ์ทั้งหมดสามารถสร้างขึ้นใหม่ได้ด้วยเวกเตอร์เพียงไม่กี่ตัว ตัวอย่างที่ดีคือการใช้ PCA สำหรับการบีบอัดภาพซึ่งสามารถใช้พีซีจำนวนน้อยในการสร้างภาพใหม่ เซตย่อยของเวกเตอร์ขนาดเล็กนี้ใช้หน่วยความจำน้อยลง แต่การสร้างใหม่จะมีการสูญเสียรายละเอียดขนาดเล็ก
Marc ในกล่อง

3

คำตอบอื่น ๆ เหล่านี้ดีมากและมีรายละเอียด แต่ฉันสงสัยว่าคุณกำลังถามคำถามพื้นฐานเพิ่มเติมอีกหรือไม่: คุณจะทำอย่างไรเมื่อคุณมีพีซี

พีซีแต่ละเครื่องจะกลายเป็นตัวแปรใหม่ กล่าวว่า PC1 มีสัดส่วน 60% ของการเปลี่ยนแปลงทั้งหมดและ PC2 คิดเป็น 30% เนื่องจาก 90% ของการเปลี่ยนแปลงทั้งหมดคิดเป็นสัดส่วนคุณสามารถนำตัวแปรใหม่สองตัวนี้ (พีซี) มาเป็นตัวแปรดั้งเดิมของคุณได้อย่างง่ายดาย ซึ่งหมายความว่าเหมาะสมกับรุ่นหากเป็นสิ่งที่คุณสนใจเมื่อถึงเวลาที่จะตีความผลลัพธ์ของคุณคุณต้องทำในบริบทของตัวแปรดั้งเดิมที่สัมพันธ์กับพีซีแต่ละเครื่อง

ขออภัยถ้าฉันประเมินขอบเขตของคำถามต่ำเกินไป!


2

ผมλผมΣk=1พีλkพีพี=784λ

ในทางปฏิบัติกับ PCA คุณกำลังใช้ประมาณการของพีซี ("คะแนน") เป็นข้อมูลตัวแทนสำหรับตัวอย่างดั้งเดิมของคุณ คุณทำการวิเคราะห์คะแนนทั้งหมดและหลังจากนั้นคุณจะสร้างตัวอย่างดั้งเดิมของคุณกลับมาโดยใช้พีซีเพื่อค้นหาว่าเกิดอะไรขึ้นบนพื้นที่ดั้งเดิมของคุณ (นั่นคือการถดถอยส่วนประกอบหลัก ) เห็นได้ชัดว่าถ้าคุณสามารถแปลความหมาย eigenvector ("การโหลด") ที่มีความหมายของคุณแล้วคุณจะอยู่ในตำแหน่งที่ดียิ่งขึ้น: คุณสามารถอธิบายสิ่งที่เกิดขึ้นกับตัวอย่างของคุณในโหมดของการเปลี่ยนแปลงที่แสดงโดยการโหลดนั้น ไม่สนใจเกี่ยวกับการสร้างใหม่เลย :)

โดยทั่วไปคุณจะทำอะไร "หลังจากคำนวณ PCA" ขึ้นอยู่กับเป้าหมายของการวิเคราะห์ของคุณ PCA ช่วยให้คุณมีตัวอย่างย่อยข้อมูลอิสระของคุณซึ่งเป็นเส้นตรงที่เหมาะสมที่สุดภายใต้เกณฑ์การสร้างใหม่ของ RSS คุณอาจใช้มันสำหรับการจำแนกประเภทหรือการถดถอยหรือทั้งสองอย่างหรือตามที่ฉันกล่าวถึงคุณอาจต้องการรู้จักโหมดการตั้งฉากแบบออร์โธแกนที่มีความหมายในตัวอย่างของคุณ

ความคิดเห็น : ฉันคิดว่าวิธีที่ไร้เดียงสาที่ดีที่สุดในการตัดสินใจจำนวนส่วนประกอบที่จะเก็บไว้คือการประมาณค่าของคุณตามเกณฑ์การแปรผันของตัวอย่างบางส่วนที่คุณต้องการเก็บไว้ในตัวอย่างมิติข้อมูลที่ลดลง 3, 100, 200 ในฐานะที่เป็น user4959 อธิบายคุณสามารถตรวจสอบว่าการเปลี่ยนแปลงที่สะสมโดยการตรวจสอบข้อมูลที่เกี่ยวข้องของรายการภายใต้เขตข้อมูลในวัตถุของรายการที่ผลิตโดย$loadingsprincomp


1
ในขณะที่คุณพูดถึงการถดถอยส่วนประกอบหลักใน R ที่ให้บริการโดยแพคเกจกรุณา สำหรับจำนวนขององค์ประกอบที่จะเก็บไว้ฉันไม่เห็นข้อได้เปรียบที่แท้จริงของการตัดสินใจความแปรปรวน% เกินไม่ ของส่วนประกอบ (อาจเป็นเพราะฉันทำงานกับข้อมูลที่มีระดับเสียงต่างกันมาก @ @ Marc-in-the-box กล่าวถึงมีวิธีการมากมายในการกำหนดจำนวนพีซีที่เหมาะสมและกลยุทธ์จะ ( ควร) ขึ้นอยู่กับทั้งประเภทข้อมูลและประเภทของการวิเคราะห์ข้อมูลที่จะต้องปฏิบัติตาม
cbeleites รองรับ Monica

plsprincomp {stats}KKDD

1
ใช่มันไร้เดียงสา ฉันไม่เห็นด้วยที่การตั้งค่า% ความแปรปรวนตามอำเภอใจนั้นมีข้อได้เปรียบที่แท้จริงของการตัดขาดโดยพลการอื่น ๆ แต่มันก็ไม่คุ้มค่าที่จะต่อสู้เกี่ยวกับเรื่องนี้เพราะก) OP ไม่เคยขอคำแนะนำเกี่ยวกับการเลือกหมายเลข ของพีซีที่ต้องรักษาและ b) ฉันคิดว่าเราเห็นด้วยว่าควรทำการตรวจสอบรูปแบบ PCA ที่เหมาะสมต่อไป
cbeleites รองรับโมนิก้า

ไม่มีปัญหา; มันเป็นเพียงความคิดเห็นที่ฉันทำไว้ก่อนคำตอบของฉัน (ฉันจะใส่ย่อหน้าความคิดเห็นของฉันครั้งสุดท้ายเพราะฉันคิดว่ามันงุนงงมากกว่าชี้แจงสิ่งที่ฉันต้องการจะพูด)
usεr11852พูดว่า Reinstate Monic

0

หลังจากทำ PCA แล้วคุณสามารถเลือกสององค์ประกอบแรกและพล็อต .. คุณสามารถเห็นความผันแปรของส่วนประกอบโดยใช้ scree plot ใน R ได้เช่นกันโดยใช้ฟังก์ชั่นการสรุปด้วยการโหลด = T คุณสามารถครีบรูปแบบต่างๆ

คุณยังสามารถดูhttp://www.statmethods.net/advstats/factor.htmlและ http://statmath.wu.ac.at/~hornik/QFS1/principal_component-vignette.pdf นี้

ลองคิดในสิ่งที่คุณต้องการ คุณสามารถตีความสิ่งต่าง ๆ มากมายจากการวิเคราะห์ PCA

สุดยอด Abhik

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