समस्या सेटअप
मेरे पास उच्च आयाम (4096) के डेटा पॉइंट (चित्र) हैं, जिन्हें मैं 2 डी में कल्पना करने की कोशिश कर रहा हूं। यह अंत करने के लिए, मैं Karpathy द्वारा निम्नलिखित उदाहरण कोड के समान तरीके से t-sne का उपयोग कर रहा हूं ।
Scikit सीखने प्रलेखन पहली डेटा के आयाम को कम करने के पीसीए उपयोग करने की सलाह:
यदि सुविधाओं की संख्या बहुत अधिक है, तो आयामों की संख्या को कम करने के लिए एक अन्य आयामी घटाव विधि (जैसे घने डेटा के लिए पीसीए और विरल डेटा के लिए ट्रंककेटेडएसवीडी) का उपयोग करने की अत्यधिक अनुशंसा की जाती है।
मैं जावा में पीसीए प्रदर्शन करने के लिए Darks.Liu द्वारा इस कोड का उपयोग कर रहा हूं:
//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);
यह रैखिक बीजगणित के संचालन के लिए जाब्लास का उपयोग करता है , जो मैंने पढ़ा है, वहां से सबसे तेज विकल्प माना जाता है। हालांकि, eigenvectors और eigenvalues (लाइनों 3,4) की गणना एक बड़ी अड़चन बन जाती है (~ 10 मिनट, जो इस चरण के लिए मैं जितना खर्च कर सकता हूं) उससे कहीं अधिक लंबा है।
मैंने कर्नेल पीसीए के बारे में पढ़ा है जो उन मामलों के लिए अच्छा माना जाता है जिनमें आयाम बहुत बड़ा है, लेकिन इसका रनटाइम है जो समस्याग्रस्त हो सकता है क्योंकि मैं आयाम और उदाहरणों की संख्या दोनों के मामलों से निपटना चाहता हूं जो बड़े हैं।
जैसा कि मैं इसे देखता हूं, मेरे विकल्प या तो पीसीए को "ऑप्टिमाइज़" करने के लिए हैं या एक और आयामीता घटाने की विधि का विकल्प चुनने के लिए जो स्वाभाविक रूप से तेज है।
मेरे सवाल
- क्या कोई उम्मीद है कि पीसीए का उपयोग "ऑफ़लाइन" फैशन में किया जा सकता है? यानी, छवियों के एक बड़े डेटा सेट का उपयोग करते हुए, उन पर पीसीए प्रदर्शन करें, और फिर उनके लिए गणना किए गए प्रमुख घटकों का उपयोग अन्य (नए!) डेटा बिंदुओं के आयाम को कम करने के लिए करें ।
- क्या मैं आइजनवेक्टरों की गणना में तेजी ला सकता हूं, यह मानते हुए कि मैं समय से पहले जानता हूं कि मुझे केवल शीर्ष 100 प्रमुख घटकों में ही दिलचस्पी है?
- क्या कोई वैकल्पिक आयामी कमी विधि है जो मेरे मामले में उचित है (यानी, टी-स्नेन लगाने से पहले) जो पीसीए से तेज होगी? मैं एक ऐसी चीज की तलाश में हूं जिसे जावा में आसानी से लागू किया जा सके।