पीसीए बहुत धीमी है जब दोनों n, p बड़े हैं: विकल्प?


9

समस्या सेटअप

मेरे पास उच्च आयाम (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 मिनट, जो इस चरण के लिए मैं जितना खर्च कर सकता हूं) उससे कहीं अधिक लंबा है।

मैंने कर्नेल पीसीए के बारे में पढ़ा है जो उन मामलों के लिए अच्छा माना जाता है जिनमें आयाम बहुत बड़ा है, लेकिन इसका रनटाइम है हे(n3)जो समस्याग्रस्त हो सकता है क्योंकि मैं आयाम और उदाहरणों की संख्या दोनों के मामलों से निपटना चाहता हूं जो बड़े हैं।

जैसा कि मैं इसे देखता हूं, मेरे विकल्प या तो पीसीए को "ऑप्टिमाइज़" करने के लिए हैं या एक और आयामीता घटाने की विधि का विकल्प चुनने के लिए जो स्वाभाविक रूप से तेज है।

मेरे सवाल

  1. क्या कोई उम्मीद है कि पीसीए का उपयोग "ऑफ़लाइन" फैशन में किया जा सकता है? यानी, छवियों के एक बड़े डेटा सेट का उपयोग करते हुए, उन पर पीसीए प्रदर्शन करें, और फिर उनके लिए गणना किए गए प्रमुख घटकों का उपयोग अन्य (नए!) डेटा बिंदुओं के आयाम को कम करने के लिए करें ।
  2. क्या मैं आइजनवेक्टरों की गणना में तेजी ला सकता हूं, यह मानते हुए कि मैं समय से पहले जानता हूं कि मुझे केवल शीर्ष 100 प्रमुख घटकों में ही दिलचस्पी है?
  3. क्या कोई वैकल्पिक आयामी कमी विधि है जो मेरे मामले में उचित है (यानी, टी-स्नेन लगाने से पहले) जो पीसीए से तेज होगी? मैं एक ऐसी चीज की तलाश में हूं जिसे जावा में आसानी से लागू किया जा सके।

जवाबों:


8

प्रश्न 1: मान लीजिए कि आपने डेटा मैट्रिक्स देखा है एक्सआरn×पी। इससे आप इगेंडेकम्पोजीशन की गणना कर सकते हैंएक्सटीएक्स=क्यूΛक्यूटी। अब सवाल यह है कि यदि हम एक ही जनसंख्या से आने वाले नए डेटा प्राप्त करते हैं, तो शायद एक मैट्रिक्स में एकत्र किया जाता हैजेडआर×पी, मर्जी जेडक्यू आदर्श ऑर्थोगोनल रोटेशन के करीब हो जेड? इस तरह के प्रश्न को डेविस-कहन प्रमेय , और सामान्य रूप से मैट्रिक्स गड़बड़ी सिद्धांत द्वारा संबोधित किया जाता है (यदि आप एक प्रति प्राप्त कर सकते हैं, स्टीवर्ट और सन की 1990 की पाठ्यपुस्तक मानक संदर्भ है)।

प्रश्न 2: आप निश्चित रूप से चीजों को गति दे सकते हैं यदि आप जानते हैं कि आपको केवल शीर्ष की आवश्यकता है eigenvectors। इसके लिए आरआई उपयोग में rARPACK; मुझे यकीन है कि वहाँ एक जावा समकक्ष के बाद से वे वैसे भी सभी फोरट्रान रैपर हैं।

प्रश्न 3: मुझे जावा कार्यान्वयन के बारे में कुछ भी पता नहीं है, लेकिन यह धागा पीसीए को तेज करने की चर्चा करता है क्योंकि यह सीवी धागा है। इस तरह की चीजों पर एक टन का शोध है और निम्न रैंक सन्निकटन या रैंडमाइजेशन जैसी चीजों का उपयोग करते हुए कई तरीके हैं।


3

आपके द्वारा उपयोग किया जा रहा कोड संपूर्ण मैट्रिक्स को उल्टा कर देगा। यह शायद पहले से ही ओ (पी ^ 3) है। आप O (p ^ 2) में परिणाम का अनुमान लगा सकते हैं, लेकिन यह अभी भी धीमा होगा (लेकिन शायद 100x तेज)। अनिवार्य रूप से, एक मनमाना वेक्टर लें और पावर पुनरावृत्तियों को करें। उच्च संभावना के साथ, आपको पहले आइजनवेक्टर का एक अच्छा अनुमान मिलेगा। फिर इस कारक को मैट्रिक्स से हटा दें, दूसरा प्राप्त करने के लिए दोहराएं। आदि।

लेकिन क्या आपने कोशिश की है कि यदि ELKI में तेजी से बार्न्स हट tSNE कार्यान्वयन संभवत: कवर डेटा जैसे सूचकांक के साथ आपके डेटा पर काम करेगा? मैंने उस कार्यान्वयन को अच्छी तरह से काम किया है जब अन्य असफल रहे।


3
क्या करता है "whp।" पक्ष में?
कोडियोलॉजिस्ट

उच्च संभावना के साथ। सांख्यिकी साहित्य देखें।
है क्विट -

2

यदि आपका लक्ष्य सरल और प्रत्यक्ष तरीके से आयाम में कमी को प्रभावी बनाना है, तो आप एक वैकल्पिक न्यूनतम वर्ग (ALS) तकनीक की कोशिश कर सकते हैं। उदाहरण के लिए अपाचे स्पार्क का mlibएएलएस कार्यान्वयन है और मेरा मानना ​​है कि जावा एपि प्रदान करता है। यह आपको एn× मैट्रिक्स और ए ×पीआव्यूह। ×पी मैट्रिक्स में दृश्यमान पंक्ति वैक्टर होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.