PCA ช้าเกินไปเมื่อทั้ง n, p มีขนาดใหญ่: ทางเลือก?


9

การตั้งค่าปัญหา

ฉันมีจุดข้อมูล (ภาพ) ที่มีมิติสูง (4096) ซึ่งฉันกำลังพยายามมองเห็นเป็น 2D ด้วยเหตุนี้ผมใช้เสื้อ sne ในลักษณะที่คล้ายกับต่อไปนี้โค้ดตัวอย่างโดย Karpathy

เอกสาร scikit เรียนรู้แนะนำให้ใช้ PCA แรกลดขนาดของข้อมูล:

ขอแนะนำให้ใช้วิธีการลดขนาดแบบอื่น (เช่น PCA สำหรับข้อมูลหนาแน่นหรือ TruncatedSVD สำหรับข้อมูลแบบเบาบาง) เพื่อลดจำนวนมิติเป็นจำนวนที่เหมาะสม (เช่น 50) หากจำนวนคุณลักษณะสูงมาก

ฉันใช้รหัสนี้โดย Darks.Liu เพื่อดำเนินการ PCA ใน Java:

//C=X*X^t / m
DoubleMatrix covMatrix = source.mmul(source.transpose()).div(source.columns);
ComplexDoubleMatrix eigVal = Eigen.eigenvalues(covMatrix);
ComplexDoubleMatrix[] eigVectorsVal = Eigen.eigenvectors(covMatrix);
ComplexDoubleMatrix eigVectors = eigVectorsVal[0];
//Sort sigen vector from big to small by eigen values 
List<PCABean> beans = new ArrayList<PCA.PCABean>();
for (int i = 0; i < eigVectors.columns; i++) {
    beans.add(new PCABean(eigVal.get(i).real(), eigVectors.getColumn(i)));
}
Collections.sort(beans);
DoubleMatrix newVec = new DoubleMatrix(dimension, beans.get(0).vector.rows);
for (int i = 0; i < dimension; i++) {
    ComplexDoubleMatrix dm = beans.get(i).vector;
    DoubleMatrix real = dm.getReal();
    newVec.putRow(i, real);
}
return newVec.mmul(source);

มันใช้jblasสำหรับการดำเนินพีชคณิตเชิงเส้นซึ่งจากสิ่งที่ฉันได้อ่านมานั้นน่าจะเป็นตัวเลือกที่เร็วที่สุด อย่างไรก็ตามการคำนวณค่า eigenvector และค่าลักษณะเฉพาะ (บรรทัดที่ 3,4) กลายเป็นคอขวดขนาดใหญ่ (~ 10 นาทีซึ่งนานกว่าที่ฉันสามารถจ่ายได้สำหรับเวทีนี้)

ฉันได้อ่านเกี่ยวกับ Kernel PCA ซึ่งควรจะดีสำหรับเคสที่มิติมีขนาดใหญ่มาก แต่ runtime ของมันคือซึ่งอาจเป็นปัญหาได้เนื่องจากฉันต้องการจัดการกับทั้งขนาดและจำนวน ตัวอย่างมีขนาดใหญ่O(n3)

ตามที่ฉันเห็นตัวเลือกของฉันคือ "เพิ่มประสิทธิภาพ" PCA หรือเลือกใช้วิธีการลดขนาดอื่นซึ่งเร็วกว่าโดยธรรมชาติ

คำถามของฉัน

  1. มีความหวังหรือไม่ที่สามารถใช้ PCA ในรูปแบบ "ออฟไลน์" เช่นใช้ชุดข้อมูลขนาดใหญ่ของรูปภาพดำเนินการ PCA จากนั้นใช้องค์ประกอบหลักที่คำนวณเพื่อลดขนาดของจุดข้อมูลอื่น (ใหม่!)
  2. ฉันสามารถเร่งความเร็วในการคำนวณ eigenvector โดยสมมติว่าฉันรู้ล่วงหน้าว่าฉันสนใจ แต่เพียงผู้เดียวในองค์ประกอบหลัก 100 อันดับแรกใช่หรือไม่
  3. มีวิธีลดขนาดทางเลือกอื่นที่เหมาะสมในกรณีของฉัน (เช่นก่อนที่จะใช้ t-sne) ซึ่งจะเร็วกว่า PCA หรือไม่ ฉันกำลังมองหาบางสิ่งที่สามารถนำไปใช้ได้อย่างง่ายดายใน Java

