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 V ⊤ Xดิบ μpV⊤X^=ZV⊤=XVV⊤X^rawμ
PCA reconstruction=PC scores⋅Eigenvectors⊤+Mean
โปรดทราบว่าเราสามารถไปจากแผนย่อยแรกโดยตรงกับแผนการที่สามโดยการคูณกับ matrix; มันถูกเรียกว่าเมทริกซ์การฉาย ถ้ามีการใช้ eigenvector แล้วคือเมทริกซ์เอกลักษณ์ (ไม่มีการลดมิติที่ทำดังนั้น "การฟื้นฟู" จึงสมบูรณ์แบบ) หากใช้ชุดย่อยของ eigenvector เพียงอย่างเดียวมันไม่ใช่ตัวตนV V ⊤ p V V ⊤XVV⊤pVV⊤
สิ่งนี้ใช้ได้กับตำแหน่งในพื้นที่ PC โดยพลการ มันสามารถแมปไปยังพื้นที่เดิมผ่าน\x = Z V ⊤zx^=zV⊤
การยกเลิก (การลบ) พีซีชั้นนำ
บางครั้งเราต้องการละทิ้ง (เพื่อลบ) พีซีชั้นนำหนึ่งหรือสามเครื่องและให้เหลือ แต่แทนที่จะเก็บพีซีชั้นนำและทิ้งส่วนที่เหลือ (ดังกล่าวข้างต้น) ในกรณีนี้สูตรทั้งหมดจะยังคงเหมือนเดิมแต่ควรประกอบด้วยแกนหลักทั้งหมดยกเว้นที่ต้องการลบทิ้ง กล่าวอีกนัยหนึ่งควรรวมพีซีทุกเครื่องที่เราต้องการเก็บไว้เสมอVVV
คำเตือนเกี่ยวกับ PCA ในความสัมพันธ์
เมื่อ PCA จะทำในเมทริกซ์สหสัมพันธ์ (และไม่ได้อยู่ในความแปรปรวนเมทริกซ์) ข้อมูลดิบไม่ได้เป็นศูนย์กลางเพียงโดยการลบ แต่ยังปรับขนาดโดยการหารแต่ละคอลัมน์โดยส่วนเบี่ยงเบนมาตรฐานของ\ในกรณีนี้จะสร้างข้อมูลเดิมหนึ่งต้องสำรองขนาดคอลัมน์ของกับและเพียงแล้วที่จะเพิ่มกลับค่าเฉลี่ยเวกเตอร์\ μ σ ฉันX σ ฉัน μXrawμσiX^σiμ
ตัวอย่างการประมวลผลภาพ
หัวข้อนี้มักจะเกิดขึ้นในบริบทของการประมวลผลภาพ พิจารณาLenna - หนึ่งในรูปภาพมาตรฐานในวรรณคดีการประมวลผลภาพ (ไปตามลิงก์เพื่อค้นหาว่ามาจากไหน) ด้านล่างทางซ้ายฉันแสดงตัวแปรระดับสีเทาของภาพภาพ ( มีไฟล์ที่นี่ )512×512
เราสามารถรักษาสีเทาภาพนี้เป็น 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=USV⊤kzUkpS⊤1: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