องค์ประกอบของ PCA แสดงถึงความแปรปรวนจริง ๆ หรือไม่? พวกเขาสามารถรวมมากกว่า 100% ได้หรือไม่


13

"การเรียนรู้ของเครื่องสำหรับแฮ็กเกอร์" ของ O'Reilly กล่าวว่าองค์ประกอบหลักแต่ละรายการแสดงถึงเปอร์เซ็นต์ของความแปรปรวน ฉันได้อ้างอิงส่วนที่เกี่ยวข้องของหน้าด้านล่าง (บทที่ 8, p.207) เมื่อพูดกับผู้เชี่ยวชาญคนอื่นพวกเขาตกลงกันว่าเป็นเปอร์เซ็นต์

อย่างไรก็ตาม 24 องค์ประกอบรวมถึง 133.2095% นั่นเป็นอย่างไร

เมื่อเราเชื่อมั่นว่าเราสามารถใช้ PCA ได้เราจะทำเช่นนั้นใน R อย่างไร อีกครั้งนี้เป็นสถานที่ที่ R ส่อง: PCA ทั้งหมดสามารถทำได้ในหนึ่งบรรทัดของรหัส เราใช้ฟังก์ชัน princomp เพื่อเรียกใช้ PCA:

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

หากเราเพียงพิมพ์ pca ลงใน R เราจะเห็นข้อมูลสรุปอย่างย่อขององค์ประกอบหลัก:

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.

ในการสรุปนี้ค่าเบี่ยงเบนมาตรฐานจะบอกเราว่าความแปรปรวนในชุดข้อมูลนั้นมีสัดส่วนเท่าใดโดยองค์ประกอบหลักที่แตกต่างกัน องค์ประกอบแรกที่เรียกว่า Comp.1 คิดเป็น 29% ของความแปรปรวนขณะที่องค์ประกอบถัดไปมีสัดส่วน 20% ในตอนท้ายส่วนประกอบสุดท้าย Comp.24 มีสัดส่วนน้อยกว่า 1% ของความแปรปรวน สิ่งนี้ชี้ให้เห็นว่าเราสามารถเรียนรู้มากมายเกี่ยวกับข้อมูลของเราโดยเพียงแค่ดูองค์ประกอบหลักแรก

[รหัสและข้อมูลสามารถพบได้ใน GitHub ]


6
ฉันคิดว่าการตีความของผู้เขียนStandard deviationsปิดเล็กน้อย เนื่องจากค่าเบี่ยงเบนมาตรฐานเป็นความเบี่ยงเบนมาตรฐานจริงเราต้องยกกำลังสองเพื่อดูว่าความแปรปรวนแต่ละองค์ประกอบแสดงให้เห็นเท่าใด องค์ประกอบแรกจะแสดงเปอร์เซ็นต์ของความแปรปรวนทั้งหมด 100×29.1001249229.10012492++0.43479832
สันนิษฐานว่าปกติ

4
คำถามนี้เกิดจากข้อผิดพลาดพื้นฐานสองข้อฉันกลัว: (1) มันพลาดหัวข้อที่ประกาศว่าตัวเลขเป็น "ส่วนเบี่ยงเบนมาตรฐาน" และทำผิดพลาดเพราะความแปรปรวนและ (2) ถือว่าตัวเลขเหล่านั้นเป็นเปอร์เซ็นต์ แต่ไม่ใช่ (หน่วยของพวกเขาคืออะไรก็ตามที่หุ้นมีการวัดใน: ดอลลาร์หรือร้อยละการเปลี่ยนแปลงต่อปีหรืออะไรก็ตาม) ไม่มีข้อบกพร่องเลย: ความคิดเห็นโดย @max อธิบายวิธีการหาเปอร์เซ็นต์ของความแปรปรวนทั้งหมด
whuber

1
@whuber บางทีฉันควรใช้ "typo" แทน "bug"? :-) " Comp.1, บัญชีสำหรับ 29% ของความแปรปรวน " ผิดและควรอ่าน " Comp.1, บัญชีสำหรับ 46% ของความแปรปรวน "
Darren Cook

1
ขอบคุณ Darren: ฉันเข้าใจผิดว่ามีความสับสนเกิดขึ้นในหนังสือและฉันก็เอา "บั๊ก" เพื่ออ้างถึงRตัวซอฟต์แวร์เอง การค้นหาข้อผิดพลาดนั้นเป็นสิ่งที่ดี (ฉันหวังว่าคุณจะพบว่ามันเป็นรางวัลที่จะได้รู้ว่าเกิดอะไรขึ้นกับ PCA)!
whuber

