"ग्रेनोला बार" के अलग-अलग द्रव्यमान का पता लगाने के लिए एल्गोरिथ्म -इकाई संरचनाएं?


19

मैं एक ग्रह विज्ञान शोधकर्ता हूं और एक परियोजना जिस पर मैं काम कर रहा हूं वह है शनि के छल्ले के एन- व्यक्ति सिमुलेशन। इस विशेष अध्ययन का लक्ष्य कणों को अपने आत्म-गुरुत्वाकर्षण के तहत एक साथ टकराते हुए देखना है और सेल में सभी कणों के औसत वेग बनाम क्लंप के कुल द्रव्यमान को मापना है। हम यह पता लगाने की कोशिश कर रहे हैं कि क्या यह सैटर्नियन गर्मियों के संक्रांति के दौरान कैसिनी अंतरिक्ष यान द्वारा किए गए कुछ अवलोकनों की व्याख्या कर सकता है जब बड़ी संरचनाओं को लगभग किनारे के छल्ले पर छाया डालते हुए देखा गया था। नीचे एक स्क्रीनशॉट दिया गया है जो किसी भी टाइमस्टेप जैसा दिखता है। (प्रत्येक कण 2 मीटर व्यास का होता है और सिमुलेशन सेल अपने आप में लगभग 700 मीटर होती है।)

_N__ -शरीर सैटर्न के छल्ले का एक कण जिसमें छोटे छायांकित क्षेत्रों के रूप में काले रंग की पृष्ठभूमि के साथ दिखाया गया है।

मैं पहले से उपयोग कर रहा कोड हर टाइमस्टेप पर औसत वेग निकालता हूं। क्लंप्स में कणों के द्रव्यमान को निर्धारित करने के लिए मुझे क्या करना चाहिए और उनके बीच आवारा कणों का पता नहीं लगाना चाहिए। मैं हर कण की स्थिति, द्रव्यमान, आकार इत्यादि को जानता हूं, लेकिन मुझे आसानी से पता नहीं है कि, कहो, कण 30,000-40,000 के साथ-साथ 102,000-105,000 एक स्ट्रैंड बनाते हैं जो कि मानव आंख के लिए स्पष्ट है।

इसलिए, मुझे जिस एल्गोरिथ्म को लिखने की आवश्यकता है, उसे कुछ कोड के साथ उपयोगकर्ता के रूप में दर्ज किए जाने की आवश्यकता होगी जो संभव हो (प्रतिकृति और निष्पक्षता के लिए) जो कि सभी कण पदों से गुजरेंगे, यह पता लगाएंगे कि कण किस कण से संबंधित हैं और फिर गणना करें द्रव्यमान। यह बहुत अच्छा होगा यदि यह "प्रत्येक" क्लंप / स्ट्रैंड के लिए ऐसा कर सकता है जैसा कि सेल के ऊपर सब कुछ है, लेकिन मुझे नहीं लगता कि मैं वास्तव में था उन्हें अलग करने की आवश्यकता है।

केवल एक चीज जो मैं सोच रहा था, वह एन 2 के कुछ प्रकार कर रही थी डिस्टेंस कैलकुलेशन के जहाँ मैं हर कण के बीच की दूरी की गणना करूँगा और अगर, कहूँ, निकटतम 100 कण एक निश्चित दूरी के भीतर थे, तो वह कण एक का हिस्सा माना जाएगा क्लस्टर। लेकिन यह बहुत ही टेढ़ा लगता है और मैं उम्मीद कर रहा था कि आप सीएस लोग और प्रोग्रामर एक और अधिक सुंदर समाधान के बारे में जान सकते हैं?


