2 डी फ़ंक्शन के अनुकूल तरीके से नमूना लेने के लिए कौन से सरल तरीके हैं?


22

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

ऐसा करने के लिए कौन से अच्छे तरीके हैं?

मेरे पास अब तक क्या है

  • मैं उन बिंदुओं के एक मौजूदा सेट से शुरू करता हूं जहां मैंने पहले ही फ़ंक्शन मान की गणना कर ली है (यह अंकों का वर्ग जाली या कुछ और हो सकता है)।

  • फिर मैं इन बिंदुओं के एक डेलूनाय त्रिकोण की गणना करता हूं।

  • यदि Delaunay त्रिभुज में दो पड़ोसी बिंदु काफी दूर हैं ( ) और फ़ंक्शन मान उनमें पर्याप्त रूप से भिन्न होता है ( ), तो मैं उन्हें एक नया बिंदु मध्य मार्ग सम्मिलित करता हूं। मैं प्रत्येक पड़ोसी बिंदु-जोड़ी के लिए ऐसा करता हूं।> Δ >ΔX>Δf

इस विधि में क्या गलत है?

ठीक है, यह अपेक्षाकृत अच्छी तरह से काम करता है, लेकिन इसके समान कार्यों पर यह आदर्श नहीं है क्योंकि नमूना बिंदु रिज पर "कूद" जाते हैं और यहां तक ​​कि यह भी नोटिस नहीं करते हैं।

गणितज्ञ ग्राफिक्स

यह इस तरह से परिणाम उत्पन्न करता है (यदि प्रारंभिक बिंदु ग्रिड का संकल्प पर्याप्त रूप से मोटा है):

गणितज्ञ ग्राफिक्स

ऊपर यह प्लॉट उन बिंदुओं को दर्शाता है जहां फ़ंक्शन मान की गणना की जाती है (वास्तव में उनके आसपास वोरोनोई कोशिकाएं)।

गणितज्ञ ग्राफिक्स

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

इसे कैसे सुधारें?

मुझे लगता है कि यहां मुख्य मुद्दा यह है कि मेरी विधि यह तय करती है कि ग्रेडिएंट के आधार पर शोधन बिंदु जोड़ना है या नहीं।

शोधन बिंदुओं को जोड़ते समय वक्रता या कम से कम दूसरी व्युत्पन्नता को ध्यान में रखना बेहतर होगा।

सवाल

दूसरी व्युत्पन्न या वक्रता को ध्यान में रखने के तरीके को लागू करने के लिए एक बहुत ही सरल क्या है जब मेरे बिंदुओं के स्थान बिल्कुल भी विवश नहीं हैं? (मुझे जरूरी नहीं कि शुरुआती बिंदुओं का एक वर्ग जाली हो, यह आदर्श रूप से सामान्य होना चाहिए।)

या इष्टतम तरीके में शोधन बिंदुओं की स्थिति की गणना करने के लिए अन्य सरल तरीके क्या हैं?

मैं इसे गणितज्ञ में लागू करने जा रहा हूं, लेकिन यह सवाल मुख्य रूप से विधि के बारे में है। "लागू करने में आसान" बिट के लिए यह गणना करता है कि मैं गणित का उपयोग कर रहा हूं, हालांकि (यह अब तक करना आसान था क्योंकि इसमें डेलुनाय त्रिभुज करने के लिए एक पैकेज है)

मैं इसे किस व्यावहारिक समस्या के लिए लागू कर रहा हूं

मैं एक चरण आरेख की गणना कर रहा हूं। इसका एक जटिल आकार है। एक क्षेत्र में इसका मान 0 है, दूसरे क्षेत्र में यह 0 और 1 के बीच है। दोनों क्षेत्रों के बीच एक तेज उछाल है (यह बंद है)। उस क्षेत्र में जहाँ फ़ंक्शन शून्य से अधिक है, दोनों में कुछ भिन्नताएँ हैं और कुछ भिन्नताएँ हैं।

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

मैंने पहले ही Mathematica.SE पर यह पूछा है, लेकिन मैं इसे लिंक नहीं कर सकता क्योंकि यह अभी भी निजी बीटा में है। यह प्रश्न यहां पद्धति के बारे में है, कार्यान्वयन के बारे में नहीं।


उत्तर @suki को

क्या यह आपके द्वारा सुझाए गए विभाजन का प्रकार है, अर्थात त्रिकोण के बीच में एक नया बिंदु?

गणितज्ञ ग्राफिक्स गणितज्ञ ग्राफिक्स गणितज्ञ ग्राफिक्स गणितज्ञ ग्राफिक्स

यहां मेरी चिंता यह है कि इस क्षेत्र के किनारों पर विशेष हैंडलिंग की आवश्यकता है, अन्यथा यह बहुत लंबे और बहुत पतले त्रिकोण देगा, जैसा कि ऊपर दिखाया गया है। क्या आपने इसके लिए सही किया?

