ทำไม PCA ของข้อมูลโดยใช้วิธี SVD ของข้อมูล


22

คำถามนี้เกี่ยวกับวิธีที่มีประสิทธิภาพในการคำนวณส่วนประกอบหลัก

  1. ตำราจำนวนมากในการสนับสนุน PCA เชิงเส้นโดยใช้การสลายตัวเอกพจน์มูลค่าของข้อมูล Casewise นั่นคือถ้าเรามี dataและต้องการแทนที่ตัวแปร ( คอลัมน์ของมัน) ด้วยองค์ประกอบหลักเราจะทำ SVD: , ค่าเอกพจน์ (sq. รากของค่าลักษณะเฉพาะ) ครอบครองเส้นทแยงมุมหลักของ , ขวา eigenvectorเป็นเมทริกซ์การหมุนแบบมุมฉากของแกน - ตัวแปรเป็นแกน - องค์ประกอบ, ซ้าย eigenvectorเป็นเช่น , เฉพาะสำหรับกรณี จากนั้นเราสามารถคำนวณค่าองค์ประกอบเป็นCX S V U V C = X V = U SX=ยูSV'SVยูVC=XV=ยูS

  2. อีกวิธีหนึ่งในการทำ PCA ของตัวแปรก็คือการสลายตัวของ square matrix (เช่นRสามารถเป็นสหสัมพันธ์หรือความแปรปรวนร่วมเป็นต้นระหว่างตัวแปร) การสลายตัวอาจจะเป็นการสลายตัวของไอเกนหรือการสลายตัวเอกฐาน: ด้วยเมทริกซ์เชิงบวกแบบกึ่งสมมาตรแบบสมมาตรแบบสี่เหลี่ยมจัตุรัสพวกเขาจะให้ผลลัพธ์แบบเดียวกันR = V L V กับค่าลักษณะเฉพาะตามแนวทแยงมุมของLและVตามที่อธิบายไว้ก่อนหน้า ค่าตัวแทนจะเป็นC = X VR=X'XR R=VLV'LVC=XV

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


2
โดยทั่วไปเราสนใจเพียงองค์ประกอบหลักเพียงไม่กี่ตัวเท่านั้นที่อธิบายความแปรปรวนส่วนใหญ่ เป็นไปได้ที่จะทำ SVD ที่ลดลง; เช่นถ้าเป็นมิติN × Pที่P < < Nแล้วของฟังก์ชั่นจะคำนวณเพียงครั้งแรกที่หน้าซ้ายและขวาเวกเตอร์เอกพจน์โดยค่าเริ่มต้น Xยังไม่มีข้อความ×พีพี<<ยังไม่มีข้อความRsvdพี
M. Berk

1
@ M.Berk: อย่างไรก็ตามทั้งสองวิธีเหมือนกัน: พวกเขาให้ผลลัพธ์ที่เทียบเท่า (เท่ากับการเปลี่ยนแปลงการลงชื่อ) นอกจากนี้เช่น R คำนวณCเฉพาะเมื่อถูกถาม pC
cbeleites รองรับโมนิกา

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

@ Anony-Mousse, เพียงคนเดียวที่พูดถึงJoliffe, Principal component analysis, 2nd ed.จริงๆแล้ว Joliffe อธิบายทั้งสองวิธี แต่ในบทหลักของ PCA เขาพูดถึงวิธีที่ 1 เท่าที่ฉันจำได้
ttnphns

@ Anony-Mousse, วิธีที่ 1 สำหรับฉันมีความสำคัญจากจุดทางทฤษฎีเพราะมันแสดงให้เห็นชัดเจนว่า PCA เกี่ยวข้องโดยตรงกับการวิเคราะห์การติดต่อทางจดหมายอย่างง่ายอย่างไร
ttnphns

คำตอบ:


7

