लाखों डेटा बिंदुओं के लिए बार-बार निकटतम पड़ोसी गणना बहुत धीमी है


14

मेरे पास 3D में लाखों डेटा बिंदुओं पर चलने वाला डेटासेट है। मैं जो गणना कर रहा हूं, उसके लिए मुझे एक त्रिज्या में प्रत्येक डेटा बिंदु पर पड़ोसी (रेंज खोज) की गणना करने की आवश्यकता है, एक फ़ंक्शन को फिट करने का प्रयास करें, फिट के लिए त्रुटि की गणना करें, अगले डेटापॉइंट के लिए इसे दोहराएं और इसी तरह। मेरा कोड ठीक से काम करता है, लेकिन इसे चलाने में बहुत समय लग रहा है, प्रति सेकंड 1 सेकंड के आसपास! यह शायद इसलिए है क्योंकि प्रत्येक बिंदु के लिए, इसे संपूर्ण डेटासेट में खोजना पड़ता है। क्या कोई तरीका है जिससे मैं प्रक्रिया को तेज कर सकूं। मेरे पास एक विचार है कि अगर मैं किसी तरह पहले पड़ोसियों के बीच कुछ आसन्न संबंध स्थापित कर सकता हूं, तो यह कम धीमा हो सकता है। यदि यह मदद करता है, तो मैं 3 डी में इष्टतम परजन खिड़की की चौड़ाई खोजने की कोशिश कर रहा हूं।

जवाबों:


9

मैं वॉल्यूम पदानुक्रम (विशेष रूप से बीएसपी पेड़) को बाउंड करने के लिए सुझाव देना चाहूंगा। अपने पॉइंट क्लाउड को देखते हुए, आप एक प्लेन पा सकते हैं जो इसे दो बराबर उप-खंडों में विभाजित करता है। फिर जब आपको उन बिंदुओं के संग्रह को खोजने की आवश्यकता होती है जो परीक्षण बिंदु के कुछ त्रिज्या R के भीतर होते हैं, तो आप पहले अपने परीक्षण बिंदु की तुलना उस विमान से कर सकते हैं, और यदि इसकी ऊंचाई R से अधिक है, तो समतल के नीचे पूरा उपखंड है आर की तुलना में बहुत दूर होना चाहिए (इसलिए आपको उन बिंदुओं की जांच करने की आवश्यकता नहीं है)। आप इस विचार को पुनरावर्ती रूप से भी लागू कर सकते हैं, अंततः n-squared के बजाय n log n प्रकार की जटिलताएं ला सकते हैं। (यह बीएसपी / बाइनरी स्पेस विभाजन है,


7

स्थिति और निकटता के बारे में जानकारी को संरक्षित करने वाले डेटा को संग्रहीत करने के लिए कई डेटा संरचनाएं हैं; तेजी से निकटतम पड़ोसी (एस) के निर्धारण की अनुमति देकर।

विशेष रूप से आर- ट्रीज़ (और आर- ट्रीज़ जैसे विशिष्ट रूप ) और एक्स- ट्रीज़ । पसंद के बहुत सारे जो थोड़े अलग उपयोगों के लिए अनुकूलित हैं।

एक भोली निकटतम पड़ोसी लुक-अप के बजाय एक आर * -ट्री का चयन करना मेरे लिए एक विशेष कोड से 10000 गति के कारक का एक बड़ा हिस्सा था। (ठीक है, इस बात का शायद कुछ सौ आर * पेड़ था, बाकी के अधिकांश था, क्योंकि अनुभवहीन लुक-अप बुरी तरह तो कोडित किया गया था कि यह कैश तोड़ी। :: विलाप :: )

इन संरचनाओं में विशिष्ट ( पॉइंट ऑफ स्टोर की गई संख्या) प्रविष्टि प्रदर्शन और भंडारण की आवश्यकता और लुक-अप प्रदर्शन हैं, इसलिए वे बहुत अच्छे लगते हैं, यदि आप बहुत सारे काम करते हैं (कहते हैं) DBSCAN में प्रत्येक बिंदु के लिए एक); हालांकि उनमें से कुछ के पास सबसे खराब स्थिति है।N O ( लॉग एन )O(NlogN)NO(logN)


5

यह आणविक गतिकी के क्षेत्र में सबसे बड़ी चुनौतियों में से एक के समान है- गैर-संयोजी कणों के बीच युग्म के सभी अंतःक्रियाओं की गणना।

