วิธีการย้อนกลับ PCA และสร้างตัวแปรดั้งเดิมจากองค์ประกอบหลักหลาย ๆ


113

การวิเคราะห์องค์ประกอบหลัก (PCA) สามารถใช้สำหรับการลดขนาด หลังจากดำเนินการลดขนาดเช่นนั้นหนึ่งจะประมาณสร้างตัวแปร / คุณสมบัติเดิมจากส่วนประกอบหลักจำนวนน้อยได้อย่างไร

อีกวิธีหนึ่งสามารถลบหรือทิ้งองค์ประกอบหลักหลายอย่างจากข้อมูลได้อย่างไร

ในคำอื่น ๆ วิธีการย้อนกลับ PCA


เนื่องจาก PCA นั้นมีความสัมพันธ์อย่างใกล้ชิดกับการสลายตัวของค่าเอกพจน์ (SVD) คำถามเดียวกันสามารถถามได้ดังนี้: วิธีการกลับ SVD?


10
ฉันกำลังโพสต์คำถามและคำตอบนี้เพราะฉันเบื่อที่จะเห็นคำถามมากมายที่ถามสิ่งนี้และไม่สามารถปิดเป็นรายการที่ซ้ำกันได้เพราะเราไม่มีกระทู้ตามมาตรฐานในหัวข้อนี้ มีหลายเธรดที่คล้ายกันพร้อมคำตอบที่เหมาะสม แต่ดูเหมือนว่าจะมีข้อ จำกัด ที่ร้ายแรงเช่นการมุ่งเน้นเฉพาะที่ R.
amoeba

4
ฉันซาบซึ้งในความพยายาม - ฉันคิดว่ามีความจำเป็นอย่างยิ่งที่จะรวบรวมข้อมูลเกี่ยวกับ PCA สิ่งที่มันทำในสิ่งที่ไม่ได้ทำไว้ในหัวข้อคุณภาพสูงหนึ่งหรือหลายหัวข้อ ฉันดีใจที่คุณทำเช่นนี้เพื่อตัวเอง!
Sycorax

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

1
@ ขอบคุณมาก ฉันคิดว่าเรามีความไม่เห็นด้วยยินดีที่จะหารือในการแชทหรือใน Meta สั้นมาก: (1) มันอาจจะเป็นการดีกว่าที่จะตอบคำถามแต่ละข้อ แต่ความจริงที่โหดร้ายก็คือว่ามันไม่ได้เกิดขึ้น มีคำถามมากมายที่ยังไม่ได้ตอบเหมือนที่คุณมี (2) ชุมชนที่นี่ต้องการคำตอบทั่วไปที่มีประโยชน์สำหรับคนจำนวนมาก คุณสามารถดูว่าคำตอบประเภทใดที่ได้รับการโหวตมากที่สุด (3) เห็นด้วยกับคณิตศาสตร์ แต่นั่นเป็นสาเหตุที่ฉันให้รหัส R ที่นี่! (4) ไม่เห็นด้วยเกี่ยวกับภาษากลาง โดยส่วนตัวฉันไม่รู้จักอาร์
อะมีบา

@ amoeba ฉันกลัวว่าฉันไม่รู้จะหาแชทพูดอย่างไรเพราะฉันไม่เคยเข้าร่วมการสนทนาเมตามาก่อน
โทมัสบราวน์

คำตอบ:


147

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

Xrawn×pnpμV P × k k k n × k Z = X VXVp×kkkn×kZ=XV

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

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

เพื่อที่จะสามารถที่จะสร้างเดิมสองตัวแปรจากองค์ประกอบหลักนี้เราสามารถ map มันกลับไปที่ขนาดกับV อันที่จริงควรวางค่าของพีซีแต่ละเครื่องบนเวกเตอร์เดียวกันกับที่ใช้สำหรับการฉาย เปรียบเทียบย่อยที่ 1 และ 3. ผลที่จะได้รับแล้วโดย\ ฉันกำลังแสดงมันในแผนย่อยที่สามด้านบน ในการรับการสร้างใหม่ครั้งสุดท้ายเราต้องเพิ่มค่าเฉลี่ย vectorลงในนั้น:วีX = Z V = X V VXดิบ μpVX^=ZV=XVVX^rawμ

