इस वितरण के लिए यादृच्छिक संख्याओं का अनुकरण करने का एक तरीका खोजना


20

मैं आर में एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो संचयी वितरण फ़ंक्शन के साथ वितरण से छद्म यादृच्छिक संख्याओं का अनुकरण करता है:

एफ(एक्स)=1-exp(-एक्स-पी+1एक्सपी+1),एक्स0

जहां,>0,पी(0,1)

मैंने उलटा नमूना बदलने की कोशिश की लेकिन उलटा विश्लेषणात्मक रूप से हल नहीं लगता। मुझे खुशी होगी अगर आप इस समस्या के समाधान का सुझाव दे सकते हैं


1
पूर्ण उत्तर के लिए पर्याप्त समय नहीं है, लेकिन आप विकल्प के रूप में महत्व के नमूने के एल्गोरिदम की जांच कर सकते हैं।
chuse

1
यह एक पाठ्यपुस्तक अभ्यास नहीं है, मैंने केवल बाधा को निर्धारित किया है क्योंकि यह मेरे डेटा के लिए एक उचित धारणा है
सेबस्टियन

6
मैं तब चमत्कारी) सामान्यीकरण आश्चर्यचकित हूं जो वितरण को एक घातांक की एक आदर्श शक्ति में बदल देता है, लेकिन चमत्कार होता है (छोटी संभावना के साथ)। (पी+1)-1
शीआन

जवाबों:


49

इस अभ्यास का एक सीधा (और अगर मैं जोड़ सकता हूँ, सुरुचिपूर्ण) समाधान है: चूंकि दो अस्तित्व वितरण के उत्पाद की तरह दिखाई देता है: वितरण का वितरण है इस मामले में है घातीय वितरण और है वें एक्सपोनेंशियल वितरण की शक्ति ।1-एफ(एक्स)

(1-एफ(एक्स))=exp{-एक्स-पी+1एक्सपी+1}=exp{-एक्स}1-एफ1(एक्स)exp{-पी+1एक्सपी+1}1-एफ2(एक्स)
एफ
एक्स=मिनट{एक्स1,एक्स2}एक्स1~एफ1,एक्स2~एफ2
एफ1()एफ21/(पी+1)(/(पी+1))

संबंधित R कोड उतना ही सरल है जितना इसे प्राप्त होता है

x=pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))) #simulating an n-sample

और यह निश्चित रूप से उलटा पीडीएफ और स्वीकार-अस्वीकार प्रस्तावों की तुलना में बहुत तेज है:

> n=1e6
> system.time(results <- Vectorize(simulate,"prob")(runif(n)))
utilisateur     système      écoulé 
    89.060       0.072      89.124 
> system.time(x <- simuF(n,1,2,3))
utilisateur     système      écoulé 
     1.080       0.020       1.103 
> system.time(x <- pmin(rexp(n,a),rexp(n,b/(p+1))^(1/(p+1))))
utilisateur     système      écoulé 
     0.160       0.000       0.163 

बिल्कुल सही फिट के साथ:

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


5
वास्तव में अच्छा समाधान!
सेबेस्टियन

14

आप हमेशा उलटा रूपांतरण को हल कर सकते हैं।

नीचे, मैं एक बहुत ही सरल द्वि घातुमान खोज करता हूं। किसी दिए गए इनपुट प्रायिकता (मैं उपयोग करता हूं क्योंकि आपके पास पहले से ही आपके सूत्र में एक है), मैं और शुरू करता । तब मैं तक हूं । अंत में, मैं पुनरावृत्त रूप से अंतराल तब तक जब तक कि उसकी लंबाई से कम न हो और उसका मध्य बिंदु संतुष्ट न कर दे ।क्षक्षपीएक्सएल=0एक्सआर=1एक्सआरएफ(एक्सआर)>क्ष[एक्सएल,एक्सआर]εएक्सएफ(एक्स)क्ष

ECDF अपने फिट बैठता अच्छी तरह से मेरी पसंद के लिए पर्याप्त और , और यह काफी तेज है। आप शायद इसे सरल बिसनेस खोज के बजाय कुछ न्यूटन-प्रकार के अनुकूलन का उपयोग करके गति प्रदान कर सकते हैं।एफ