वहाँ, हम सेल सूचियों (या पड़ोसी सूचियों ) का उपयोग करते हैं ताकि हमें पता चल सके कि पास क्या है; इस एप्लिकेशन के लिए, सेल सूची संभवतः उपयोग करने के लिए आसान एल्गोरिदम है:

  • कोशिकाओं की एक श्रृंखला में बॉक्स को विभाजित करें।
  • प्रत्येक कण के लिए, यह निर्धारित करें कि इसे किस सेल को सौंपा जाना चाहिए (ओ (1) प्रति कण)।
  • फिर, प्रत्येक कण के लिए, "स्वयं" सेल प्लस पड़ोसी कोशिकाओं की जांच करें; यदि इनमें से किसी पर भी कब्जा किया जाता है, तो आगे कोई खोज आवश्यक नहीं है।
  • यदि सभी निकटतम पड़ोसी खाली हैं, तो अगले-निकटतम पड़ोसियों तक विस्तार करें, और इसी तरह, जब तक एक कण नहीं मिलता है।

यदि आपके सिस्टम में कणों का अधिक या कम समान वितरण है, तो यह ग्रिड की coarseness के अनुसार, आपके एल्गोरिथ्म की लागत को काफी कम कर देगा। हालांकि, कुछ ठीक ट्यूनिंग आवश्यक है: एक ग्रिड को मोटे करना और आप ज्यादा समय नहीं बचाएंगे; बहुत ठीक है, और आप खाली ग्रिड कोशिकाओं पर बहुत समय बिताएंगे!


आपको इंगित करना चाहिए कि सेल किनारे की लंबाई कम से कम खोज त्रिज्या होनी चाहिए, या यदि प्रत्येक कण की अपनी खोज त्रिज्या है, तो अधिकतम त्रिज्या।
पेड्रो

एमडी मामले में यह सच है; यहाँ, हम नहीं जानते कि वह त्रिज्या एक प्राथमिकता है
आइज़्मेल

एक समान योजना का उपयोग बड़े पैमाने पर कण बादल गुरुत्वाकर्षण सिमुलेशन में लंबे समय तक किया गया था। मुझे नहीं पता कि क्या यह अभी भी कला की स्थिति का हिस्सा है।
dmckee --- पूर्व-मध्यस्थ बिल्ली का बच्चा

4

आपको निश्चित रूप से केडी के पेड़ और ऑक्ट्रीज़ की जांच करनी चाहिए जो बिंदु सेट के लिए पसंद के तरीके हैं (जबकि बीएसपी सामान्य वस्तुओं के लिए हैं, और अधिक या कम समान घनत्व के लिए ग्रिड)। वे बहुत कॉम्पैक्ट और तेज हो सकते हैं, स्मृति और गणना दोनों में ओवरहेड को कम कर सकते हैं, और लागू करने के लिए सरल हैं।

जब आपके अंक कम या ज्यादा समान रूप से वितरित किए जाते हैं (भले ही खाली क्षेत्रों के साथ, लेकिन घनत्व घनत्व या अन्य उच्च एकाग्रता नहीं होनी चाहिए) यदि आप ग्रिड जैसी गैर-पदानुक्रमित अंतरिक्ष उपखंड की कोशिश करना चाहते हैं तो गोले की पैकिंग की जांच करें।


3

आपको शायद डिलायने त्रिकोण (अच्छी तरह से, इसके 3 डी एनालॉग) के निर्माण पर विचार करना चाहिए । 2 डी में, यह डेटा बिंदुओं का एक विशेष त्रिकोण है जिसमें हमेशा निकटतम पड़ोसी शामिल होता है। वही 3 डी में है, लेकिन टेट्राहेड्रा के साथ है।

आप एक बार और सभी त्रिभुज के लिए निर्माण कर सकते हैं, और फिर त्रिकोण में सीधे निकटतम पड़ोसी की खोज कर सकते हैं। मुझे लगता है कि त्रिभुज के निर्माण के लिए कुछ अच्छे एल्गोरिदम हैं: 2 डी में, त्रिकोणीय का निर्माण और निकटतम पड़ोसी के लिए बाद की खोज डेटा बिंदुओं की संख्या में रैखिक है।nlog(n)

आशा करता हूँ की ये काम करेगा!

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