ইউনিট বৃত্ত এবং ইউনিট বর্গক্ষেত্রের মধ্যে দক্ষতার সাথে পয়েন্টগুলি তৈরি করুন


17

আমি এখানে বর্ণিত নীল অঞ্চল থেকে নমুনা তৈরি করতে চাই:

এখানে চিত্র বর্ণনা লিখুন

সাদাসিধা সমাধান ইউনিট স্কোয়ারে প্রত্যাখ্যান স্যাম্পলিং ব্যবহার করতে হয়, কিন্তু এই শুধুমাত্র একটি উপলব্ধ 1-π/4 (~ 21.4%) দক্ষতা।

আমি আরও দক্ষতার সাথে নমুনা দেওয়ার কোন উপায় আছে?


6
ইঙ্গিত : আপনার দক্ষতা দ্বিগুণ করার জন্য প্রতিসাম্য ব্যবহার করুন Use
কার্ডিনাল

3
ওহ পছন্দ: মানটি যদি (0,0) হয় তবে এটি ম্যাপ করা যাবে (1,1)? আমি সেই ধারণাটি পছন্দ করি
ক্যাম.ড্যাভিডসন.পিলন

@ কার্ডিনাল এটি দক্ষতা 4x করা উচিত নয়? আপনি নমুনা করতে পারেন [0,...,1]×[0,...,1] এবং তারপর জুড়ে x- অক্ষ, Y- অক্ষ এবং উৎপত্তি মিরর।
মার্টিন ক্রিমার

1
@ মার্টিন: চারটি প্রতিসাম্য অঞ্চল জুড়ে আপনার ওভারল্যাপ হয়েছে, যা আপনাকে আরও সাবধানতার সাথে মোকাবেলা করতে হবে।
কার্ডিনাল

3
@Martin: আমি বুঝতে করছি আপনি কি বর্ণনা করছি, যে দক্ষতা বাড়ে না এ সব । (আপনি একটি পয়েন্টটি খুঁজে পেয়েছেন এবং এখন তিনজনকে চেনেন --- একটি অঞ্চলে চারগুণ আকারে --- যা ইউনিট ডিস্কের মধ্যে সম্ভাব্যতার সাথে এক্স কিনা তা নির্ধারণ করবে না বা করবে না (x,y)How কীভাবে এটি কী সহায়তা করে?) দক্ষতা বৃদ্ধির বিষয়টি হ'ল উত্পাদিত প্রতিটি গ্রহণের সম্ভাবনা বাড়ানো (x,y)। আমিই কি ঘন হচ্ছে?
কার্ডিনাল

উত্তর:


10

প্রতি সেকেন্ডে দুই মিলিয়ন পয়েন্ট কি করবে?

বিতরণটি প্রতিসম হয়: আমাদের কেবলমাত্র পুরো বৃত্তের এক-অষ্টমীর জন্য বিতরণ কাজ করা দরকার এবং তারপরে এটি অন্যান্য অক্টেন্টগুলির চারপাশে অনুলিপি করুন। মেরু স্থানাঙ্ক , কোণের ক্রমবর্ধমান বণ্টনের Θ র্যান্ডম অবস্থানের জন্য ( এক্স , ওয়াই ) মূল্য এ θ ত্রিভুজ মধ্যে এলাকায় দেওয়া হয় ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , ট্যান θ ) এবং বৃত্তের চাপটি থেকে প্রসারিত ((r,θ)Θ(X,Y)θ(0,0),(1,0),(1,tanθ) থেকে ( কোসাইন্ θ , পাপ θ ) । এটি এর সাথে আনুপাতিক(1,0)(cosθ,sinθ)

FΘ(θ)=Pr(Θθ)12tan(θ)θ2,

যেহেতু এর ঘনত্ব

fΘ(θ)=ddθFΘ(θ)tan2(θ).

আমরা এই ঘনত্ব থেকে নমুনা বলতে পারি, একটি প্রত্যাখ্যান পদ্ধতি (যা কার্যকারিতা ) ব্যবহার করে।8/π254.6479%

রশ্মীয় তুল্য এর শর্তাধীন ঘনত্ব সমানুপাতিক R মধ্যে R = 1 এবং = সেকেন্ড θ । এটি সিডিএফের একটি সহজ বিপরীতে নমুনা তৈরি করা যেতে পারে।Rrdrr=1r=secθ

যদি আমরা স্বতন্ত্র নমুনা উত্পন্ন করি তবে কার্টেসিয়ান স্থানাঙ্কগুলিতে ( x i , y i ) নমুনা এই অকট্যান্টটিতে ফিরে রূপান্তর । নমুনাগুলি স্বতন্ত্র হওয়ায়, স্থানাঙ্কগুলি এলোমেলোভাবে অদলবদল করা হলে ইচ্ছানুসারে প্রথম চতুর্ভুজ থেকে একটি স্বতন্ত্র এলোমেলো নমুনা তৈরি করে। (এলোমেলোভাবে অদলবদলের জন্য কতগুলি বাস্তবায়ন হবে তা নির্ধারণ করতে কেবল একটি একক দ্বিপদী পরিবর্তনশীল তৈরি করতে হবে))(ri,θi)(xi,yi)