นี่คือ 2ct ของฉันในหัวข้อ

  • วิชาเคมีที่ฉันเรียนรู้ PCA ครั้งแรกใช้วิธีการแก้ปัญหา (2) แต่มันไม่ได้เน้นเชิงตัวเลขและการบรรยายเชิงตัวเลขของฉันเป็นเพียงการแนะนำและไม่ได้พูดถึง SVD เท่าที่ฉันจำได้

  • ถ้าฉันเข้าใจโฮล์มส์: Fast SVD สำหรับเมทริกซ์ขนาดใหญ่อย่างถูกต้องความคิดของคุณจะถูกนำมาใช้เพื่อให้ได้ SVD ที่รวดเร็วจากการคำนวณของเมทริกซ์ยาว
    นั่นหมายถึงว่าการใช้งาน SVD ที่ดีอาจทำตามภายใน (2) หากพบเมทริกซ์ที่เหมาะสม (ฉันไม่รู้ว่ายังมีความเป็นไปได้ที่ดีกว่า) นี่หมายถึงว่าสำหรับการติดตั้งระดับสูงจะเป็นการดีกว่าถ้าใช้ SVD (1) และปล่อยให้มันอยู่ใน BLAS เพื่อดูแลอัลกอริทึมที่จะใช้ภายใน

  • ตรวจสอบการปฏิบัติอย่างรวดเร็ว: ดีวีดีของ OpenBLAS ดูเหมือนจะไม่ทำให้เกิดความแตกต่างนี้บนเมตริกซ์ของ 5e4 x 100 svd (X, nu = 0)ใช้เวลาเฉลี่ย 3.5 วินาทีในขณะที่svd (crossprod (X), nu = 0)ใช้เวลา 54 มิลลิวินาที (เรียกจาก R ด้วยmicrobenchmark)
    การกระจายของค่าลักษณะเฉพาะของหลักสูตรนั้นเร็วและขึ้นอยู่กับผลลัพธ์ของการโทรทั้งสองเท่ากัน

    timing  <- microbenchmark (svd (X, nu = 0), svd (crossprod (X), nu = 0), times = 10)
    timing
    # Unit: milliseconds
    #                      expr        min         lq    median         uq        max neval
    #            svd(X, nu = 0) 3383.77710 3422.68455 3507.2597 3542.91083 3724.24130    10
    # svd(crossprod(X), nu = 0)   48.49297   50.16464   53.6881   56.28776   59.21218    10
    

update: ดูที่Wu, W.; Massart, D. & de Jong, S .: อัลกอริทึม PCA เคอร์เนลสำหรับข้อมูลแบบกว้าง ส่วนที่ 1: ทฤษฎีและอัลกอริทึมเคมีและระบบห้องปฏิบัติการอัจฉริยะ, 36, 165 - 172 (1997) DOI: http://dx.doi.org/10.1016/S0169-7439(97)00010-5

บทความนี้กล่าวถึงคุณสมบัติเชิงตัวเลขและการคำนวณของ 4 อัลกอริทึมที่แตกต่างกันสำหรับ PCA: SVD, eigen decomposition (EVD), NIPALS และ POWER

พวกเขาเกี่ยวข้องดังนี้:

computes on      extract all PCs at once       sequential extraction    
X                SVD                           NIPALS    
X'X              EVD                           POWER

บริบทของกระดาษกว้าง และทำงานบนX X (เคอร์เนล PCA) - นี่เป็นเพียงสถานการณ์ตรงกันข้ามที่คุณถาม ดังนั้นเพื่อตอบคำถามของคุณเกี่ยวกับพฤติกรรมเมทริกซ์ที่ยาวนานคุณต้องแลกเปลี่ยนความหมายของ "เคอร์เนล" และ "คลาสสิค"X(30×500)XX

การเปรียบเทียบประสิทธิภาพ

ไม่น่าแปลกใจที่ EVD และ SVD จะเปลี่ยนสถานที่ขึ้นอยู่กับว่ามีการใช้อัลกอริทึมแบบดั้งเดิมหรือเคอร์เนลหรือไม่ ในบริบทของคำถามนี้หมายความว่าอย่างใดอย่างหนึ่งอาจจะดีกว่าขึ้นอยู่กับรูปร่างของเมทริกซ์

แต่จากการอภิปรายเรื่อง "คลาสสิค" SVD และ EVD ​​เป็นที่ชัดเจนว่าการสลายตัวของเป็นวิธีปกติในการคำนวณ PCA อย่างไรก็ตามพวกเขาไม่ได้ระบุอัลกอริทึม SVD ใดที่ใช้นอกเหนือจากที่พวกเขาใช้ฟังก์ชันของ MatlabXXsvd ()


    > sessionInfo ()
    R version 3.0.2 (2013-09-25)
    Platform: x86_64-pc-linux-gnu (64-bit)

    locale:
     [1] LC_CTYPE=de_DE.UTF-8       LC_NUMERIC=C               LC_TIME=de_DE.UTF-8        LC_COLLATE=de_DE.UTF-8     LC_MONETARY=de_DE.UTF-8   
     [6] LC_MESSAGES=de_DE.UTF-8    LC_PAPER=de_DE.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C            
    [11] LC_MEASUREMENT=de_DE.UTF-8 LC_IDENTIFICATION=C       

    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     

    other attached packages:
    [1] microbenchmark_1.3-0

