ความแตกต่างระหว่างการใช้งาน scikit-Learn ของ PCA และ TruncatedSVD


12

ฉันเข้าใจความสัมพันธ์ระหว่างการวิเคราะห์องค์ประกอบหลักและการสลายตัวของค่าเอกพจน์ในระดับพีชคณิต / แน่นอน คำถามของฉันเป็นเรื่องเกี่ยวกับการดำเนินงาน scikit เรียนรู้

เอกสารกล่าวว่า: " [TruncatedSVD] คล้ายกับ PCA มาก แต่ทำงานกับเวกเตอร์ตัวอย่างโดยตรงแทนที่จะเป็นเมทริกซ์ความแปรปรวนร่วม " ซึ่งจะสะท้อนความแตกต่างพีชคณิตระหว่างทั้งสองวิธี อย่างไรก็ตามภายหลังได้กล่าวว่า: " ตัวประมาณนี้ [TruncatedSVD] รองรับสองอัลกอริทึม: ตัวแก้ SVD แบบสุ่มที่รวดเร็วและอัลกอริทึม“ ไร้เดียงสา” ที่ใช้ ARPACK เป็น eigensolver บน (X * XT) หรือ (XT * X) มีประสิทธิภาพ ". เกี่ยวกับPCAมันบอกว่า: "การลดขนาดเชิงเส้นโดยใช้การแยกส่วนประกอบของข้อมูลเพื่อฉายภาพ ... " และการติดตั้ง PCA รองรับสองอัลกอริทึม (สุ่มและ ARPACK) ตัวแก้ปัญหาบวกอีกหนึ่ง LAPACK เมื่อมองดูโค้ดฉันจะเห็นว่าทั้ง ARPACK และ LAPACK ทั้งใน PCA และ TruncatedSVD ทำ svd บนข้อมูลตัวอย่าง X, ARPACK สามารถจัดการกับเมทริกซ์กระจัดกระจาย (ใช้ svds)

ดังนั้นนอกเหนือจากคุณสมบัติและวิธีการที่แตกต่างกันและ PCA ยังสามารถทำการแยกสลายค่าเอกพจน์ที่แน่นอนโดยใช้ LAPACK, PCA และ TruncatedSVD การใช้งาน scikit-Learn ดูเหมือนจะเป็นอัลกอริทึมเดียวกัน คำถามแรก: ถูกต้องหรือไม่

คำถามที่สอง: แม้ว่า LAPACK และ ARPACK ใช้ scipy.linalg.svd (X) และ scipy.linalg.svds (X) เป็น X เมทริกซ์ตัวอย่างพวกเขาคำนวณการสลายตัวของเอกพจน์หรือ eigen-decomposition ของหรือภายใน ในขณะที่ตัวแก้แบบ "สุ่ม" ไม่จำเป็นต้องคำนวณผลิตภัณฑ์ (สิ่งนี้เกี่ยวข้องกับความมั่นคงเชิงตัวเลขดูที่เหตุใด PCA ของข้อมูลโดยใช้ SVD ของข้อมูล ) ถูกต้องหรือไม่X X TXTXXXT

รหัสที่เกี่ยวข้อง: บรรทัดPCA 415 ตัดบรรทัดSVD 137


1
คุณสามารถเพิ่มลิงค์ไปยังรหัสได้หรือไม่
seanv507

1
Drake - ฉันคิดว่าฉันเห็นด้วยกับคุณในตอนแรก Q. ไม่เข้าใจที่สอง คุณหมายถึงอะไร 'พวกเขาคำนวณการแยกค่าเอกฐานหรือการสลายตัวไอจีนินของ XT ∗ XXT ∗ X หรือ X ∗ XTX ∗ XT ภายใน' - คุณเพิ่งแสดงรหัสที่มันทำโดยใช้ SVD บน X? - ปัญหาเชิงตัวเลขอ้างถึงการคำนวณเมทริกซ์ความแปรปรวนร่วมแรก (เรียกว่า C) จากนั้นหาค่าลักษณะเฉพาะของ C
seanv507

@ seanv507 เกี่ยวกับคำถามที่ 2 - ฉันเดาว่า scipy.linalg.svd (X) คำนวณ SVD โดยการทำไอเกนสลายตัวของและ / หรือ T สิ่งเดียวกันสำหรับ linalg.svds (X) การอ้างอิง: "ตัวแก้ SVD แบบสุ่มที่เร็วและอัลกอริทึม" ไร้เดียงสา "ที่ใช้ ARPACK เป็น eigensolver บน (X * XT) หรือ (XT * X)" เห็นเส้นยังสุดท้ายในdocs.scipy.org/doc/scipy/reference/generated/... วิธีเดียวที่ฉันสามารถเข้าใจเครื่องหมายคำพูดแรกคืออัลกอริทึมแบบสุ่มเป็นสิ่งเดียวที่ไม่สามารถคำนวณเมทริกซ์ความแปรปรวนร่วม / แกรมX X TXTXXXT
drake