PCA reconstruction=PC scoresEigenvectors+Mean

โปรดทราบว่าเราสามารถไปจากแผนย่อยแรกโดยตรงกับแผนการที่สามโดยการคูณกับ matrix; มันถูกเรียกว่าเมทริกซ์การฉาย ถ้ามีการใช้ eigenvector แล้วคือเมทริกซ์เอกลักษณ์ (ไม่มีการลดมิติที่ทำดังนั้น "การฟื้นฟู" จึงสมบูรณ์แบบ) หากใช้ชุดย่อยของ eigenvector เพียงอย่างเดียวมันไม่ใช่ตัวตนV V p V VXVVpVV

สิ่งนี้ใช้ได้กับตำแหน่งในพื้นที่ PC โดยพลการ มันสามารถแมปไปยังพื้นที่เดิมผ่าน\x = Z Vzx^=zV

การยกเลิก (การลบ) พีซีชั้นนำ

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

คำเตือนเกี่ยวกับ PCA ในความสัมพันธ์

เมื่อ PCA จะทำในเมทริกซ์สหสัมพันธ์ (และไม่ได้อยู่ในความแปรปรวนเมทริกซ์) ข้อมูลดิบไม่ได้เป็นศูนย์กลางเพียงโดยการลบ แต่ยังปรับขนาดโดยการหารแต่ละคอลัมน์โดยส่วนเบี่ยงเบนมาตรฐานของ\ในกรณีนี้จะสร้างข้อมูลเดิมหนึ่งต้องสำรองขนาดคอลัมน์ของกับและเพียงแล้วที่จะเพิ่มกลับค่าเฉลี่ยเวกเตอร์\ μ σ ฉันX σ ฉัน μXrawμσiX^σiμ


ตัวอย่างการประมวลผลภาพ

หัวข้อนี้มักจะเกิดขึ้นในบริบทของการประมวลผลภาพ พิจารณาLenna - หนึ่งในรูปภาพมาตรฐานในวรรณคดีการประมวลผลภาพ (ไปตามลิงก์เพื่อค้นหาว่ามาจากไหน) ด้านล่างทางซ้ายฉันแสดงตัวแปรระดับสีเทาของภาพภาพ ( มีไฟล์ที่นี่ )512×512

ภาพ Lenna ในระดับสีเทาสองรูป  ด้านขวาเป็นเม็ดเล็ก ๆ แต่จำได้แน่นอน

เราสามารถรักษาสีเทาภาพนี้เป็น Data Matrix{} ฉันใช้ PCA ในนั้นและคำนวณโดยใช้ส่วนประกอบหลัก 50 รายการแรก ผลลัพธ์จะปรากฏทางด้านขวาXดิบXดิบ512×512XrawX^raw


กำลังคืนค่า SVD

PCA นั้นมีความสัมพันธ์อย่างใกล้ชิดกับการสลายตัวของเอกพจน์ (SVD) อย่างใกล้ชิดดู ความสัมพันธ์ระหว่าง SVD และ PCA วิธีการใช้ SVD เพื่อทำ PCA สำหรับรายละเอียดเพิ่มเติม ถ้า matrixคือ SVD-ed เป็นและหนึ่งเลือกมิติเวกเตอร์ที่แสดงถึงจุดใน "ลดลง" -space ของมิติแล้ว map มันกลับไปที่มิติหนึ่งต้องคูณด้วยk}X X = U S V k Z U k P S 1 : k , 1 : k V : , 1 : kn×pXX=USVkzUkpS1:k,1:kV:,1:k


ตัวอย่างใน R, Matlab, Python และ Stata

ฉันจะดำเนินการ PCA กับข้อมูลFisher Irisจากนั้นสร้างใหม่โดยใช้สององค์ประกอบหลักแรก ฉันกำลังทำ PCA บนเมทริกซ์ความแปรปรวนร่วมไม่ใช่เมทริกซ์สหสัมพันธ์นั่นคือฉันไม่ได้ปรับขนาดตัวแปรที่นี่ แต่ฉันยังต้องเพิ่มค่าเฉลี่ยกลับ บางแพ็กเกจเช่น Stata ดูแลผ่านไวยากรณ์มาตรฐาน ขอบคุณ @StasK และ @Kodiologist สำหรับความช่วยเหลือเกี่ยวกับรหัส