मेरे समाधान के साथ संपादित: क्या मैंने किया था निकटतम-पड़ोसी / क्लस्टर दृष्टिकोण का एक तरह से लेते हैं और जल्दी-एन-गंदा करने के लिए था एन 2 पहले कार्यान्वयन। इसलिए, हर कण को ​​लें, अन्य सभी कणों से दूरी की गणना करें, और एक क्लस्टर में थ्रेशोल्ड के लिए या नहीं, क्या डी दूरी के भीतर एन कण थे (दो मापदंडों को एक प्राथमिकता तय करनी होगी , दुर्भाग्य से, लेकिन जैसा कि कुछ ने कहा था प्रतिक्रियाएँ / टिप्पणियाँ, मैं उनमें से कुछ नहीं होने के साथ दूर नहीं जा रहा था)।

फिर मैंने इसे दूरियों को छाँटकर नहीं देखा, लेकिन केवल एक क्रम N खोज कर d के भीतर के कणों के लिए एक काउंटर बढ़ा दिया, और उस सामान को 6. के एक कारक द्वारा भर दिया। तब मैंने एक "बेवकूफ प्रोग्रामर का पेड़" जोड़ा (क्योंकि मुझे पता है) पेड़ कोड के बारे में कुछ भी नहीं)। मैं सिमुलेशन सेल को ग्रिड के एक सेट संख्या में विभाजित करता हूं (सबसे अच्छा परिणाम जब ग्रिड आकार up7 ) जहां सेल के साथ मुख्य ग्रिड लाइनें ऊपर होती हैं, एक ग्रिड एक्स और वाई में आधे से ऑफसेट होती है , और अन्य दो द्वारा ऑफसेट होते हैं X और । Y में 1/4 । कोड तब कणों को ग्रिड में विभाजित करता है, फिर प्रत्येक कण एन केवल उस सेल में अन्य कणों की गणना की दूरी होती है।

सैद्धांतिक रूप से, अगर यह एक वास्तविक पेड़ था, तो मुझे एन 2 लॉग के विपरीत ऑर्डर एन * लॉग ( एन ) प्राप्त करना चाहिए । मुझे दोनों के बीच कहीं मिला, जहां 50,000-कण उप-सेट के लिए मुझे गति में 17x की वृद्धि हुई, और 150,000-कण सेल के लिए, मुझे गति में 38x की वृद्धि हुई। पहले के लिए 12 सेकंड, दूसरे के लिए 53 सेकंड, 500,000-कण सेल के लिए 460 सेकंड। वे तुलनात्मक गति हैं कि सिमुलेशन 1 टाइमस्टेप को आगे बढ़ाने में कोड को कितना समय लगता है, इसलिए इस बिंदु पर यह उचित है। ओह - और यह पूरी तरह से पिरोया गया है, इसलिए इसे जितने प्रोसेसर मैं ले जाऊंगा, उतना ही मैं इसे फेंकूंगा।


3
मैं इस विषय पर विशेष रूप से जानकार नहीं हूं, इसलिए मैं स्वयं सहायता के रूप में बहुत कम प्रदान कर सकता हूं, लेकिन क्या आपने क्लस्टर विश्लेषण पर विकिपीडिया लेख पढ़ा है ? यह अध्ययन का एक बहुत सक्रिय क्षेत्र है।
कोल कैंपबेल

मैं क्लस्टर कोड के बारे में सावधान हूं, कम से कम DBSCAN जैसा कुछ है, क्योंकि मुझे लगता है कि यह कुछ पतले स्ट्रैंड्स का "पालन" करेगा, जो मुझे पता है कि नेत्रहीन क्लस्टर का हिस्सा नहीं हैं, लेकिन एल्गोरिदमिक रूप से हो सकता है। मेरे पास DBSCAN- प्रकार कोड के साथ अनुभव है क्योंकि मैं अपने अन्य काम के लिए उपयोग करता हूं, क्रेटर्स का अध्ययन कर रहा हूं।
स्टुअर्ट रॉबिंस

1
कोई भी कोड जो इस तरह से किस्में की पहचान करता है, लगभग निश्चित रूप से किसी प्रकार की "संवेदनशीलता" सेटिंग के साथ आएगा।
रॉबर्ट हार्वे