1
ฉันเดาว่าวิธี ARPACK นั้นเกี่ยวข้องกับการวนซ้ำของ Arnoldiดังนั้นมันจึงต้องทำผลิตภัณฑ์เมทริกซ์เวกเตอร์เท่านั้น (โดยหลักการแล้ววิธีการวนซ้ำเหล่านี้ไม่ได้ระบุเพียงคู่ของรูทีนและนี่เป็นเรื่องปกติสำหรับเมทริกซ์กระจัดกระจายขนาดใหญ่ในตัวแก้ PDE เป็นต้น)XXtimes()Xt_times()
GeoMatt22

@ GeoMatt22 คุณช่วยอธิบายความคิดเห็นของคุณได้ไหม? คุณหมายถึงว่าวิธีการ ARPACK หรือ LAPACK ไม่ประสบปัญหาความไม่แน่นอนเชิงตัวเลขเพราะไม่จำเป็นต้องคำนวณเมทริกซ์ความแปรปรวนร่วมหรือไม่
เป็ด

คำตอบ:


13

PCA และ TruncatedSVD การใช้งาน scikit-Learn ดูเหมือนจะเป็นอัลกอริทึมเดียวกัน

ไม่: PCA คือ (ตัดทอน) SVD สำหรับข้อมูลกึ่งกลาง (โดยการลบค่าเฉลี่ยต่อคุณลักษณะ) หากข้อมูลอยู่กึ่งกลางทั้งสองคลาสจะทำเช่นเดียวกัน

ในทางปฏิบัติTruncatedSVDมีประโยชน์ในชุดข้อมูลขนาดใหญ่กระจัดกระจายซึ่งไม่สามารถอยู่กึ่งกลางได้โดยไม่ทำให้การใช้หน่วยความจำระเบิด

  • numpy.linalg.svdและscipy.linalg.svdทั้งคู่พึ่งพา LAPACK _GESDD อธิบายไว้ที่นี่: http://www.netlib.org/lapack/lug/node32.html (ไดรเวอร์หารและพิชิต)

  • scipy.sparse.linalg.svdsอาศัย ARPACK เพื่อทำการแบ่งแยกค่า eigen ของ XT X หรือ X XT (ขึ้นอยู่กับรูปร่างของข้อมูล) ผ่านวิธีการวนซ้ำของ Arnoldi คู่มือผู้ใช้ HTML ของ ARPACK มีการจัดรูปแบบที่ไม่สมบูรณ์ซึ่งซ่อนรายละเอียดการคำนวณไว้ แต่การทำซ้ำของ Arnoldi ได้รับการอธิบายอย่างดีในวิกิพีเดีย: https://en.wikipedia.org/wiki/Arnoldi_iteration

นี่คือรหัสสำหรับ SVD-based SVD ใน scipy:

https://github.com/scipy/scipy/blob/master/scipy/sparse/linalg/eigen/arpack/arpack.py#L1642 (ค้นหาสตริงสำหรับ "def svds" ในกรณีที่มีการเปลี่ยนแปลงบรรทัดในซอร์สโค้ด )


2
หนึ่งสามารถรองรับข้อมูลที่กระจัดกระจายได้อย่างมีประสิทธิภาพ (TruncatedSVD), อื่น ๆ ที่ไม่สามารถ (PCA) นี่คือเหตุผลที่เรามี 2 คลาส
ogrisel

1
ถ้านั่นคือเหตุผลฉันจะเรียกพวกเขาว่า SVD และ SparseSVD (หรือคล้ายกัน) เพื่อหลีกเลี่ยงความสับสน
เป็ด

2
แต่ผู้คนต้องการ PCA และพวกเขาอาจไม่รู้ว่า PCA เป็นเพียง SVD สำหรับข้อมูลกึ่งกลาง
ogrisel

5
@ Drake ฉันไม่เห็นด้วยว่า "กระบวนการแตกต่างกัน (PCA ใช้เมทริกซ์ความแปรปรวนร่วมและ SVD ใช้ data matrix)" PCA เป็นชื่อสำหรับประเภทของการวิเคราะห์ หนึ่งสามารถใช้อัลกอริทึมที่แตกต่างกันและการใช้งานเพื่อดำเนินการ EIG ของ cov matrix เป็นวิธีหนึ่ง, SVD ของเมทริกซ์ดาต้าเซ็นเตอร์เป็นอีกวิธีหนึ่ง, แล้ว EIG และ SVD ก็สามารถทำได้ด้วยวิธีต่าง ๆ เช่นกัน ไม่สำคัญ - ทั้งหมดนั่นคือ PCA
อะมีบา

1
@ amoeba ขอบคุณสำหรับคำชี้แจง / การแก้ไขคำศัพท์ สิ่งที่คุณพูดเหมาะสมกับฉันเนื่องจาก SVD และ EIG เป็นทฤษฎี / วิธีเชิงพีชคณิตที่มีขอบเขตที่กว้างกว่า PCA
drake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.