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