Ai đó có thể cho tôi biết cách mô phỏng , trong đó , sử dụng tung đồng xu (bao nhiêu lần bạn yêu cầu) với ?a,b∈NP(H)=p
Tôi đã nghĩ đến việc sử dụng lấy mẫu từ chối, nhưng không thể đóng nó xuống.
Ai đó có thể cho tôi biết cách mô phỏng , trong đó , sử dụng tung đồng xu (bao nhiêu lần bạn yêu cầu) với ?a,b∈NP(H)=p
Tôi đã nghĩ đến việc sử dụng lấy mẫu từ chối, nhưng không thể đóng nó xuống.
Câu trả lời:
Bởi vì có vô số giải pháp, chúng ta hãy tìm một giải pháp hiệu quả .
Ý tưởng đằng sau ý tưởng này bắt đầu với một cách tiêu chuẩn để thực hiện biến Bernoulli: so sánh biến ngẫu nhiên thống nhất với tham số . Khi , trả về ; nếu không, trả về .a / b U < a / b 1 0
Chúng ta có thể sử dụng -coin như một trình tạo số ngẫu nhiên thống nhất . Để tạo số đồng đều trong bất kỳ khoảng , hãy lật đồng xu. Khi nó đứng đầu, đệ quy tạo một giá trị đồng nhất trong phần đầu tiên của khoảng; khi đuôi của nó, tạo đệ quy từ phần cuối cùng của khoảng. Tại một số điểm, khoảng thời gian mục tiêu sẽ trở nên nhỏ đến mức không thực sự quan trọng bằng cách bạn chọn một số từ nó: đó là cách đệ quy bắt đầu. Rõ ràng quy trình này tạo ra các biến thiên đồng nhất (lên đến bất kỳ độ chính xác mong muốn nào), như dễ dàng được chứng minh bằng cảm ứng.[ x , y ) X p X 1 - p
Ý tưởng này không hiệu quả, nhưng nó dẫn đến một phương pháp hiệu quả. Vì ở mỗi giai đoạn bạn sẽ rút một số từ một khoảng nhất định , tại sao trước tiên không kiểm tra xem bạn có cần vẽ nó không? Nếu giá trị mục tiêu của bạn nằm ngoài khoảng này, bạn đã biết kết quả so sánh giữa giá trị ngẫu nhiên và mục tiêu. Do đó, thuật toán này có xu hướng chấm dứt nhanh chóng. (Điều này có thể được hiểu là quy trình lấy mẫu từ chối được yêu cầu trong câu hỏi.)
Chúng ta có thể tối ưu hóa thuật toán này hơn nữa. Ở bất kỳ giai đoạn nào, chúng tôi thực sự có hai đồng tiền mà chúng tôi có thể sử dụng: bằng cách dán lại đồng tiền của chúng tôi, chúng tôi có thể biến nó thành một đồng tiền có cơ hội . Do đó, như một sự tính toán trước, chúng tôi có thể chọn đệ quy bất kỳ việc dán lại nào dẫn đến số lần lật dự kiến thấp hơn cần thiết để chấm dứt. (Tính toán này có thể là một bước đắt tiền.)
Ví dụ: không hiệu quả khi sử dụng đồng xu có để mô phỏng biến Bernoulli trực tiếp: trung bình phải mất gần mười lần lật. Nhưng nếu chúng ta sử dụng đồng xu , thì chỉ trong hai lần lật, chúng tôi chắc chắn sẽ hoàn thành và số lần lật dự kiến chỉ là .( 0,01 ) p = 1 - 0,0 = 0,1 1,2
Đây là những thông tin chi tiết.
Phân vùng bất kỳ khoảng thời gian nửa mở thành các khoảng
Điều này xác định hai phép biến đổi và hoạt động trên các khoảng thời gian nửa mở.s ( ∗ , T )
Là một vấn đề về thuật ngữ, nếu là bất kỳ tập hợp số thực nào, hãy để biểu thức
có nghĩa là là một giới hạn thấp hơn cho : cho tất cả . Tương tự như vậy, có nghĩa là là một trên ràng buộc đối với .
Viết . (Trên thực tế, sẽ không có gì khác biệt nếu là thực tế thay vì hợp lý; chúng tôi chỉ yêu cầu )
Đây là thuật toán để tạo ra một biến thiên với tham số Bernoulli mong muốn:
Đặt và .
While {Tung đồng xu để tạo . Đặt Tăng .}
Nếu thì đặt . Mặt khác, đặt . Z = 1 Z = 0
Để minh họa, đây là một R
triển khai của alorithm là hàm draw
. Đối số của nó là giá trị đích và khoảng , ban đầu . Nó sử dụng chức năng phụ trợ thực hiện . Mặc dù không cần thiết, nhưng nó cũng theo dõi số lần tung đồng xu. Nó trả về biến ngẫu nhiên, số lần tung và khoảng thời gian cuối cùng mà nó kiểm tra.[ x , y ) [ 0 , 1 ) ss
s <- function(x, ab, p) {
d <- diff(ab) * p
if (x == 1) c(ab[1], ab[1] + d) else c(ab[1] + d, ab[2])
}
draw <- function(target, p) {
between <- function(z, ab) prod(z - ab) <= 0
ab <- c(0,1)
n <- 0
while(between(target, ab)) {
n <- n+1; ab <- s(runif(1) < p, ab, p)
}
return(c(target > ab[2], n, ab))
}
Để làm ví dụ về việc sử dụng và kiểm tra độ chính xác của nó, hãy lấy trường hợp và . Chúng ta hãy vẽ giá trị bằng thuật toán, báo cáo giá trị trung bình (và sai số chuẩn của nó) và cho biết số lần lật trung bình được sử dụng.p = 0,9 10 , 000
target <- 0.01
p <- 0.9
set.seed(17)
sim <- replicate(1e4, draw(target, p))
(m <- mean(sim[1, ])) # The mean
(m - target) / (sd(sim[1, ]) / sqrt(ncol(sim))) # A Z-score to compare to `target`
mean(sim[2, ]) # Average number of flips
Trong mô phỏng này, trong số các lần lật là đầu. Mặc dù thấp hơn mục tiêu , nhưng điểm Z của không đáng kể: độ lệch này có thể được quy cho sự may rủi. Số lần lật trung bình là - ít hơn mười. Nếu chúng ta đã sử dụng xu, giá trị trung bình có thể đã được --still không khác so với mục tiêu đáng kể, nhưng chỉ có flips sẽ bị cần thiết trên mức trung bình.0.01 - 0,5154 9,886 1 - p 0,0094 1,177
Đây là một giải pháp (một chút lộn xộn, nhưng đó là cú đâm đầu tiên của tôi). Bạn thực sự có thể bỏ qua và WLOG giả sử . Tại sao? Có tồn tại một thuật toán thông minh để tạo ra một đồng xu không thiên vị từ hai lần lật đồng xu thiên vị. Vậy ta có thể giả sử .
Để tạo một , tôi có thể nghĩ đến hai giải pháp (giải pháp đầu tiên không phải là của riêng tôi, nhưng thứ hai là khái quát hóa):
Lật đồng xu không thiên vị lần. Nếu cái đầu không có mặt, bắt đầu lại. Nếu người đứng đầu là hiện nay, lợi nhuận cho dù đồng tiền đầu tiên là một người đứng đầu hay không (vì )
Điều này có thể được mở rộng thành bất kỳ giá trị nào của . Viết ở dạng nhị phân. Ví dụ:
Chúng tôi sẽ tạo một số nhị phân mới bằng cách sử dụng lật đồng xu. Bắt đầu bằng và thêm chữ số tùy thuộc vào việc một đầu (1) hoặc đuôi (0) xuất hiện. Ở mỗi lần lật, hãy so sánh số nhị phân mới của bạn với biểu diễn nhị phân của cho đến cùng một chữ số . Cuối cùng cả hai sẽ phân kỳ và trả về nếu lớn hơn số nhị phân của bạn.
Trong Python:
def simulate(p):
binary_p = float_to_binary(p)
binary_string = '0.'
index = 3
while True:
binary_string += '0' if random.random() < 0.5 else '1'
if binary_string != binary_p[:index]:
return binary_string < binary_p[:index]
index += 1
Một số bằng chứng:
np.mean([simulate(0.4) for i in range(10000)])
là khoảng 0,4 (tuy nhiên không nhanh)
Tôi thấy một giải pháp đơn giản, nhưng không nghi ngờ gì, có nhiều cách để làm điều đó, một số có lẽ đơn giản hơn thế này. Cách tiếp cận này có thể được chia thành hai bước:
Tạo ra từ hai sự kiện có xác suất bằng nhau được đưa ra một quy trình tung đồng xu không công bằng (sự kết hợp của đồng tiền cụ thể và phương pháp mà nó được tung ra tạo ra một cái đầu có xác suất ). Chúng ta có thể gọi hai sự kiện có thể xảy ra như nhau là và . [Có một cách tiếp cận đơn giản cho việc này đòi hỏi phải lấy các cặp quăng và để tạo ra hai kết quả có khả năng như nhau, với tất cả các kết quả khác dẫn đến việc tạo ra một cặp mới cuộn để thử lại.]H ∗ T ∗ H ∗ = ( H , T ) T ∗ = ( T , H )
Bây giờ bạn tạo ra một bước đi ngẫu nhiên với hai trạng thái hấp thụ bằng cách sử dụng đồng xu công bằng mô phỏng. Bằng cách chọn khoảng cách của các trạng thái hấp thụ từ gốc (một ở trên và một dưới nó), bạn có thể đặt cơ hội hấp thụ bằng cách nói trạng thái hấp thụ trên là tỷ lệ mong muốn của các số nguyên. Cụ thể, nếu bạn đặt hàng rào hấp thụ phía trên tại và hàng rào dưới tại (và bắt đầu quá trình từ gốc) và chạy bước ngẫu nhiên cho đến khi hấp thụ, xác suất hấp thụ ở hàng rào trên là .- ( b - a ) a
(Có một số tính toán được thực hiện ở đây để hiển thị nó, nhưng bạn có thể đưa ra xác suất khá dễ dàng bằng cách làm việc với các mối quan hệ lặp lại ... hoặc bạn có thể thực hiện bằng cách tóm tắt chuỗi vô hạn ... hoặc có nhiều cách khác.)
[self-study]
thẻ và đọc wiki của nó . Lưu ý rằng không cần phải đưa ra lời cầu xin giúp đỡ vào cuối câu hỏi của bạn - chúng tôi biết rằng tất cả những người đăng bài ở đây đều hy vọng được giúp đỡ!