Làm cách nào tôi có thể lấy mẫu từ một bản phân phối với CDF không thể thay đổi?


8

Bán máy tính khoa học mô phỏng vấn đề liên quan ở đây.

Tôi có một bản phân phối

P (x) =(eb1)eb(nx)ebn+b1

đối với một số hằng số b và n và x là một số nguyên sao cho .0xn

Bây giờ, tôi cần lấy mẫu từ phân phối này. Nó có CDF không thể đảo ngược, vì vậy lý thuyết có thể thực hiện điều này trực tiếp. Vấn đề là những con số liên quan là LỚN. Trên thực tế, lớn đến mức cả hai đều tràn các biến được định dạng theo quy ước và mất ít nhất vài phút (tại một số điểm tôi đã từ bỏ ...) để tính toán bằng các định dạng chính xác tùy ý. Về cơ bản, CDF nghịch đảo vẫn liên quan đến một thuật ngữ , với giá trị . Mặc dù vậy, các số đầu ra vẫn sẽ nằm trong phạm vi , vì vậy có vẻ như nên có một cách để làm điều này.eb(n+1)350<n<35000n

Những gì tôi đang tìm kiếm là một cách lấy mẫu xấp xỉ từ phân phối này có thể tính toán được. Có phương pháp lấy mẫu thay thế? Họ là ai?


2
Bạn đã xem xét việc bình thường hóa hoặc nhân rộng dữ liệu của mình theo một cách nào đó để giảm tên miền chưa?
EngrStudent

Câu trả lời:


7

CDF là không thể đảo ngược. Một công thức cho sự đảo ngược dẫn đến những gì phải là một trong những giải pháp đơn giản và phù hợp nhất có thể.

Bắt đầu bằng cách quan sát rằng xác suất của kết quả , , tỷ lệ thuận với . Do đó, nếu chúng ta tạo một giá trị đồng nhất trong khoảng từ đến = , chúng ta chỉ cần tìm ra lớn nhất màk0knebkq0qmax=k=0nebk(1eb(n+1))/(1eb)k

qi=0kebi=1e(k+1)b1eb.

Đại số đơn giản cho giải pháp

k=ceiling(log(1q(1eb))b).

Đây là một Rtriển khai được xây dựng giống như tất cả các trình tạo số ngẫu nhiên khác: đối số đầu tiên của nó chỉ định có bao nhiêu giá trị iid để tạo và phần còn lại của các đối số đặt tên cho các tham số ( as và as ):bbnn.max

rgeom.truncated <- function(n=1, b, n.max) {
  a <- 1 - exp(-b)
  q.max <- (1 - exp(-b*(n.max+1))) / a
  q <- runif(n, 0, q.max)
  return(-ceiling(log(1 - q*a) / b))
}

Như một ví dụ về việc sử dụng nó, hãy tạo ra một triệu biến thể ngẫu nhiên theo phân phối này:

b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))

(Cần giây.)0.10

h <- hist(sim+1, probability=TRUE, breaks=50, xlab="Outcome+1")
pmf <- exp(-b * (0: n.max)); pmf <- pmf / sum(pmf)
lines(0:n.max, pmf, col="Red", lwd=2)

Biểu đồ

( đã được thêm vào mỗi giá trị để tạo biểu đồ tốt hơn: quy trình của id có idiosyncrasy (= bug) trong đó thanh đầu tiên quá cao khi điểm cuối bên trái được đặt ở mức 0.) Đường cong màu đỏ là phân phối tham chiếu mô phỏng này cố gắng tái tạo. Hãy đánh giá mức độ phù hợp của bài kiểm tra chi bình phương:1Rhist

observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)

Giá trị p là : phù hợp đẹp.0.84


3
Giải pháp tuyệt vời. Tôi không bao giờ biết người ta có thể lấy mẫu theo cách này (nghĩa là dựa vào các mẫu từ thay vì ), nhưng rõ ràng là nhìn lại. U n i ( 0 , 1 )Uni(0,k),k>1Uni(0,1)
Cam.Davidson.Pilon

6

Bạn đang xử lý phân phối hình học bị cắt cụt với . Có nhiều cách khác nhau để tiếp cận điều này.p=1eb

Tôi khuyên bạn nên lựa chọn khác nhau trong các tình huống khác nhau; một số tùy chọn sẽ liên quan đến việc mô phỏng từ hình học và tái tạo khi nó nằm ngoài phạm vi, lấy phần nguyên của số mũ rút gọn thích hợp ( như ở đây ) hoặc sử dụng bất kỳ kỹ thuật nhanh nào được điều chỉnh để phân phối rời rạc trong phạm vi hữu hạn. Cho rằng là lớn, lấy sàn theo cấp số nhân bị cắt cụt có thể tương đối nhanh, nhưng liệu đó có phải là lựa chọn tốt nhất hay không cũng phụ thuộc vào .bnb

Đây là một câu hỏi liên quan đến math.SE

Trước khi tôi thử các đề xuất cụ thể, phạm vi giá trị điển hình của gì?b


Cảm ơn câu trả lời của bạn! b ~ ln (1 + epsilon), trong đó epsilon là một tham số bổ sung> 0.
John Doucette