2
माना। यहां वास्तविक कठिनाई यह है कि "क्लंप" एक अच्छी तरह से परिभाषित शब्द नहीं है। दिन के अंत में आपको कुछ प्रकार के क्लस्टर विश्लेषण एल्गोरिदम के साथ जाना होगा (जो वास्तव में, आपके प्रस्तावित समाधान पहले से ही है), शायद कुछ प्रकार के शोर में कमी के साथ संयुक्त।
कोल कैंपबेल

2
अगर आपको लगता है कि आप अपनी तस्वीर खींचते हैं, तो आपको लगता है कि एक वैध क्लंप है (और संभवतः एक अमान्य है)
jk।

जवाबों:


3

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

तो, आइए देखें कि एक 'स्ट्रैंड' के हमारे सहज विचार के साथ क्या मेल खाता है। आपके किस्में लगभग समान रूप से वितरित बिंदुओं से मिलकर लगते हैं, हालांकि आपको ज़ूम-इन पिक्चर (मूल डेटासेट के) बनाकर इसकी जांच करनी चाहिए - आपकी तस्वीर का रिज़ॉल्यूशन निश्चितता के साथ कहना बहुत कम है कि अंक वास्तव में समान रूप से वितरित किए गए हैं । मुझे लगता है वे इस जवाब के लिए कर रहे हैं।

एक प्रारंभिक विचार हर बिंदु के निकटतम पड़ोसी को देखने का हो सकता है। आइए एक बिंदु X को चुनें, इसके निकटतम पड़ोसी Y को कॉल करें और D को X और Y के बीच की दूरी के रूप में सेट करें। हम तब X के चारों ओर C को त्रिज्या D * A के साथ देखते हैं, जहाँ A एक ट्यूनिंग पैरामीटर है, A = 3 कहते हैं। यदि X एक स्ट्रैंड का हिस्सा है, तो हम उम्मीद करते हैं कि C में हर बिंदु Z के लिए, Z से उसके निकटतम पड़ोसी W की दूरी D के समान है। यदि यह काफी छोटा है, तो A से अधिक कहें (या शायद कुछ अन्य पैरामीटर बी) तब एक्स जाहिरा तौर पर उन बिंदुओं के पास होता है जो एक्स के अलावा एक-दूसरे के बहुत करीब होते हैं, इसलिए एक्स शायद एक स्ट्रैंड का हिस्सा नहीं है।

यह मानदंड हालांकि पूर्ण नहीं है। यह केवल बिंदुओं वाले क्षेत्रों और बिंदुओं के साथ कम घने क्षेत्रों के बीच एक 'सीमा' का पता लगाने के लिए एक मानदंड देता है। हमें अभी भी स्ट्रैंड में एक साथ पॉइंट्स क्लस्टर करना है।

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

एक विचार निम्नलिखित करने के लिए हो सकता है। हम इन बिंदुओं पर एक ग्राफ बनाने जा रहे हैं, जहां कोने बिंदु हैं और किनारों का संकेत है कि दो बिंदुओं में समान घनत्व है। हर बिंदु के लिए, हम ऊपर की कसौटी की जाँच करते हैं। यदि यह जाँच करता है, हम X को C में सभी बिंदुओं के लिए एक किनारे से जोड़ते हैं। यदि यह जाँच नहीं करता है, तो हम किसी भी किनारे को नहीं जोड़ते हैं, और X को 'आवारा' के रूप में चिह्नित करते हैं। हर बिंदु के लिए ऐसा करने के बाद, हम सेट पर विचार करते हैं जुड़े घटकों हैं। इनमें एक एकल (आपकी तस्वीर के मामले में, लेकिन अन्य डेटासेट में एकाधिक) जुड़े घटक हो सकते हैं, जिसमें स्ट्रैंड्स में सभी बिंदु शामिल हैं, साथ ही एकल आवारा बिंदुओं और इन 'आवारा किस्सों' से अधिक घटक भी शामिल हैं। हालाँकि, इन आवारा किस्सों में वे बिंदु होते हैं जिन्हें 'आवारा' के रूप में चिह्नित किया गया है, इसलिए आप बस किसी भी घटक को अनदेखा कर सकते हैं जिसमें एक बिंदु है जिसे 'आवारा' के रूप में चिह्नित किया गया है।

