การปรับใช้หน่วยความจำอย่างมีประสิทธิภาพของการแยกย่อยค่าเอกพจน์ (SVD) บางส่วน


10

สำหรับการลดแบบจำลองฉันต้องการคำนวณเวกเตอร์เอกพจน์ทางซ้ายที่เกี่ยวข้องกับ - พูด 20 - ค่าเอกพจน์ที่ใหญ่ที่สุดของเมทริกซ์โดยที่และ 3 น่าเสียดายเมทริกซ์ของฉันจะหนาแน่นโดยไม่มีโครงสร้างใด ๆ N 10 6 k 10 3 AARN,kN106k103A

หากฉันเพิ่งเรียกsvdรูทีนจากnumpy.linalgโมดูลใน Python สำหรับเมทริกซ์แบบสุ่มขนาดนี้ฉันพบข้อผิดพลาดของหน่วยความจำ เพราะนี่คือการจัดสรรสำหรับการสลายตัวVSU A = V S UVRN,NA=VSU

มีอัลกอริธึมที่หลีกเลี่ยงหลุมพรางนี้ไหม เช่นโดยการตั้งค่าเฉพาะเวกเตอร์เอกพจน์ที่สัมพันธ์กับค่าเอกพจน์ที่ไม่ใช่ศูนย์

ฉันพร้อมที่จะแลกเปลี่ยนในเวลาและความแม่นยำในการคำนวณ


1
น่าสนใจดูเหมือนว่า Numpy ไม่ทราบวิธีการทำSVD บาง ๆ ...
JM

ขอบคุณสำหรับคำใบ้ แท้จริงแล้ว numpy.linalg.svd มีตัวเลือกfull_matricesที่ถูกตั้งค่าเป็นเท็จเพื่อให้คำนวณเฉพาะส่วนที่ไม่ใช่ศูนย์ อย่างไรก็ตามมีวิธีที่จะลดการคำนวณให้ดียิ่งขึ้นไปอีกหรือไม่?
Jan

3
numpyแบ็กเอนด์ใช้รหัส Fortran ที่ LAPACKE_dgesvdประจำสำหรับ SVD มาตรฐาน อย่างไรก็ตามโดยทั่วไปเมทริกซ์ของคุณคือC_CONTIGOUS(ตรวจสอบด้วยmatrix.flags) ดังนั้นจึงคัดลอกข้อมูลสำหรับการจัดตำแหน่ง Fortran นอกจากนี้ในขณะที่รันชุดคำสั่ง lapack จะต้องทำสำเนาเมทริกซ์ของคุณอีกชุดหนึ่ง (หรืออย่างน้อยก็เป็นหน่วยความจำ) คุณสามารถกำจัดสำเนาหนึ่งชุดได้หากคุณแน่ใจว่าการจัดเรียงหน่วยความจำนั้นเป็นสไตล์ฟอร์แทรนตั้งแต่ต้น
Bort

คำตอบ:


6

หากคุณต้องการเพียงค่า / เวกเตอร์เอกพจน์เพียงเล็กน้อยARPACKควรทำเคล็ดลับ เอกสาร SVDจะไม่ดีและการกระจายนี้มีมากขึ้นถึงวันที่

แก้ไข: หากคุณต้องการที่จะทำเช่นนี้ในหลาม SciPy มีเสื้อคลุม เนื่องจากเมทริกซ์ของคุณมีความหนาแน่นคุณสามารถลองรูปแบบblock sparse row (BSR)


ผมจะได้ดูวิธีการทำงานร่วมกับ ARPACK หลาม ...
ม.ค.

1
ดูเหมือนว่า scipy มี wrappers ฉันจะเพิ่มพวกเขาเพื่อตอบเนื้อหา
Max Hutchinson

2

ดูsklearn.decomposition.TruncatedSVDใน scikit-Learn 0.14-rc
(ฉันเชื่อว่าคนที่เรียนรู้ scikit ติดตาม stackoverflow.com/questions/tagged/scikit-learnดังนั้นฉันจะถามคำถามโดยละเอียดที่นั่น)

(คุณมีหน่วยความจำเท่าไร 10คู่เป็น 8G แล้ว)6+3


ขอบคุณสำหรับคำตอบ. ตอนนี้ฉันทำได้ดีกับกิจวัตร scipy นอกจากนี้ฉันยังไม่ได้ไปจนถึงแต่ถึงครึ่งหนึ่งของสิ่งที่แล็ปท็อปของฉันยังสามารถทำได้ หากจำเป็นฉันสามารถใช้เครื่องที่ทำงานด้วย RAM ขนาด 32 GB 106×103
ม.ค.

2

บางทีคุณสามารถลองสิ่งนี้

https://github.com/jakevdp/pypropack

นี่คือเครื่องห่อหุ้มงูหลามสำหรับแพ็คเกจ PROPACK ซึ่งใช้การแยกย่อยค่าเอกพจน์ที่มีประสิทธิภาพบางส่วนของเมทริกซ์กระจัดกระจายขนาดใหญ่และตัวดำเนินการเชิงเส้น


2

Intel MKL ใช้อัลกอริทึม Jacobi-SVD ใหม่ นี่คือรายละเอียดการดำเนินการ: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

และรูทีน LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

ขนาดการทำงานแน่นอนสามารถปรับได้ คุณสามารถเรียกใช้ฟังก์ชัน C จาก Python ได้อย่างง่ายดายโดยใช้ Cython, SWIG หรือกลไกห่ออื่น ๆ

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