एक डिस्क पर एक समान वितरण का अनुकरण करें


24

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

: चूंकि यह एक गोलाकार क्षेत्र के भीतर अंक रखने की आवश्यकता है, मैं ध्रुवीय निर्देशांक में दो वर्दी यादृच्छिक वितरण इंजेक्शन (दायरा) और θ (ध्रुवीय कोण)।Rθ

लेकिन इस इंजेक्शन को करने के बाद, मुझे स्पष्ट रूप से किनारे की तुलना में सर्कल के केंद्र में अधिक अंक मिलते हैं।

यहाँ छवि विवरण दर्ज करें

सर्कल के पार इस इंजेक्शन को निष्पादित करने का सही तरीका क्या होगा, जिससे अंक बेतरतीब ढंग से पूरे विरल में वितरित किए जाते हैं?


: यह सवाल ज्यामिति मंच में एक सटीक अनुरूप है math.stackexchange.com/questions/87230/...
Aksakal

जवाबों:


35

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

यह कोड के लिए त्वरित और सरल है, निष्पादन में कुशल (विशेष रूप से एक समानांतर मंच पर), और बिल्कुल निर्धारित अंक बनाता है।

उदाहरण

यह Rएल्गोरिदम को चित्रित करने के लिए कोड काम कर रहा है।

n <- 1e4
rho <- sqrt(runif(n))
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

यहाँ छवि विवरण दर्ज करें


3

अस्वीकृति नमूनाकरण का उपयोग किया जा सकता है। इसका अर्थ है कि हम 2D वर्दी वितरण से नमूना ले सकते हैं, और डिस्क की स्थिति को संतुष्ट करने वाले नमूनों का चयन कर सकते हैं।

यहाँ एक उदाहरण है।

x=runif(1e4,-1,1)
y=runif(1e4,-1,1)

d=data.frame(x=x,y=y)
disc_sample=d[d$x^2+d$y^2<1,]
plot(disc_sample)

यहाँ छवि विवरण दर्ज करें


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

1
π/4

@ मेरे उत्तर की टिप्पणी करके मुझे शिक्षित करने के लिए धन्यवाद!
हाइताओ डु

3

मैं आपको एक सामान्य n- आयामी उत्तर दूंगा जो दो-आयामी मामले के लिए भी काम करता है, निश्चित रूप से। तीन आयामों में एक डिस्क का एक एनालॉग एक ठोस गेंद (गोले) का एक वॉल्यूम है।

दो दृष्टिकोण हैं जिन पर मैं चर्चा करने जा रहा हूं। उनमें से एक मैं "सटीक" कहूंगा , और आप इसके साथ आर में एक संपूर्ण समाधान प्राप्त करेंगे। दूसरा मैं जिसे हेयुरिस्टिक कहता हूं , और यह केवल विचार है, कोई पूर्ण समाधान प्रदान नहीं किया गया है।

"सटीक" समाधान

मेरा समाधान मार्साग्लिया और मुलर के कार्यों पर आधारित है । मूल रूप से, ऐसा होता है कि गॉसियन वेक्टर अपने मानक के लिए सामान्यीकृत होता है, जो आपको एक डी-डाइमेंशनल हाइपरस्फेयर पर समान रूप से वितरित अंक प्रदान करेगा:

यहाँ छवि विवरण दर्ज करें

1/

n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")

यहाँ छवि विवरण दर्ज करें

यहाँ 3 डी केस के लिए एक कोड स्निपेट है, यानी एक ठोस गेंद:

library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk

d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)

scatterplot3d(x[,1], x[,2], x[,3])

यहाँ छवि विवरण दर्ज करें

हेयुरिस्टिक दृष्टिकोण

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

वीn(आर)=πn2Γ(n2+1)आरn
यहां, आप देख सकते हैं कि कैसे सामने गुणांक है आरnजल्दी से घटकर शून्य हो जाता है। यह घटना का एक और प्रकटीकरण है जो मशीन लर्निंग में एक आयामी अभिशाप के रूप में जाना जाता है ।

यह हमारी समस्या के लिए प्रासंगिक क्यों है? मान लीजिए, आप डी रैंडम यूनिफ़ॉर्म नंबर जेनरेट करना चाहते हैं, तो ये डी-डाइमेंशनल हाइपरक्यूब के अंदर रैंडम पॉइंट्स होंगे। इसके बाद, आप हाइपरस्फेयर (उर्फ एन-बॉल) के अंदर के बिंदुओं को लेने के लिए अस्वीकृति का नमूना लागू करते हैं:Σमैं=1एक्समैं2<आर2। समस्या यह है कि उच्च संख्या में d के लिए, लगभग सभी बिंदु क्षेत्र के बाहर होंगे! आप अपने नमूनों के विशाल बहुमत को फेंक देंगे।

