단위 원과 단위 사각형 사이에서 효율적으로 점 생성


17

여기에 정의 된 파란색 영역에서 샘플을 생성하고 싶습니다.

여기에 이미지 설명을 입력하십시오

순진한 솔루션은 단위 제곱에서 거부 샘플링을 사용하는 것이지만 이는 1π/4 (~ 21.4 %) 효율 만 제공합니다.

더 효율적으로 샘플링 할 수있는 방법이 있습니까?


6
힌트 : 대칭을 사용하여 효율성을 크게 두 배로 늘리십시오.
추기경

3
Oh like : 값이 (0,0)이면 (1,1)에 매핑 될 수 있습니까? 나는 그 아이디어를 좋아합니다
Cam.Davidson.Pilon

@cardinal 효율성이 4 배가되지 않습니까? 샘플링 [0,,1]×[0,,1]한 다음 x 축, y 축 및 원점을 기준으로 대칭 복사 할 수 있습니다.
Martin Krämer

1
@Martin : 네 개의 대칭 영역에서 중복이 발생하므로 더 신중하게 처리해야합니다.
추기경

3
@Martin : 난 당신이 설명하는지 이해 해요 경우, 즉 효율성 증가하지 않는 전혀를 . (한 지점을 찾았고, 크기가 4 배인 영역에서 3 개의 다른 지점을 알았습니다. 여부에 따라 확률이 1 인 단위 디스크 내에 있거나없는 것 (x,y)입니다. 효율성 향상의 요점은 생성 된 각 대한 수용 확률을 높이는 것 (x,y)입니다. 아마도 나는 밀도가 높은 사람일까요?
추기경

답변:


10

초당 2 백만 포인트가됩니까?

분포는 대칭입니다. 우리는 전체 원의 1/8에 대한 분포를 계산 한 다음 다른 낙엽 주위로 복사하면됩니다. 극좌표 에서 값 θ 의 임의 위치 ( X , Y ) 에 대한 각도 Θ 의 누적 분포 는 삼각형 ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , tan θ )( 에서 연장되는 원의 호(r,θ)Θ(X,Y)θ(0,0),(1,0),(1,tanθ) ~ ( cos θ , sin θ ) . 따라서 비례(1,0)(cosθ,sinθ)

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

밀도가

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

우리는 거부 방법 (효율 )을 사용하여이 밀도에서 샘플링 할 수 있습니다 .8/π254.6479%

좌표 반경 조건부 밀도 비례 R에 D의 RR = 1R = θ . CDF의 쉬운 반전으로 샘플링 할 수 있습니다.Rrd아르 자형아르 자형=1아르 자형=비서θ

우리는 독립 샘플을 생성하는 경우 직교 좌표로 변환 백 ( X I , Y I ) 샘플이 팔분. 표본이 독립적이기 때문에 임의로 무작위로 좌표를 교환하면 원하는 경우 1 사분면에서 독립적 인 임의 표본이 생성됩니다. (랜덤 스왑은 스왑 할 실현 횟수를 결정하기 위해 단일 이항 변수 만 생성하면됩니다.)(아르 자형나는,θ나는)(엑스나는,와이나는)

각각의 그러한 구현 보통, 하나 개의 균일 변량에 (대해 필요 R ) 플러스 1 / ( 8 π - 2 ) 2 개 배 균일 (위한 variates Θ ) 및 (고속) 소량의 계산. 그것은 점 당 4 / ( π 4 ) 4.66 변화입니다 (물론 두 좌표가 있습니다). 자세한 내용은 아래 코드 예제에 있습니다. 이 수치는 생성 된 50 만 개 이상의 포인트 중 10,000 개를 나타냅니다.(엑스,와이)아르 자형1/(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
나는이 문장을 이해하지 못한다 : "샘플은 독립적이므로, 매 초마다 좌표를 체계적으로 교환하면 원하는대로 1 사분면으로부터 독립적 인 랜덤 샘플을 생성합니다." 매 초마다 좌표를 체계적으로 교환하면 매우 의존적 인 샘플이 생성되는 것 같습니다. 예를 들어, 코드에서 구현하면 동일한 옥탄트에서 50 만 개의 샘플을 연속으로 생성하는 것 같습니다.
A. Rex

7
엄밀히 말하면,이 접근법은 두 개의 옥탄트에서 동일한 수의 샘플을 생성하기 때문에 (iid 포인트의 경우) 작동하지 않습니다. 샘플 포인트는 종속적입니다. 이제 편견이없는 동전을 뒤집어 각 샘플의 8 분위를 결정하면 ...
추기경

1
@ 추기경 당신이 맞습니다; 난 (임의적으로) 생성 할 랜덤 변량의 수를 늘리지 않고 고칠 것입니다!
whuber

2
유한 샘플의 경우 엄밀히 말하면 (그리고 가장 순수한 이론적 의미에서만) 수정에는 추가로 균일 한 무작위 변이 가 필요 하지 않습니다 . 재치하려면 : 첫 번째 균일 랜덤 변량에서 첫 번째 비트 에서 반전 시퀀스를 구성하십시오 . 그런 다음 나머지 (시간 2 n )를 생성 된 첫 번째 좌표로 사용하십시오. n2n
추기경

2
@ Xi'an 나는 편리하게 계산 가능한 역수를 얻을 수 없었습니다. 아크 사인을 계산해야하는 비용으로 (효율은 ( 4 π ) / ( π 2 ) 75 % )에 비례하는 분포에서 배제 샘플링으로 약간 더 나아질 수 있습니다. . 2sin(θ)2(4π)/(π2)75%
whuber

13

@cardinal, @whuber 및 @ stephan-kolassa의 다른 솔루션보다 간단하고 효율적이며 계산적으로 저렴한 다음 솔루션을 제안합니다.

다음과 같은 간단한 단계가 포함됩니다.

1) 두 개의 표준 균일 샘플을 채집합니다 :

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

2a) 포인트 다음 전단 변환을 적용합니다 (오른쪽 아래 삼각형의 점은 왼쪽 위 삼각형에 반영되어 "반사되지 않음") 2b)에서 : [ x y ] = [ 1 1 ] + [ min{u1,u2},max{u1,u2}

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

2b) u 1 > u 2 인 경우 y를 교체하십시오 .xyu1>u2

