একটি কাস্টম বিতরণ থেকে এলোমেলো নমুনা তৈরি করা


16

আমি আর কাস্টম পিডিএফ থেকে এলোমেলো নমুনা উত্পন্ন করার চেষ্টা করছি। আমার পিডিএফ হ'ল:

fX(x)=32(1x2),0x1

আমি অভিন্ন নমুনা তৈরি করেছি এবং তারপরে এটিকে আমার কাস্টম বিতরণে রূপান্তরিত করার চেষ্টা করেছি। আমি আমার ডিস্ট্রিবিউশনের সিডিএফ ( ) সন্ধান করে এবং এটি ইউনিফর্ম নমুনায় ( ) এ সেট করে এবং জন্য সমাধান করে করেছি ।ইউ এক্সএফএক্স(এক্স)তোমার দর্শন লগ করাএক্স

FX(x)=Pr[Xx]=0x32(1y2)dy=32(xx33)

উপরোক্ত বিতরণ সহ একটি এলোমেলো নমুনা তৈরি করতে, [0,1] তে অভিন্ন নমুনা পান u[0,1]এবং x এর জন্য

32(xx33)=u

আমি এটি বাস্তবায়ন করেছি Rএবং আমি প্রত্যাশিত বিতরণটি পাই না। আমার বোঝার ত্রুটিগুলি কি কেউ চিহ্নিত করতে পারেন?

nsamples <- 1000;
x <- runif(nsamples);

f <- function(x, u) { 
  return(3/2*(x-x^3/3) - u);
}

z <- c();
for (i in 1:nsamples) {
  # find the root within (0,1) 
  r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root;
  z <- c(z, r);
}

1
কোডিং ভুল হতে হবে। আমি আর ব্যবহার করি না, সুতরাং ভুলটি আসলে কী তা আমি বলতে পারি না - তবে আমি কেবল আপনার সমাধানটি কোড করে রেখেছি (কিউবিক বহুবর্ষের মাঝের মূলটি গ্রহণের যত্ন নেওয়া, যা সর্বদা 0 এবং 1 এর মধ্যে থাকে), এবং আমি নমুনা এবং প্রত্যাশিত বিতরণের মধ্যে ভাল চুক্তি পাই। এটি কি আপনার রুট সন্ধানকারীকে সমস্যা হতে পারে? আপনি যে নমুনাগুলি পাচ্ছেন তাতে কী সমস্যা আছে?
jpillow

আমি আপনার কোডটি চেষ্টা করেছিলাম (যা খুব দক্ষ নয়, তবে) এবং প্রত্যাশিত বিতরণটি পেয়েছি।
অনিকো

@jpillow এবং @Aniko আমার ভুল আমি যখন nsamples <- 1e6এটি ব্যবহার করেছিলাম একটি ভাল ম্যাচ ছিল।
আনন্দ

2
@Anand ওয়ান ওয়ে যে পালন করা হয় যার ফলে সরাসরি হিসাব পরিপ্রেক্ষিতে । x=2sin(arcsin(u)/3)xu
হোবার

উত্তর:


11

দেখে মনে হচ্ছে আপনার কোডটি কাজ করে বলে মনে হয়েছে, তবে @ অ্যানিকো উল্লেখ করেছেন যে আপনি এর কার্যকারিতা উন্নত করতে পারেন। আপনার সবচেয়ে বড় গতি লাভ সম্ভবত প্রাক-বরাদ্দ মেমরি থেকে আসে zযাতে আপনি এটি কোনও লুপের মধ্যে বাড়ছেন না। এর মতো কিছুতে z <- rep(NA, nsamples)কৌশলটি করা উচিত। আপনি vapply()সুস্পষ্ট লুপের পরিবর্তে (যা প্রত্যাবর্তিত পরিবর্তনশীল প্রকারটি নির্দিষ্ট করে) ব্যবহার করে খুব দ্রুত গতি অর্জন করতে পারেন ( প্রয়োগ পরিবারে একটি দুর্দান্ত এসও প্রশ্ন রয়েছে )।

> nsamples <- 1E5
> x <- runif(nsamples)
> f <- function(x, u) 1.5 * (x - (x^3) / 3) - u
> z <- c()
> 
> # original version
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   z <- c(z, r)
+ }
+ })
   user  system elapsed 
  49.88    0.00   50.54 
> 
> # original version with pre-allocation
> z.pre <- rep(NA, nsamples)
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   z.pre[i] <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   }
+ })
   user  system elapsed 
   7.55    0.01    7.78 
> 
> 
> 
> # my version with sapply
> my.uniroot <- function(x) uniroot(f, c(0, 1), tol = 0.0001, u = x)$root
> system.time({
+   r <- vapply(x, my.uniroot, numeric(1))
+ })
   user  system elapsed 
   6.61    0.02    6.74 
> 
> # same results
> head(z)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(z.pre)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(r)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738

এবং আপনার ;প্রতিটি লাইনের শেষে দরকার নেই (আপনি কি একটি ম্যাটল্যাব রূপান্তর?)


আপনার বিস্তারিত উত্তর এবং নির্দেশ করার জন্য ধন্যবাদ vapply। আমি অনেক দিন ধরে কোডিং C/C++করছি এবং এটাই ;হতাশার কারণ !
আনন্দ

1
uniroot107
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.