เราจะตรวจสอบการสร้างดาต้าพอยน์ตัวแรกซึ่งก็คือ:

5.1        3.5         1.4        0.2

Matlab

load fisheriris
X = meas;
mu = mean(X);

[eigenvectors, scores] = pca(X);

nComp = 2;
Xhat = scores(:,1:nComp) * eigenvectors(:,1:nComp)';
Xhat = bsxfun(@plus, Xhat, mu);

Xhat(1,:)

เอาท์พุท:

5.083      3.5174      1.4032     0.21353

R

X = iris[,1:4]
mu = colMeans(X)

Xpca = prcomp(X)

nComp = 2
Xhat = Xpca$x[,1:nComp] %*% t(Xpca$rotation[,1:nComp])
Xhat = scale(Xhat, center = -mu, scale = FALSE)

Xhat[1,]

เอาท์พุท:

Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
   5.0830390    3.5174139    1.4032137    0.2135317

สำหรับการหาตัวอย่าง R ของการสร้างภาพ PCA ใหม่โปรดดูคำตอบนี้

หลาม

import numpy as np
import sklearn.datasets, sklearn.decomposition

X = sklearn.datasets.load_iris().data
mu = np.mean(X, axis=0)

pca = sklearn.decomposition.PCA()
pca.fit(X)

nComp = 2
Xhat = np.dot(pca.transform(X)[:,:nComp], pca.components_[:nComp,:])
Xhat += mu

print(Xhat[0,])

เอาท์พุท:

[ 5.08718247  3.51315614  1.4020428   0.21105556]

โปรดทราบว่าสิ่งนี้แตกต่างจากผลลัพธ์ในภาษาอื่นเล็กน้อย นั่นเป็นเพราะรุ่นหลามของชุดไอริสมีความผิดพลาด

Stata

webuse iris, clear
pca sep* pet*, components(2) covariance
predict _seplen _sepwid _petlen _petwid, fit
list in 1

  iris   seplen   sepwid   petlen   petwid    _seplen    _sepwid    _petlen    _petwid  
setosa      5.1      3.5      1.4      0.2   5.083039   3.517414   1.403214   .2135317  

1
ใน MATLAB คุณสามารถดึง mu จากเอาต์พุต PCA มาตรฐานและยังสามารถระบุจำนวนส่วนประกอบในอินพุต
Aksakal

2
@ Aksakal ฉันพยายามทำให้ข้อความที่ตัดตอนมาทั้งสามรหัสคล้ายกัน (และชัดเจนที่สุด); โดยเฉพาะฉันต้องการคำนวณด้วยมือก่อนที่จะเรียก pca () และเรียกใช้ PCA กับส่วนประกอบทั้งหมดและใช้ส่วนประกอบเฉพาะเมื่อดำเนินการจุดผลิตภัณฑ์ระหว่างคะแนนและ eigenvectors ตอนนี้ฉันได้แก้ไขรหัส Python ให้เป็นไปตามรูปแบบเดียวกัน μnComp
อะมีบา

3
ฉันจะลบทุกอย่างออกจากคำตอบที่ไม่เกี่ยวข้องกับคำตอบโดยตรงกับคำถามเช่นภาพและการประมวลผลภาพของสาวน่ารักคนนั้น หากใครบางคนไม่สนใจภาพมันทำให้การบริโภคยากขึ้น โปรดจำไว้ว่าใครก็ตามที่ถามคำถามจะสับสนอย่างมาก
Aksakal

5
Lenna เป็นเรื่องเกี่ยวกับมาตรฐานที่ชุดข้อมูลเป็นไอริส
StasK

2
@ amoeba ฉันกำลังพูดถึงขนาด, bit-depth, หรือ pixel สีดำที่อยู่ในกรอบ ฉันไม่มีรุ่นที่ชัดเจนhttp://www.ece.rice.edu/~wakin/images/ : "ดูเหมือนจะมีภาพทดสอบ Lena (aka" Lenna ") หลายรุ่นปัญหานี้ได้รับการบันทึกโดย Shapiro ในกระดาษซีโรทรีของเขาในปี 1993 และมันก็ยังคงเป็นจริงอย่างน่าประหลาดใจในวันนี้ "
Laurent Duval
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.