คำตอบ:


8

คำถามที่ 1: สมมติว่าคุณได้สังเกตข้อมูลเมทริกซ์p} จากนี้คุณสามารถคำนวณ eigendecomposition T คำถามตอนนี้คือ: ถ้าเราได้รับข้อมูลใหม่ที่มาจากประชากรเดียวกันอาจถูกรวบรวมในเมทริกซ์ ,จะใกล้เคียงกับการหมุนมุมฉากของหรือไม่? คำถามประเภทนี้ตอบโดยทฤษฎีบทเดวิส - คาฮานและทฤษฎีการก่อกวนเมทริกซ์โดยทั่วไป (หากคุณสามารถได้รับสำเนาสำเนาตำราเรียนสจ๊วตและดวงอาทิตย์ของปี 2533 เป็นข้อมูลอ้างอิงมาตรฐาน)XRn×พีXTX=QΛQTZRม.×พีZQZ

คำถามที่ 2: คุณแน่นอนสามารถเพิ่มความเร็วสิ่งขึ้นถ้าคุณรู้ว่าคุณต้องการเพียงด้านบน eigenvectors ใน RI ใช้สำหรับสิ่งนี้; ฉันแน่ใจว่ามี Java เทียบเท่าเพราะพวกเขากำลังห่อหุ้ม Fortran อยู่แล้วkrARPACK

คำถามที่ 3: ฉันไม่รู้อะไรเลยเกี่ยวกับการใช้งาน Java แต่เธรดนี้พูดถึงการเร่ง PCA เช่นเดียวกับเธรด CV นี้ มีงานวิจัยมากมายเกี่ยวกับสิ่งนี้และมีวิธีการมากมายในการใช้สิ่งต่าง ๆ เช่นการประมาณอันดับต่ำหรือการสุ่ม


3

รหัสที่คุณใช้จะกลับเมทริกซ์ทั้งหมด นี่อาจเป็น O (p ^ 3) อยู่แล้ว คุณสามารถประมาณผลลัพธ์ใน O (p ^ 2) แต่นั่นจะยังคงช้า (แต่อาจเร็วกว่า 100x) โดยพื้นฐานแล้วใช้เวกเตอร์ตามอำเภอใจและทำการคำนวณซ้ำ ด้วยความน่าจะเป็นสูงคุณจะได้รับการประมาณค่า eigenvector แรกที่ดี จากนั้นลบปัจจัยนี้ออกจากเมทริกซ์ทำซ้ำเพื่อรับวินาที เป็นต้น

แต่คุณเคยลองไหมถ้าการใช้งาน Barnes Hut tSNE อย่างรวดเร็วใน ELKI อาจจะใช้ข้อมูลของคุณด้วยดัชนีเช่นต้นไม้ปกคลุมได้หรือไม่? ฉันเคยใช้งานได้ดีเมื่อคนอื่นล้มเหลว


3
"whp" คืออะไร หมายถึง?
ประสาทวิทยา

ด้วยความน่าจะเป็นสูง ดูเอกสารทางสถิติ
แล้ว - Anony-Mousse

2

หากเป้าหมายของคุณเพียงเพื่อลดผลกระทบในมิติที่เรียบง่ายและตรงไปตรงมาคุณสามารถลองใช้เทคนิคกำลังสองน้อยที่สุด (ALS) เช่น Apache Spark's mlibมีการใช้งาน ALS และฉันเชื่อว่ามี Java api สิ่งนี้ควรให้คุณn×K เมทริกซ์และ K×พีมดลูก K×พี เมทริกซ์จะมีเวกเตอร์แถวที่มองเห็นได้

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