aa <- 2
bb <- 1
pp <- 0.1

cdf <- function(x) 1-exp(-aa*x-bb*x^(pp+1)/(pp+1))

simulate <- function(prob,epsilon=1e-5) {
    left <- 0
    right <- 1
    while ( cdf(right) < prob ) right <- 2*right

    while ( right-left>epsilon ) {
        middle <- mean(c(left,right))
        value_middle <- cdf(middle)
        if ( value_middle < prob ) left <- middle else right <- middle
    }

    mean(c(left,right))
}

set.seed(1)
results <- Vectorize(simulate,"prob")(runif(10000))
hist(results)

xx <- seq(0,max(results),by=.01)
plot(ecdf(results))
lines(xx,cdf(xx),col="red")

ECDF


10

अगर स्वीकार-अस्वीकार द्वारा प्रत्यक्ष संकल्प है तो कुछ हद तक जटिल है। सबसे पहले, एक साधारण भेदभाव दिखाता है कि वितरण का pdf दूसरा, चूंकि हमारे पास ऊपरी बाउंड तीसरा, में दूसरे शब्द पर विचार करते हुए , परिवर्तन चर , यानी, । फिर चर के परिवर्तन का याकूबियन है। यदि

(एक्स)=(+एक्सपी)exp{-एक्स-पी+1एक्सपी+1}
(एक्स)=-एक्स-एक्सपी+1/(पी+1)1+एक्सपी-एक्सपी+1/(पी+1)-एक्स1
(एक्स)जी(एक्स)=-एक्स+एक्सपी-एक्सपी+1/(पी+1)
जीξ=एक्सपी+1एक्स=ξ1/(पी+1)
एक्सξ=1पी+1ξ1पी+1-1=1पी+1ξ-पीपी+1
एक्सफॉर्म का घनत्व जहां स्थिर सामान्य है, तो की घनत्व जिसका अर्थ है कि (i) है Exponential चर के रूप में वितरित किया जाता है और (ii) स्थिर एक के बराबर होता है। इसलिए, एक्सपोनेंशियल वितरण के समान भारित मिश्रण के बराबर होता है और एक्सपोनेंशियल की -थ शक्तिκएक्सपी-एक्सपी+1/(पी+1)κΞ=एक्स1/(पी+1)
κξपीपी+1-ξ/(पी+1)1पी+1ξ-पीपी+1=κपी+1-ξ/(पी+1)
Ξ(/(पी+1))κजी(एक्स)()1/(पी+1)(/(पी+1))वितरण, माप के लिए खाते में से एक लापता गुणक मोड modulo : और मिश्रण के रूप में अनुकरण करने के लिए सीधा है।2
(एक्स)जी(एक्स)=2(12-एक्स+12एक्सपी-एक्सपी+1/(पी+1))
जी

इस प्रकार स्वीकार-अस्वीकार एल्गोरिथ्म का एक आर प्रतिपादन है

simuF <- function(a,b,p){
  reepeat=TRUE
  while (reepeat){
   if (runif(1)<.5) x=rexp(1,a) else
      x=rexp(1,b/(p+1))^(1/(p+1))
   reepeat=(runif(1)>(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
      (a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1))))}
  return(x)}

और एक एन-नमूना के लिए:

simuF <- function(n,a,b,p){
  sampl=NULL
  while (length(sampl)<n){
   x=u=sample(0:1,n,rep=TRUE)
   x[u==0]=rexp(sum(u==0),b/(p+1))^(1/(p+1))
   x[u==1]=rexp(sum(u==1),a)
   sampl=c(sampl,x[runif(n)<(a+b*x^p)*exp(-a*x-b*x^(p+1)/(p+1))/
      (a*exp(-a*x)+b*x^p*exp(-b*x^(p+1)/(p+1)))])
   }
  return(sampl[1:n])}

यहाँ एक = 1, बी = 2, पी = 3 के लिए एक चित्रण है:

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

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