3) 단위 원 내부 (예 : 72 % 정도 허용) 인 경우 샘플을 거부합니다 (예 :

x2+y2<1.

이 알고리즘의 직관이 그림에 나와 있습니다. 여기에 이미지 설명을 입력하십시오

2a 단계와 2b 단계는 단일 단계로 병합 될 수 있습니다.

2) 전단 변형을 적용하고 스왑

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

다음 코드는 위의 알고리즘을 구현하고 @whuber의 코드를 사용하여 테스트합니다.

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")

일부 빠른 테스트에서는 다음과 같은 결과가 나타납니다.

알고리즘 /stats//a/258349 . 백만 포인트 당 3 : 3 초 중 최고.

이 알고리즘. 3 분의 1 : 0.18 초


3
+1 아주 잘 했어요! 사려 깊고 영리하며 간단한 솔루션을 공유해 주셔서 감사합니다.
whuber

좋은 생각이야! 나는 단위 sq 에서이 부분으로의 매핑에 대해 생각하고 있었지만 불완전한 매핑과 거부 계획을 생각하지 않았습니다 . 내 마음을 확장 해 주셔서 감사합니다!
Cam.Davidson.Pilon

7

글쎄, 더 효율적으로 할 수는 있지만 더 빨리 찾지 않기를 바랍니다 .

xx

f(x)=11x2.

Wolfram은 다음을 통합하는 데 도움을줍니다 .

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 1엑스21.

아래는 R 코드입니다. CDF를 그리드에서 사전 평가하고 있습니다.엑스 값까지도 걸리지 만이 과정은 몇 분 정도 걸립니다.

약간의 생각을 투자하면 CDF 반전 속도를 상당히 높일 수 있습니다. 그런 다음 다시 생각이 아프다. 나는 개인적으로 내가 가진하지 않는 한, 더 빠르고 훨씬 적은 오류가 발생하기 쉬운입니다 거부 샘플링, 갈 것이다 매우 에 좋은 이유가 없습니다.

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


CDF에 근사하기 위해 Chebyshev 다항식을 사용하여 평가 속도가 향상되는지 궁금합니다.
Sycorax는 Reinstate Monica

@Sycorax, 수정없이; 예를 들어 종점에서 대수 특이점 의 화학 처리 를 참조하십시오 .
JM은 통계학자가 아니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.