अद्यतन करें

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

यहाँ दो उदाहरण हैं:

EX1 ex2

पहला परिणाम तब दिखाई देता है जब एक सीधी डिस्कनेक्टिटी के आसपास नमूना होता है। दूसरा समान मामले के लिए नमूना बिंदु वितरण दिखाता है।

इससे बचने के लिए क्या सरल तरीके हैं? वर्तमान में मैं केवल उन अहंकारों को दूर कर रहा हूं जो एक रिट्रीएंगुलेशन के बाद गायब हो जाते हैं, लेकिन यह एक हैक की तरह लगता है और सममित मेषों (एक वर्ग ग्रिड की तरह) के मामले में देखभाल के साथ किए जाने की आवश्यकता होती है, कई वैध डेलॉना ट्राइंगुलेशन हैं, इसलिए किनारों में बदलाव हो सकता है बेतरतीब ढंग से सेवानिवृत्ति के बाद।


क्या इस मुद्दे पर कोई नया घटनाक्रम है?
आंद्रेई

जवाबों:


10

मैंने कुछ समय पहले इसी तरह की समस्या पर काम किया था।

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

मुझे लगता है कि त्रिकोण के अंदर अंक जोड़ने से पुराने बिंदुओं से नए की औसत दूरी में थोड़ी वृद्धि करके इसे और अधिक कुशल बना दिया जाएगा।

वैसे भी किनारों के बजाय त्रिकोण का उपयोग करने के बारे में एक और अच्छी बात यह है कि यह ढाल वेक्टर के एक अनुमान देता है, बजाय इस विशेष किनारे के साथ ढलान।

अपने मैटलैब कोड में, मैंने कुछ सार विधियों के साथ मशीनरी की अधिकांश देखभाल करने के लिए बेस क्लास का उपयोग किया:

  • weight(self) प्राथमिकता तय करने के लिए कि कौन सा त्रिकोण अगले उपविभाजित करता है।
  • choosePoints(self,npoints = "auto") प्रत्येक त्रिकोण के वजन के आधार पर मूल्यांकन करने के लिए नए बिंदु तय करना।

मुझे यह सेटअप बहुत लचीला लगा:

  • weight()त्रिकोण के क्षेत्र में एक उप-वर्ग के फ़ंक्शन को सेट करना एक निरंतर मेष घनत्व पैदा करता है।
  • weight()त्रिभुज का क्षेत्रफल औसत कार्य मान की गणना करने के लिए सेटिंग एक प्रकार का अर्ध-यादृच्छिक प्रायिकता नमूना देता है।
  • var(triangle.zs)बाइनरी आउटपुट वाले फ़ंक्शंस के लिए, मैं ऐसा कर सकता हूं, जो मुझे लगता है कि 1 आयाम से अधिक के लिए बाइसेक्शन खोज का सामान्यीकरण है।
  • का उपयोग करना area + var(triangle.zs)हर जगह एक निरंतर घनत्व डालने में बहुत प्रभावी था, और किसी भी ढलान के साथ एक वृद्धि हुई घनत्व (लगभग अब आपके पास क्या है)।

मैंने पहले मूल्यों के प्रभाव (ढलान) के महत्व को अनुमानित करने के लिए z मानों के विचरण का उपयोग किया, क्योंकि विचरण कभी भी ढलान की तरह अनंतता में नहीं जाएगा।

अंतिम उदाहरण के लिए पृष्ठभूमि का घनत्व अच्छा था क्योंकि मैं कम मूल्य के अंतरिक्ष में उच्च मूल्य के असंतुलित बूँदें खोज रहा था। तो यह धीरे-धीरे पूरे जाल में भर जाएगा और जब यह एक बूँद पाएगा तो यह चारों ओर बूँद के किनारे का अनुसरण करने पर ध्यान केंद्रित करेगा क्योंकि मेरे द्वारा ढाल पर लगाए गए उच्च वजन के कारण (और यह केवल शीर्ष nत्रिकोण में भरा हुआ है प्रत्येक पुनरावृत्ति पर)। अंत में मैं जान सकता था कि परिणामी पृष्ठभूमि मेष घनत्व से अधिक आकार का कोई (यथोचित आकार) ब्लब्स (या मेरे ब्लॉब्स में छेद) नहीं थे।

जैसे आपको मेरे परिणामों में कुछ खराब अंक मिले, वे मेरे लिए समस्या नहीं थे क्योंकि त्रुटि ऐसी थी कि यदि आप पास के बिंदुओं पर फिर से दौड़ते तो वे शायद सही उत्तर देते। मैं बस अपने खराब बिंदुओं के आसपास बढ़ी हुई जाली घनत्व के ब्लिप्स के साथ समाप्त करूंगा।

आप जो कुछ भी करते हैं मैं हमेशा त्रिकोण आकार से संबंधित भार बनाने की सलाह देता हूं ताकि, सभी समान हो, बड़े त्रिकोण पहले टूट गए।