इस विचार का एक खतरा यह है कि आपके पास एक विशेषता हो सकती है जहां स्ट्रैंड का घनत्व उत्तरोत्तर कम होता जाता है क्योंकि आप स्ट्रैंड के साथ चलते हैं, जब तक कि घनत्व इतना कम न हो जाए कि यह केवल आवारा बिंदुओं का एक सेट हो। जैसा कि हमारी कसौटी 'स्थानीय' है, यह इसका पता नहीं लगा सकता है और इन आवारा बिंदुओं को स्ट्रैंड के हिस्से के रूप में चिह्नित करता है। मुझे यकीन नहीं है कि अगर यह एक समस्या होगी: मुझे लगता है कि अधिकांश आवारा बिंदुओं को कसौटी से पकड़ा जाना चाहिए, क्योंकि घनत्व में परिवर्तन आपकी तस्वीर में काफी अचानक लगते हैं।

यदि यह समस्या होती है, तो आप केवल संबंधित घटकों को लेने के लिए एक विकल्प की कोशिश कर सकते हैं। हर बिंदु X के लिए, हम उसके निकटतम पड़ोसी D (X) से दूरी की गणना करते हैं। हम न्यूनतम डी (एक्स) के साथ बिंदु पर शुरू करते हैं और बीएफएस (या डीएफएस) करते हैं , ऑर्डर कोई फर्क नहीं पड़ता) करते हैं। हम ऐसे किसी भी बिंदु को जोड़ते हैं जिसका D (Y) उस D (X) से अधिक बड़ा नहीं है (एक तुनुकमिजाज कारक) जिसके साथ हमने शुरुआत की थी। यदि हम एक ऐसे बिंदु Y का सामना करते हैं जिसमें बहुत बड़ा D (Y) होता है, तो हम किनारे (X, Y) को हटा देते हैं, Y को 'आवारा' के रूप में चिह्नित करते हैं और ऐसा कार्य करते हैं मानो हमने कभी भी अपने BFS में Y का दौरा नहीं किया हो। यदि ठीक से ट्यून किया गया है, तो मुझे ऊपर वर्णित समस्या को रोकना चाहिए।

इस समस्या को ठीक करने के लिए एक वैकल्पिक विचार थोड़ा अधिक स्थानीय कार्य करता है: आप एक BFS कर सकते हैं और सबसे कम D (X) (I का उपयोग D (X) बिंदु के चारों ओर घनत्व के माप के रूप में करते हैं) का अधिक से अधिक 10 सामना करना पड़ा। बीएफएस-चरणों से पहले, और अगर हम एक वाई से सामना करते हैं जिसमें डी (वाई) है जो इस डी (एक्स) की तुलना में बहुत बड़ा है, तो हम दूसरे (संभावित) समाधान के रूप में वही करते हैं जो मैंने पेश किया था।

अस्वीकरण के रूप में: ऊपर दिए गए सभी विचारों को मैंने अभी-अभी मौके पर सोचा था, मैं वास्तव में नहीं जानता कि क्या इस विशेष समस्या का पहले अध्ययन किया गया है, इसलिए मैं सिर्फ बकवास कर सकता हूं। बस उन विचारों (चाहे मेरे विचार या आपके अपने) को आज़माएं, जो आपको समझदार लगते हैं और यह पता लगाते हैं कि क्या वे वास्तव में काम करते हैं, और केवल उन्हें कुशलतापूर्वक लागू करने पर ध्यान केंद्रित करें।