loaded via a namespace (and not attached):
[1] tools_3.0.2

$ dpkg --list libopenblas*
[...]
ii  libopenblas-base              0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2
ii  libopenblas-dev               0.1alpha2.2-3                 Optimized BLAS (linear algebra) library based on GotoBLAS2

ดังนั้นการทดสอบของคุณ (3.5 วินาทีเทียบกับ 54 มิลลิวินาที) สนับสนุนสายของฉันว่า "วิธีที่ 1" ช้ากว่ามาก ขวา?
ttnphns

1
@ttnphns: ใช่ แต่เนื่องจาก DVD มีให้โดย BLAS ที่อาจแตกต่างกับ BLAS อื่น ฉันคาดว่า BLAS ที่ได้รับการปรับปรุงให้ดีที่สุดจะทำสิ่งนี้ อย่างไรก็ตามดูเหมือนว่าจะไม่เกิดขึ้นกับ OpenBLAS ฉันขี้เกียจเกินไปที่จะตรวจสอบ BLAS อื่น ๆ แต่อาจมีเพียงไม่กี่คนที่สามารถตรวจสอบ BLAS อื่น ๆ ของพวกเขาได้ดังนั้นเราจึงพบว่าแบบใดที่เหมาะที่สุดสำหรับกรณีนี้ (ฉันส่งอีเมลถึงผู้พัฒนา OpenBLAS และส่งลิงก์ให้กับคำถามนี้ดังนั้นเขาอาจจะสามารถเพิ่มข้อมูลบางอย่างได้เช่นเหตุผลที่ไม่เปลี่ยนอัลกอริทึมให้เป็นsvd (X'X)เมทริกซ์ระยะยาว)
cbeleites รองรับ Monica

บางจุดต้องการการชี้แจง (ถึงฉัน) สรุป "วิธีการเคอร์เนล" สามารถเป็น "ทำงานบนแทนที่จะเป็นXเมื่อn < p " ได้หรือไม่? ถ้าเป็นเช่นนั้นมันเป็นเรื่องเล็กน้อย ฉันไม่รู้จัก POWER แต่ฉันรู้จัก NIPALS ซึ่งคำนวณ eigenvectors ของX Xโดยทำซ้ำu n + 1 = X X u n / | | X X u n | | (เขามาบรรจบกับ 1 eigenvector v 1ดังนั้นคุณต้องอัปเดตXX'Xn<พีX'Xun+1=XXun/||XXun||v1Xเพื่อคำนวณค่าที่สอง ฯลฯ ) มีสองวิธีในการดำเนินการ NIPALS (1) คุณสามารถคำนวณล่วงหน้าหรือ (2) คุณสามารถดำเนินการผลิตภัณฑ์เป็นX × ( X u n )วิธีที่ใช้ที่นี่? ฉันเดาว่าใช้ (1) ซึ่งอาจไม่ยุติธรรม XXX×(Xun)
Elvis

@Elvis ก) มีมากขึ้นวิธีการเคอร์เนลมากกว่าเพียงแค่การคำนวณใน ดูเช่นstats.stackexchange.com/questions/2499/... ความเท่าเทียมกันนั้นสำคัญสำหรับ PCA (ไม่สำคัญว่าคุณจะเริ่มด้วยการหาเวกเตอร์เอกพจน์ทางขวาหรือซ้าย) แต่ไม่ใช่สำหรับวิธีอื่น b) "วิธีที่จะทำ NIPALS" ขึ้นอยู่กับหลักการโดยรวมที่เหมือนกัน อัลกอริทึมใดที่ใช้สำหรับ SVD ขึ้นอยู่กับ BLAS ของคุณและที่จริงฉันเดาว่า NIPALS ไม่มีส่วนเกี่ยวข้องที่นี่ โปรดทราบว่าเวลาของฉันรวมถึงการคำนวณของผลิตภัณฑ์ข้าม XXT
cbeleites รองรับโมนิกา