हो सकता है कि आपके लिए एक समाधान यह है कि मेरे दृष्टिकोण को एक कदम आगे ले जाना है और उस त्रिकोणीय सेल की सामग्री के आधार पर त्रिकोणों का मूल्यांकन करने के बजाय, उस एक और सभी तीन आसन्न त्रिकोणों के आधार पर मूल्यांकन करें।

संपूर्ण हेसियन मैट्रिक्स का अनुमान प्राप्त करने के लिए पर्याप्त जानकारी होगी। आप इसे z = c1*x + C2*y c11*x^2+c12*x*y+c22*y^2ब्याज के त्रिकोण में सभी वर्टेक्स के ऊपर एक कम से कम वर्ग फिट करके प्राप्त कर सकते हैं (केंद्र पहले त्रिभुज पर समन्वय प्रणाली)।

मैं ग्रेडिएंट या हेसियन (उन स्थिरांक) का उपयोग सीधे नहीं करूंगा क्योंकि वे एक असंतोष पर अनंत तक जाएंगे।

हो सकता है कि उन बिंदुओं के प्लानेर सन्निकटन के सापेक्ष z मानों की सम-वर्ग-त्रुटि एक दिलचस्प उपाय हो कि दूसरे दिलचस्प प्रभाव कैसे हो सकते हैं।


अपडेट किया गया:

जो मुझे उचित लगता है।

मैं वास्तव में किनारों पर विशेष आवरण लगाने के लिए कभी नहीं मिला। इसने मुझे थोड़ा परेशान किया लेकिन मैं जो कर रहा था, वह सिर्फ किनारों के आसपास बहुत सारे बिंदुओं के साथ शुरू करने के लिए पर्याप्त था।

अधिक सुरुचिपूर्ण हमारे दो दृष्टिकोणों, भारित किनारों और त्रिकोणों को संयोजित करना होगा। फिर अगर कोई किनारा बहुत लंबा है, तो उसे आधे में काटें ... मुझे यह पसंद है कि अवधारणा उच्च आयामों के लिए सामान्यीकरण करती है (लेकिन संख्या बहुत तेज़ हो जाती है ...)

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

एक बात जो मुझे कभी भी अच्छी नहीं लगी, वह यह थी कि मेरा संस्करण प्रारंभिक बिंदु सेट के उत्तल पतवार के बाहर कभी नहीं देखा जाएगा।


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

क्या आप कृपया मेरा संपादन देख सकते हैं और स्पष्ट कर सकते हैं?
स्ज़बोल्क्स

यह पता चला है कि किनारों पर विशेष आवरण होना अपरिहार्य है, चाहे मैं किसी भी उपखंड योजना का उपयोग करूं। मेरे मामले में मेरे पास एक उच्च ढाल सीधा है, लेकिन इसके समानांतर नहीं है, जो किनारों को विशेष मामला नहीं होने पर चीजों को अक्षम बना रहा था।
स्ज़बोल्क्स

मुझे एक और समस्या यह मिली कि री-ट्राइंगुलेशन के कारण बड़े त्रिकोण कभी-कभी दिखाई देते हैं जहाँ कोने में भिन्न फ़ंक्शन मान होते हैं। मैं इस तरह की चीजों के साथ समाप्त हुआ: i.stack.imgur.com/nRPwi.png रैखिक रूप से प्रक्षेपित घनत्व प्लॉट है, और i.stack.imgur.com/208bP.png नमूना बिंदु (बिल्कुल समान नहीं) है। यह एक सीधे किनारे के साथ एक असंगतता है। क्या आपने इस समस्या को मारा? यदि हाँ, तो आपने इसे कैसे हल किया? क्या आपने प्रत्येक उपखंड कदम के बाद पूरी तरह से पुनः प्रयास किया?
स्ज़बोल्क्स

मुझे यकीन नहीं है कि त्रिकोणीय वास्तव में यहां कुछ भी मतलब है। प्रत्येक बिंदु जिसे आपने मूल्यांकन किया था, एक बिंदु पर फ़ंक्शन का मूल्य है, इसलिए वे कुछ ऐसा क्यों नहीं करते हैं जैसे वे मेष-मुक्त विधियों में उपयोग करते हैं? en.wikipedia.org/wiki/Smoothed-particle_hydrodynamics आप डेरिवेटिव का इस तरह भी अनुमान लगा सकते हैं ...
meawoppl

0

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

एक क्विक फिक्स चार बिंदुओं के सेटों पर विचार करना होगा, जो उनके गुरुत्वाकर्षण के केंद्र को ले रहे हैं, और सन्निकटन | dfdx | + + | dfdy उन चार बिंदुओं का उपयोग करके। एक अन्य विकल्प तीन बिंदुओं (यानी एक त्रिकोण) को लेना है और उनके ऊपर सतह का अधिकतम ढाल लेना है।

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