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


16

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

fX(x)=32(1−x2),0≤x≤1

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

FX(x)=Pr[X≤x]=∫0x32(1−y2)dy=32(x−x33)

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

32(x−x33)=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.