ฉันกำลังพูดถึงการอัพเดตของคุณที่เกี่ยวข้องกับ Nipals ฉันยืนยันว่า Nipals ไม่เกี่ยวข้องกับ SVD ของ Lapack เกี่ยวกับการทดสอบเกณฑ์มาตรฐานของคุณมีบางสิ่งที่microbenchmark(X <- matrix(rnorm(5e6), ncol=100), Y <- t(X), svd(X), svd(Y), control=list(order="inorder"), times = 5)น่าสนใจเช่นกัน
Elvis

18

SVD ช้าลง แต่มักถูกพิจารณาว่าเป็นวิธีที่ต้องการเนื่องจากความแม่นยำเชิงตัวเลขสูงกว่า

ตามที่คุณระบุในคำถามการวิเคราะห์องค์ประกอบหลัก (PCA) สามารถดำเนินการได้โดย SVD ของเมทริกซ์ข้อมูลที่มีศูนย์กลาง ( ดูที่หัวข้อคำถาม & คำตอบนี้เพื่อดูรายละเอียดเพิ่มเติม ) หรือโดยการสลายตัวของความแปรปรวนร่วม eigen 1X1n1XXXXnp

นี่คือสิ่งที่เขียนในความช่วยเหลือของpca()ฟังก์ชั่นMATLAB :

อัลกอริทึมองค์ประกอบหลักที่pcaใช้ในการทำการวิเคราะห์องค์ประกอบหลัก [... ]:

'svd' - ค่าเริ่มต้น ค่าการสลายตัวเอกพจน์ (SVD) ของ X

np

ประโยคสุดท้ายแสดงให้เห็นถึงการแลกเปลี่ยนความแม่นยำและความเร็วที่สำคัญที่อยู่ที่นี่

1000×100

X = randn([1000 100]);

tic; svd(X); toc         %// Elapsed time is 0.004075 seconds.
tic; svd(X'); toc        %// Elapsed time is 0.011194 seconds.
tic; eig(X'*X); toc      %// Elapsed time is 0.001620 seconds.
tic; eig(X*X'); toc;     %// Elapsed time is 0.126723 seconds.

npXX

XXXX

X=(111ϵ000ϵ000ϵ),
3+ϵ2ϵ2ϵ2ϵ=105
eps = 1e-5;
X = [1 1 1; eye(3)*eps];
display(['Squared sing. values of X: ' num2str(sort(svd(X),'descend').^2')])
display(['Eigenvalues of X''*X:       ' num2str(sort(eig(X'*X),'descend')')])

ได้รับผลลัพธ์ที่เหมือนกัน:

Squared sing. values of X: 3       1e-10       1e-10
Eigenvalues of X'*X:       3       1e-10       1e-10

ϵ=1010

Squared sing. values of X: 3       1e-20       1e-20
Eigenvalues of X'*X:       3           0 -3.3307e-16

XX

ฉันควรเพิ่มว่าคน ๆ หนึ่งมักจะมีความสุขที่จะเพิกเฉยต่อการสูญเสียความแม่นยำที่อาจเกิดขึ้น [เล็ก ๆ ] และใช้วิธีที่รวดเร็วกว่า


1
XTX

ขอบคุณสำหรับคำตอบและเพื่อการพิจารณาข้อดีข้อเสียอย่างละเอียด
ttnphns

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

@ttnphns ฉันเขียนคำตอบทั้งหมดใหม่ให้ตัวอย่างที่เป็นรูปธรรม ลองดูสิ.
อะมีบาพูดว่า Reinstate Monica

1
@ amoeba ขอบคุณมากสำหรับการกลับมาและยกตัวอย่าง! ฉันพยายามตัวอย่าง epsilon ทั้งในโปรแกรม SPSS และผลได้เหมือนของคุณยกเว้นบรรทัดสุดท้ายมาก: แทนของ3 0 -3.3307e-16Eigen ใน SPSS 3 0 0กลับมาให้ฉัน ดูเหมือนว่าฟังก์ชั่นมีค่าความอดทนในตัวและคงที่เกินกว่าที่มันจะเป็นศูนย์ ในตัวอย่างนี้ฟังก์ชั่นดูเหมือนว่าจะแฮ็คปมของความไม่แน่นอนเชิงตัวเลขโดย zeroing ค่าลักษณะเฉพาะเล็ก ๆ ทั้ง "0" และ "-16"
ttnphns
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.