2

मॉड्यूलर अपघटन का उपयोग करके आप एक पेड़ बना सकते हैं जिसमें लीफ़्स के रूप में सभी कण होंगे और ऊपरी नोड्स इन क्लस्टर होंगे। उस पेड़ के आधार पर आप उन उपायों को परिभाषित कर सकते हैं जो इसे जड़ से लीफ्स तक नीचे की ओर लगाए जाते हैं। जब उपयोगकर्ता मापित थ्रेसहोल्ड तक पहुँचता है, तो आप इसे नीचे की ओर जाने वाले ट्रैवर्सल को रोक देते हैं। ऐसा एक माप एक क्लस्टर में सभी कणों के उत्तल पतलेपन का घनत्व हो सकता है।


1

मुझे लगता है कि आप मशीन को क्लस्टरिंग एल्गोरिथ्म सीखने के बाद कर रहे हैं।

Python SciKit Learn टूलकिट के इस पृष्ठ में ऐसे चित्र हैं जो सुझाव देते हैं कि DBSCAN एल्गोरिथम (विकिपीडिया) वह हो सकता है जिसकी आपको तलाश है। यह आदर्श लगता है क्योंकि यह इनपुट पैरामीटर पड़ोस का आकार है, जबकि अधिकांश अन्य क्लस्टरिंग एल्गोरिदम क्लस्टर की संख्या चाहते हैं, जिसे आप पहले से नहीं जानते होंगे।

नॉइज़ डिस्कवरी और डेटा माइनिंग, पोर्टलैंड, या 2 पर अंतर्राष्ट्रीय सम्मेलन की कार्यवाही में एस्टर, एम।, एचपी क्रिएगेल, जे। सैंडर और एक्स। जू के साथ बड़े स्थानिक डेटाबेस में क्लस्टर की खोज के लिए "एक घनत्व-आधारित एल्गोरिथम। , AAAI प्रेस, पीपी। 226231 1996


0

मैं इस समस्या के बारे में सोच रहा हूं। मैं भौतिकी का विशेषज्ञ नहीं हूं, इसलिए मेरे साथ रहिए।

ऐसा लगता है कि यह कणों के बीच की दूरी नहीं है जो गुच्छों को निर्धारित करने के लिए मायने रखता है। यह है कि गुरुत्वाकर्षण क्षेत्र ओवरलैप करते हैं या नहीं।

एक कण पी लें, और यह निर्धारित करें कि अन्य कणों में गुरुत्वाकर्षण क्षेत्र अतिव्यापी हैं।

फिर उनमें से एक ले लो और एक ही काम करो। आपका लक्ष्य क्लंप में सभी कणों को ढूंढना नहीं है, बल्कि इसकी सीमाओं को खोजना है।

इसे तब तक दोहराएं जब तक कि सभी गुच्छे न मिल जाएं।

अब वापस जाओ और गुच्छों का द्रव्यमान निर्धारित करें। आपने आवारा कणों को खत्म कर दिया होगा, और आप द्रव्यमान का पता लगाने के लिए क्लंप सीमाओं का उपयोग कर सकते हैं।

मुझे यकीन नहीं है कि यह मदद करता है, लेकिन यह वह सब है जिसके बारे में मैं सोच सकता था।


गुरुत्वाकर्षण क्षेत्र क्या है ?
डेविड काउडन

0

आप प्रत्येक टाइमस्टेप के अंत में, डेटा को एक ग्राफ में बदल सकते हैं, न्यूनतम फैले हुए पेड़ की गणना कर सकते हैं, और फिर एक निश्चित सीमा से अधिक के किनारों को निकालना शुरू कर सकते हैं। कि आप प्रत्येक क्लंप में कणों के माध्यम से गणना करने के लिए आपको क्लंप और एक आसान तरीका देना चाहिए।

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