1
Vì vậy, bạn đã chuyển đổi câu hỏi của tôi về phạm vi điển hình của b thành một về phạm vi điển hình của. Trước khi tôi thử các đề xuất cụ thể, phạm vi giá trị tiêu biểu cho ε là gì?
Glen_b -Reinstate Monica

Lý do tôi hỏi là phương pháp cụ thể nào hiệu quả hơn phụ thuộc vào đặc điểm của tình huống. Có vẻ như bạn đã hài lòng với câu trả lời khác, vì vậy có lẽ không đáng lo ngại về hiệu quả tiềm năng bổ sung.
Glen_b -Reinstate Monica

@JohnDoucette: Nếu b gần như bằng 0 thì phân phối của bạn gần như thống nhất trên do đó bạn có thể sử dụng đồng phục như một đề xuất trong thuật toán từ chối chấp nhận vì giới hạn trên không phải là khủng khiếp. {0,,n\]
Tây An

1
@ Xi'an Bạn sẽ cần khá nhỏ thay vì trước khi sử dụng phân phối đồng đều, vì tỷ lệ chấp nhận là , sẽ thấp một cách không hiệu quả khi . b 0 ( 1 - e - ( n + 1 ) b ) / ( ( n + 1 ) ( 1 - e - b ) ) ( 1 - exp ( - n b ) ) / ( n b ) n b » 1nbb0(1e(n+1)b)/((n+1)(1eb)) (1exp(nb))/(nb)nb1
whuber

4

Đầu tiên, lưu ý rằng , nếu liên tục, sẽ liên quan đến phân phối theo cấp số nhân. Sau đó, những gì bạn có thể làm là mô phỏng từ phân bố hàm mũ bị cắt cụt và lấy (phần nguyên) của các quan sát.P(x)ebxxfloor()

Cdf của số mũ bị cắt là

F(x;n,b)=1ebx1ebn.

Sau đó, nếu chúng ta tạo , chúng ta thu được . Nếu lớn, thì gợi ý gần đúng .F(x;n,b)=ux=1blog[1u(1ebn)]bnebn0x1blog[1u]

rweirdp <- function(ns,n,b){
u <- runif(ns)
samp <- - log(1-u*(1-exp(-n*b)))/b
return(floor(samp))
}

rweirdp(1000,10,1)

Tôi nghĩ rằng đây là cơ bản những gì tôi đang tìm kiếm. bn luôn rất lớn, lấy mẫu theo tỷ lệ có ý nghĩa. Không biết về ánh xạ, mặc dù nó rõ ràng khi nhìn lại. Cảm ơn!
John Doucette

Tôi vui mừng khi thấy rằng đã giúp. Tôi nghĩ rằng tôi đã không giải thích đúng nhưng cách tiếp cận này tạo ra các mẫu từ phân phối mục tiêu chính xác. Chúc mừng.
Người

@ Xi'an Không có trọng số như nhau nếu một người sử dụng giá trị và lấy phần nguyên? ebn
Người

@ Xi'an Tôi nghĩ rằng thuật ngữ đó xuất hiện trong tử số của , cho đến một hệ số ...P(x)
Người

1
@ Xi'an Trên thực tế, tác phẩm này được cung cấp rweirdpđược sửa đổi để thay đổi nthành n+1. (Như được đưa ra ở đây, nó sẽ không bao giờ trả về một giá trị bằng n: đó là hiệu ứng của phép tính gần đúng.) Một phân tích nghiêm ngặt hơn một chút được đưa ra trong câu trả lời của tôi. Mặc dù tôi có được một công thức xuất hiện khác nhau, nhưng nó tương đương với công thức (đơn giản hơn!) Được đưa ra ở đây, một khi n-> n+1sửa đổi được thực hiện.
whuber

4

Một cách để lấy mẫu từ phân phối đích làp(k)exp{bk}

  1. chạy thử nghiệm Metropolis-Hastings để xác định sự hỗ trợ (thú vị) của phân phối, tức là trong đó tập hợp con của nó tập trung;{0,1,,n}

    metro=function(N,b,n){
    x=sample(0:n,N,rep=TRUE)
    for (t in 2:N){
      x[t]=prop=x[t-1]+sample(c(-1,1),1)
    
      if ((prop<0)||(prop>n)||(log(runif(1))>b*(x[t]-prop)))
          x[t]=x[t-1]
      }
    return(x)
    }
    
  2. Do đó, hãy sử dụng hỗ trợ được xác định, , để tính xác suất chính xác là để tránh tràn.p ( k ) α exp { - b k + b k 0 }{k0,,k1}p(k)exp{bk+bk0}

Cập nhật: Khi suy nghĩ thêm về nó, vì đang giảm theo k, sự hỗ trợ hiệu quả của phân phối sẽ luôn bắt đầu ở . Nếu khá lớn, hỗ trợ này sẽ kết thúc rất nhanh, trong trường hợp không quan trọng lắm vì giá trị lớn của sẽ không bao giờ được truy cập. Nếu rất nhỏ, pdf gần như phẳng, điều đó có nghĩa là người ta có thể sử dụng phân phối đồng đều trên như một đề xuất từ ​​chối chấp nhận. Và sử dụng nhật ký trong bước chấp nhận để tránh tràn.k 0 = 0 b n k b { 0 , 1 , Lọ , n }p()k0=0bnkb{0,1,,n}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.