5
ใช่นี่เป็นข้อผิดพลาดอย่างแน่นอนในหนังสือเล่มนี้ มีสถานที่ไม่กี่แห่งที่ฉันใช้การเบี่ยงเบนมาตรฐานในทางที่ผิดแทนที่จะใช้ความแปรปรวน (ตัวอย่างเช่นมีจุดที่เราใช้ RMSE แทน MSE เพื่อคำนวณ R-squared) ฉันหวังว่าเราจะมีเวลานั่งลงและแก้ไขข้อบกพร่องเหล่านี้ในอนาคตอันใกล้
John Myles White

คำตอบ:


11

ใช้summary.princompเพื่อดู "สัดส่วนของความแปรปรวน" และ "สัดส่วนสะสม"

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

1
ขอบคุณโจชัว ดังนั้นองค์ประกอบแรกคือ 46% ของความแปรปรวน ฉันจะส่งรายงานข้อผิดพลาดไปยังหนังสือ
Darren Cook

"สัดส่วนความแปรปรวน" คำนวณอย่างไร จำนวนที่แสดงคือ 0.4600083 แต่sqrt(pca$sdev[1]/sum(pca$sdev))(ประมาณsqrt(29.1/133.2)) ให้ 0.4673904
Darren Cook

3
@DarrenCook: sdevหมายความว่าคุณกำลังดูค่าเบี่ยงเบนมาตรฐานนั่นคือรากที่สองของความแปรปรวน (หรือโดยใช้สัญกรณ์จากคำตอบของฉัน) ซึ่งควรอธิบายความแตกต่าง ลองแทน λipca$sdev[1]^2/sum(pca$sdev^2)
MånsT

2
@DarrenCook: ใช้แหล่งที่มา ... stats:::print.summary.princompแสดงให้คุณเห็นว่ามันกำลังสองsdevองค์ประกอบซึ่งstats:::princomp.defaultแสดงให้เห็นว่าเป็นsqrtของค่า eigen
Joshua Ulrich

11

พวกเขาควรรวมถึง100 %.

ความแปรปรวนรวมของตัวแปรสุ่ม -variateพร้อมเมทริกซ์ความแปรปรวนร่วมถูกกำหนดเป็นpXΣ

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

ตอนนี้การติดตามของเมทริกซ์สมมาตรคือผลรวมของค่าลักษณะเฉพาะดังนั้นความแปรปรวนรวมเป็น ถ้าเราใช้เพื่อแสดงถึงลักษณะเฉพาะของ\โปรดทราบว่าเนื่องจากเมทริกซ์ความแปรปรวนร่วมเป็นบวก - semidefiniteดังนั้นความแปรปรวนทั้งหมดจึงไม่เป็นลบλ1λ2λp.

tr(Σ)=λ1++λp
λiΣλp0

แต่องค์ประกอบหลักจะได้รับจากที่เป็น : วิคเตอร์วัน (มาตรฐานจะมีความยาว ) สอดคล้องกับ eigenvalue \ความแปรปรวนของมันคือ และดังนั้นองค์ประกอบหลักแรกที่สร้าง ของความแปรปรวนทั้งหมด โดยเฉพาะอย่างยิ่งพวกเขาทำขึ้นของความแปรปรวนทั้งหมดเมื่อ pอีฉันฉัน1 λ ฉันV R ( อีฉัน X ) = E ' ฉัน Σ อีฉัน = λ ฉันE ' ฉันอีฉัน = λ ฉัน k ( λ 1 + + λ keiXeii1λi

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

1
คุณเห็นความคิดเห็น (เพิ่มเติมล่าสุด) โดย @Max กับคำถามหรือไม่ เขาตอกคำตอบ
whuber

@whuber: ฉันไม่เห็นมันเลยขอบคุณ ฉันทำข้อสังเกตที่คล้ายกันในความคิดเห็นต่อคำตอบของโจชัว
MånsT

4

นี่คือรหัส R บางส่วนเพื่อเติมเต็มคำตอบก่อนหน้า ( pca[["sdev"]]โดยปกติจะเขียนpca$sdevแต่มันทำให้เกิดการจัดรูปแบบที่ผิดพลาดในตัวอย่างด้านล่าง)

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

ดังนั้นในขณะที่ @ Max ชี้ให้เห็นว่าการทำงานกับความแปรปรวนแทนที่จะเป็นค่าเบี่ยงเบนมาตรฐานและไม่ลืมที่จะหารด้วยความแปรปรวนทั้งหมดแก้ปัญหาได้

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