প্রত্যেকটি ধরনের উপলব্ধি , প্রয়োজন গড়, এক অভিন্ন variate উপর (জন্য আর ) প্লাস 1 / ( 8 π - 2 ) বার দুই অভিন্ন (জন্য variates Θ ) এবং (ফাস্ট) হিসাব অল্প পরিমাণ। এটা 4 / ( π - 4 ) 4.66 পয়েন্ট (যা, অবশ্যই, দুই স্থানাঙ্ক আছে) প্রতি variates। সম্পূর্ণ বিশদটি নীচের কোড উদাহরণে রয়েছে। এই চিত্রটি অর্ধ মিলিয়ন পয়েন্টের মধ্যে 10,000 টিরও বেশি প্লট করেছে।(X,Y)R1/(8π2)Θ4/(π4)4.66

ব্যক্তিত্ব

এই Rকোডটি এখানে এই সিমুলেশন তৈরি করেছে এবং এটি টাইম করেছে।

n.sim <- 1e6
x.time <- system.time({
  # Generate trial angles `theta`
  theta <- sqrt(runif(n.sim)) * pi/4
  # Rejection step.
  theta <- theta[runif(n.sim) * 4 * theta <= pi * tan(theta)^2]
  # Generate radial coordinates `r`.
  n <- length(theta)
  r <- sqrt(1 + runif(n) * tan(theta)^2)
  # Convert to Cartesian coordinates.
  # (The products will generate a full circle)
  x <- r * cos(theta) #* c(1,1,-1,-1)
  y <- r * sin(theta) #* c(1,-1,1,-1)
  # Swap approximately half the coordinates.
  k <- rbinom(1, n, 1/2)
  if (k > 0) {
    z <- y[1:k]
    y[1:k] <- x[1:k]
    x[1:k] <- z
  }
})
message(signif(x.time[3] * 1e6/n, 2), " seconds per million points.")
#
# Plot the result to confirm.
#
plot(c(0,1), c(0,1), type="n", bty="n", asp=1, xlab="x", ylab="y")
rect(-1, -1, 1, 1, col="White", border="#00000040")
m <- sample.int(n, min(n, 1e4))
points(x[m],y[m], pch=19, cex=1/2, col="#0000e010")

1
আমি এই বাক্যটি বুঝতে পারি না: "যেহেতু নমুনাগুলি স্বতন্ত্র, পদ্ধতিগতভাবে প্রতি দ্বিতীয় নমুনা স্থানাঙ্কগুলিকে অদলবদল করে ইচ্ছামত প্রথম কোয়াড্রেন্ট থেকে একটি স্বতন্ত্র এলোমেলো নমুনা তৈরি করে" " এটি আমার কাছে মনে হয় যে নিয়মিতভাবে প্রতিটি দ্বিতীয় নমুনা স্থানাঙ্কগুলিকে অদলবদল করে অত্যন্ত নির্ভরশীল নমুনা তৈরি করে। উদাহরণস্বরূপ, আমার কাছে মনে হচ্ছে আপনার কোডটিতে প্রয়োগটি একই অকট্যান্ট থেকে এক সারি অর্ধ মিলিয়ন নমুনা উত্পন্ন করে?
এ। রেক্স

7
কড়া কথায় বলতে গেলে এই পদ্ধতিটি বেশ কার্যকরভাবে কাজ করে না (আইআইডি পয়েন্টগুলির জন্য) যেহেতু এটি দুটি অক্টেন্টে অভিন্ন সংখ্যার নমুনা তৈরি করে: নমুনা পয়েন্টগুলি, সুতরাং নির্ভরশীল। এখন, আপনি যদি প্রতিটি নমুনার জন্য অক্ট্যান্ট নির্ধারণের জন্য পক্ষপাতহীন কয়েনগুলি ফ্লিপ করেন ...
কার্ডিনাল

1
@ কার্ডিনাল আপনি সঠিক; আমি এটি সংশোধন করব - ছাড়াই (অ্যাসেম্পোটোটিকালি) উত্পন্ন করার জন্য এলোমেলো পরিবর্তনের সংখ্যা বাড়িয়ে তোলা!
whuber

2
সীমাবদ্ধভাবে বলতে (এবং আবার কেবল খাঁটি তাত্ত্বিক অর্থে) সীমাবদ্ধ নমুনার ক্ষেত্রে, আপনার পরিবর্তনের জন্য কোনও অতিরিক্ত অভিন্ন র্যান্ডম পরিবর্তনের প্রয়োজন নেই । বুদ্ধিমান হতে: প্রথম অভিন্ন র্যান্ডম ভেরিয়েট থেকে, প্রথম বিট থেকে উল্টানো ক্রমটি তৈরি করুন । তারপরে, উত্পাদিত প্রথম স্থানাঙ্ক হিসাবে বাকী (বার 2 এন ) ব্যবহার করুন । n2n
কার্ডিনাল