समाधान का प्रस्ताव है कि मैं केंद्र के पास के बिंदुओं के निरीक्षण के साथ अस्वीकृति नमूने का उपयोग करूं। यह पता चला है कि यदि आप गेंद के अंदर से यादृच्छिक वर्दी नमूने के कार्टेशियन निर्देशांक में से एक देख रहे थे, तो इसका वितरण विचरण के साथ गौसियन में परिवर्तित हो जाएगा।1+2। इसलिए, घन से समान रूप से अंक लेने के बजाय, हम गाऊसी का उपयोग करते हुए कार्टेशियन समन्वय का नमूना ले रहे हैं, फिर उन पर अस्वीकृति का नमूना लागू करें। इस तरह से हम कई उत्पन्न यादृच्छिक चर को बर्बाद नहीं करेंगे। यह महत्व नमूना तकनीक का एक रूप होगा।


@Silverfish, आप सही कह रहे हैं, मैंने भाषा तय कर ली है
अक्षकाल

@ सिल्वरफ़िश, यह गाऊसी चर के उपयोग के कारण धीमा है, लेकिन उच्च आयामी मामले में सरल अस्वीकृति नमूने से तेज हो सकता है, जो कई के लिए स्पष्ट नहीं है, हालांकि यह एक अलग विषय है
अक्सकला

(1) 3 डी उदाहरण में आप त्रिज्या के लिए एक समान रूप का वर्गमूल क्यों ले रहे हैं और घनमूल क्यों नहीं? (2) आपको लगता है कि किसी को त्रिज्या के वर्ग को ऊपर उठाना चाहिए1/,लेकिन क्या आप त्रिज्या का मतलब ही नहीं है, अयोग्य? (३) किस तरह से रिजेक्शन सैंपलिंग अप्रोच पिछले दृष्टिकोण की तुलना में बेहतर है, जिसकी केवल जरूरत हैIid गाऊसी चर (बिना किसी अस्वीकृति के)?
whuber

@ शुभंकर, मैं कॉपी पेस्ट कर रहा था, क्यूब पावर पर एक टाइपो को ठीक किया। यदि हम गॉसियन का उपयोग करते हैं तो अस्वीकृति का नमूना बेहतर नहीं है, इसलिए हमें कुछ बेल के आकार का उपयोग करना होगा जो कि गॉसियन की तुलना में तेज है, आप सही हैं
अक्षकाल

0

यहाँ एक वैकल्पिक समाधान है R:

n <- 1e4
## r <- seq(0, 1, by=1/1000)
r <- runif(n)
rho <- sample(r, size=n, replace=T, prob=r)
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

यहाँ छवि विवरण दर्ज करें


4
क्या आप इसका उत्तर स्पष्ट अंग्रेजी में बता सकते हैं? हम वास्तव में एक कोड सहायता साइट नहीं हैं, और कोड-केवल उत्तरों को हतोत्साहित किया जाना चाहिए।
गुंग - को पुनः स्थापित मोनिका

5
यह समाधान पेचीदा है। दुर्भाग्य से यह काफी सही नहीं है, हालांकि साजिश ठीक लगती है। कारण यह है कि यह नमूने में त्रिज्या को सीमित करता है, जो समान रूप से बीच में दिए गए मानों के असतत सेट के लिए होता है0 तथा 1। यह इच्छित वितरण के समान नहीं है। विशेष रूप से, यह विलक्षण है : इसमें पीडीएफ भी नहीं है! यदि आप आश्वस्त नहीं हैं, तो r <- seq(0, 1, by=1/10)इसके बजाय इसकी असतत प्रकृति को और अधिक स्पष्ट रूप से देखने के लिए फिर से दौड़ें ।
whuber

1
@whuber कि बाहर इशारा करने के लिए धन्यवाद। यह वास्तव में समाधान का मेरा मुख्य विचार है। मेरा दृष्टिकोण अलग-अलग त्रिज्या के साथ कई समान सर्कल उत्पन्न करना था, और, प्रत्येक सर्कल के लिए, अंक की संख्या इसकी त्रिज्या की लंबाई के लिए आनुपातिक है। इसलिए, विभिन्न रेडी के साथ हलकों की एक इकाई लंबाई पर, अंकों की संख्या समान है। असतत प्रकृति से बचने के लिए, हम rयूनिफ़ॉर्म (0,1) से नमूना ले सकते हैं ।
19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.