2
@ শি'আন আমি সুবিধাজনকভাবে গণনাযোগ্য বিপরীতটি পেতে সক্ষম হয়েছি। আমি আর্কসিন গণনা করার ব্যয়ে ঘনত্বের সমানুপাতিক (দক্ষতা ( 4 - π ) / ( π - 2 ) 75 % ) এর বিতরণ থেকে নমুনা প্রত্যাখ্যান করে কিছুটা আরও ভাল করতে পারি can । 2sin(θ)2(4π)/(π2)75%
হুবুহু

13

আমি নীচের সমাধানটির প্রস্তাব দিচ্ছি, এটি এখন পর্যন্ত @ কার্ডিনাল, @ হুইবার এবং @ স্টেফান-কোলাসার দ্বারা অন্যান্য আত্মার তুলনায় সহজ, আরও দক্ষ এবং / বা কম্পিউটেশনালি সস্তা হওয়া উচিত।

এটি নিম্নলিখিত সহজ পদক্ষেপ জড়িত:

1) দুটি স্ট্যান্ডার্ড ইউনিফর্ম নমুনা আঁকুন:

u1Unif(0,1)u2Unif(0,1).

min{u1,u2},max{u1,u2}

[xy]=[11]+[2212210][min{u1,u2}max{u1,u2}].

2b) Swap x and y if u1>u2.

3) Reject the sample if inside the unit circle (acceptance should be around 72%), i.e.:

x2+y2<1.

The intuition behind this algorithm is shown in the figure. enter image description here

Steps 2a and 2b can be merged into a single step:

2) Apply shear transformation and swap

x=1+22min(u1,u2)u2y=1+22min(u1,u2)u1

The following code implements the algorithm above (and tests it using @whuber's code).

n.sim <- 1e6
x.time <- system.time({
    # Draw two standard uniform samples
    u_1 <- runif(n.sim)
    u_2 <- runif(n.sim)
    # Apply shear transformation and swap
    tmp <- 1 + sqrt(2)/2 * pmin(u_1, u_2)
    x <- tmp - u_2
    y <- tmp - u_1
    # Reject if inside circle
    accept <- x^2 + y^2 > 1
    x <- x[accept]
    y <- y[accept]
    n <- length(x)
})
message(signif(x.time[3] * 1e6/n, 2), " seconds per million points.")
#
# Plot the result to confirm.
#
plot(c(0,1), c(0,1), type="n", bty="n", asp=1, xlab="x", ylab="y")
rect(-1, -1, 1, 1, col="White", border="#00000040")
m <- sample.int(n, min(n, 1e4))
points(x[m],y[m], pch=19, cex=1/2, col="#0000e010")

Some quick tests yield the following results.

Algorithm /stats//a/258349 . Best of 3: 0.33 seconds per million points.

This algorithm. Best of 3: 0.18 seconds per million points.


3
+1 Very well done! Thank you for sharing a thoughtful, clever, and simple solution.
whuber

Great idea! I was thinking about a mapping from the unit sq to this portion, but didn't think of an imperfect mapping and then a rejection scheme. Thanks for expanding my mind!
Cam.Davidson.Pilon

7

Well, more efficiently can be done, but I sure hope you are not looking for faster.

The idea would be to sample an x value first, with a density proportional to the length of the vertical blue slice above each x value:

f(x)=11x2.

Wolfram helps you to integrate that:

0xf(y)dy=12x1x2+x12arcsinx.

So the cumulative distribution function F would be this expression, scaled to integrate to 1 (i.e., divided by 01f(y)dy).

Now, to generate your x value, pick a random number t, uniformly distributed between 0 and 1. Then find x such that F(x)=t. That is, we need to invert the CDF (inverse transform sampling). This can be done, but it's not easy. Nor fast.

Finally, given x, pick a random y that is uniformly distributed between 1x2 and 1.

Below is R code. Note that I am pre-evaluating the CDF at a grid of x values, and even then this takes quite a few minutes.

You can probably speed the CDF inversion up quite a bit if you invest some thinking. Then again, thinking hurts. I personally would go for rejection sampling, which is faster and far less error-prone, unless I had very good reasons not to.

epsilon <- 1e-6
xx <- seq(0,1,by=epsilon)
x.cdf <- function(x) x-(x*sqrt(1-x^2)+asin(x))/2
xx.cdf <- x.cdf(xx)/x.cdf(1)

nn <- 1e4
rr <- matrix(nrow=nn,ncol=2)
set.seed(1)
pb <- winProgressBar(max=nn)
for ( ii in 1:nn ) {
    setWinProgressBar(pb,ii,paste(ii,"of",nn))
    x <- max(xx[xx.cdf<runif(1)])
    y <- runif(1,sqrt(1-x^2),1)
    rr[ii,] <- c(x,y)
}
close(pb)

plot(rr,pch=19,cex=.3,xlab="",ylab="")

randoms


I wonder if using Chebyshev polynomials to approximate the CDF would improve the evaluation speed.
Sycorax says Reinstate Monica

@Sycorax, not without modifications; see e.g. the chebfun treatment of algebraic singularities at the endpoints.
J. M. is not a statistician
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.