Làm thế nào để lấy mẫu từ một phân phối bình thường với giá trị trung bình và phương sai đã biết bằng ngôn ngữ lập trình thông thường?


36

Tôi chưa bao giờ có một khóa học về thống kê, vì vậy tôi hy vọng tôi sẽ hỏi đúng nơi ở đây.

Giả sử tôi chỉ có hai dữ liệu mô tả phân phối bình thường: trung bình và phương sai . Tôi muốn sử dụng máy tính để lấy mẫu ngẫu nhiên từ bản phân phối này sao cho tôi tôn trọng hai thống kê này.σ 2μσ2

Rõ ràng là tôi có thể xử lý giá trị trung bình bằng cách đơn giản hóa khoảng 0: chỉ cần thêm vào từng mẫu trước khi xuất mẫu. Nhưng tôi không thấy cách tạo mẫu theo lập trình để tôn trọng .σ 2μσ2

Chương trình của tôi sẽ bằng ngôn ngữ lập trình thông thường; Tôi không có quyền truy cập vào bất kỳ gói thống kê.


Ngôn ngữ của bạn có trình tạo số ngẫu nhiên không? Là trình tạo này chỉ từ phân phối đồng đều hay nó cũng có thể tạo từ phân phối bình thường?
ttnphns

@ttnphns: Khá nhiều ngôn ngữ máy tính đi kèm với trình tạo số ngẫu nhiên. Họ là những máy phát đồng đều áp đảo trên một số miền hữu hạn.
Fixee

Câu trả lời:


33

Nếu bạn có thể lấy mẫu từ một phân phối đưa ra với trung bình 0 và phương sai 1, sau đó bạn có thể dễ dàng mẫu từ một chuyển đổi mô-vị trí của phân phối, trong đó có trung bình và phương sai σ 2 . Nếu x là một mẫu từ một bình phân phối 0 và phương sai 1 thì σ x + μ là một mẫu với trung bình μ và phương sai σ 2 . Vì vậy, tất cả các bạn phải làm là để mở rộng biến bởi độ lệch chuẩn σ (căn bậc hai của phương sai) trước khi thêm giá trị trung bình μ .μσ2x

σx+μ
μσ2σμ

Làm thế nào bạn thực sự có được một mô phỏng từ một phân phối bình thường với trung bình 0 và phương sai 1 là một câu chuyện khác nhau. Thật thú vị và thú vị khi biết cách triển khai những thứ như vậy, nhưng cho dù bạn có sử dụng gói thống kê hay ngôn ngữ lập trình hay không, tôi sẽ khuyên bạn nên lấy và sử dụng một hàm hoặc thư viện phù hợp để tạo số ngẫu nhiên. Nếu bạn muốn tư vấn về thư viện nào sẽ sử dụng, bạn có thể muốn thêm thông tin cụ thể về ngôn ngữ lập trình bạn đang sử dụng.

Chỉnh sửa: Trong phần bình luận, một số câu trả lời khác và thực tế là Fixee đã chấp nhận câu trả lời này, tôi sẽ cung cấp thêm một số chi tiết về cách người ta có thể sử dụng các phép biến đổi của các biến thống nhất để tạo ra các biến thông thường.

  • Một phương pháp, đã được đề cập trong một nhận xét của VitalStatistix , là phương pháp Box-Muller lấy hai biến ngẫu nhiên thống nhất độc lập và tạo ra hai biến ngẫu nhiên bình thường độc lập. Một phương pháp tương tự tránh tính toán của hai hàm siêu việt sincos với chi phí của một vài mô phỏng nữa đã được đăng lên như một câu trả lời của francogrex .
  • Một phương pháp hoàn toàn tổng quát là biến đổi một biến ngẫu nhiên thống nhất bằng hàm phân phối nghịch đảo. Nếu được phân bố đều trên [ 0 , 1 ] sau đó Φ - 1 ( U ) có phân phối chuẩn chuẩn. Mặc dù không có công thức phân tích rõ ràng cho Φ - 1 , nó có thể được tính bằng cách xấp xỉ bằng số chính xác. Việc triển khai hiện tại trong R (tôi đã kiểm tra lần cuối) sử dụng ý tưởng này. Phương pháp này về mặt khái niệm rất đơn giản, nhưng đòi hỏi phải thực hiện chính xác Φ - 1 , có lẽ không phổ biến như các hàm siêu việt (khác)Bạn[0,1]
    Φ-1(Bạn)
    Φ-1Φ-1đăng nhập , tội lỗicos .
  • Một số câu trả lời đề cập đến khả năng sử dụng định lý giới hạn trung tâm để xấp xỉ phân phối chuẩn là trung bình của các biến ngẫu nhiên thống nhất. Điều này thường không được khuyến khích. Các đối số được trình bày, chẳng hạn như khớp giá trị trung bình 0 và phương sai 1 và các cân nhắc về hỗ trợ của phân phối là không thuyết phục. Trong Bài tập 2.3 trong phần "Giới thiệu phương pháp Monte Carlo với R" của Christian P. Robert và George Casella, bộ tạo này được gọi là cổ và phép tính gần đúng được gọi là rất kém .
  • Có một số lượng lớn các ý tưởng khác. Chương 3 và đặc biệt, Phần 3,4, trong "Nghệ thuật lập trình máy tính" Tập. 2 của Donald E. Knuth là một tài liệu tham khảo cổ điển về việc tạo số ngẫu nhiên. Brian Ripley đã viết Thế hệ máy tính biến ngẫu nhiên: Hướng dẫn , có thể hữu ích. Cuốn sách được đề cập bởi Robert và Casella, hoặc có lẽ Chương 2 trong cuốn sách khác của họ, "phương pháp thống kê Monte Carlo", cũng được đề xuất.

Vào cuối ngày, một phương thức được thực hiện chính xác không tốt hơn trình tạo số ngẫu nhiên giả ngẫu nhiên được sử dụng. Cá nhân, tôi thích dựa vào các thư viện mục đích đặc biệt mà tôi tin là đáng tin cậy. Tôi hầu như luôn dựa vào các phương thức được triển khai trong R trực tiếp trong R hoặc thông qua API trong C / C ++. Rõ ràng, đây không phải là một giải pháp cho tất cả mọi người, nhưng tôi không đủ quen thuộc với các thư viện khác để đề xuất các lựa chọn thay thế.


(+1) Câu trả lời và lời khuyên tốt cho OP.
Đức hồng y

18
Tôi không chắc chắn nếu tôi đưa ra một nhận xét không cần thiết ở đây, nhưng, nếu bạn chỉ có quyền truy cập vào trình tạo số ngẫu nhiên thống nhất, thì bạn có thể sử dụng Biến đổi Box-Muller để tạo các số ngẫu nhiên N (0,1) độc lập. Tóm lại, nếu U_1 và U_2 là độc lập rút khỏi Uniform (0,1) phân phối sau đó
-2đăng nhập(Bạn1)cos(2πBạn2)
được phân phối dưới dạng các biến ngẫu nhiên N (0,1) độc lập. Ý tưởng cơ bản
-2đăng nhập(Bạn1)tội(2πBạn2)
VitalStatistix

2
@Vital: Không phải là một bình luận không cần thiết; một cái tốt Biến đổi Box-Muller có lẽ là chương trình rất dễ lập trình với cơ hội tối thiểu vô tình làm điều gì đó xấu. Nó không phải là nhanh nhất , nhưng nó đủ cạnh tranh. Điều đó nói rằng, sử dụng một thư viện mã đã được thiết lập có lẽ vẫn an toàn hơn, đặc biệt là khi nơi mà người ta dễ mắc sai lầm nhất là cách tạo ra các đầu vào phương sai ngẫu nhiên thống nhất !
hồng y

@Vital: Cảm ơn, đây là những gì tôi đang tìm kiếm. Nếu bạn muốn chuyển đổi nhận xét của bạn thành một câu trả lời, tôi sẽ vui vẻ nâng cấp nó.
Fixee

1
@VitalStatistix, đó là một nhận xét tốt và có vẻ như đây là thứ mà OP đang tìm kiếm. Tại sao không biến nó thành một câu trả lời và có lẽ xây dựng nó một chút về ý tưởng chung về việc sử dụng các phép biến đổi của các biến ngẫu nhiên thống nhất. Tôi do dự khi làm điều này vì lý do Hồng y đề cập chủ yếu vì tôi không biết liệu trình tạo đồng phục mặc định từ bất kỳ ngôn ngữ nào có phải là trình tạo tốt hay không.
NRH

10

Đây thực sự là một nhận xét về câu trả lời của Michael Lew và bình luận của Fixee, nhưng được đăng dưới dạng câu trả lời vì tôi không có tiếng tăm trên trang web này để bình luận.

Tổng của mười hai biến ngẫu nhiên độc lập phân bố đồng đều trên có nghĩa là 6 và phương sai 1 . Nói cách khác, E [ 12 Σ i = 1 X i ] = 12 Σ i = 1[0,1]61

E[Σtôi= =112Xtôi]= =Σtôi= =112E[Xtôi]= =12×12= =6
var[Σtôi= =112Xtôi]= =Σtôi= =112var[Xtôi]= =12×112= =1.
Σtôi= =112Xtôi-610/12Σtôi= =112Xtôi-6[-6,6]6

5

Ngoài câu trả lời của NRH, nếu bạn vẫn không có phương tiện để tạo các mẫu ngẫu nhiên từ "phân phối chuẩn thông thường" N (0,1), dưới đây là một cách tốt và đơn giản (vì bạn đề cập rằng bạn không có thống kê gói, các chức năng dưới đây nên có sẵn trong hầu hết các ngôn ngữ lập trình tiêu chuẩn).

1. Tạo u và v là hai số ngẫu nhiên phân bố đồng đều trong phạm vi từ -1 đến 1 theo
u = 2 r1 - 1v = 2 r2 - 1

2. tính toán w = u^2 + v^2nếu w> 1 thì quay lại 1

3.return u * z và y = v * z với z= sqrt(-2ln(w)/w) Mã mẫu sẽ như thế này:

u = 2 * random() - 1;
v = 2 * random() - 1;
w = pow(u, 2) + pow(v, 2);
if (w < 1) {
    z = sqrt((-2 * log(w)) / w);
    x = u * z;
    y = v * z;
    }

sau đó sử dụng những gì MHR đã đề xuất ở trên để thu được các độ lệch ngẫu nhiên từ đó N(mu, sigma^2).


Khi tôi đăng câu trả lời của mình lên trên, tôi đã không nhận thấy rằng @vitalStatistix đã cung cấp cho bạn thuật toán Biến đổi Box-Muller. Tôi cho là tốt như tôi nghĩ.
francogrex

2
Bạn có thể giải thích lý do tạo ra các biến thể bình thường từ phân phối đồng đều (ngoài quan điểm thuật toán) và không chỉ sử dụng pdf của phân phối Gaussian / Bình thường? Hay là nó hoàn toàn sai?
Arun

4
@Arun Một lý do: Phương pháp cực của Marsaglia rất hữu ích khi bạn chỉ có RNG tạo ra độ lệch đồng đều.
chl

1
@Arun nó là cách dễ nhất. Bạn cũng có thể tạo trực tiếp từ pdf bằng cách sử dụng ví dụ phương pháp "từ chối chấp nhận". Tôi đã đăng cho bạn một ví dụ đơn giản trên trang web của tôi (vì không đủ chỗ trong hộp bình luận ở đây).
francogrex

4

Phân phối bình thường xuất hiện khi một người cộng lại với nhau rất nhiều giá trị ngẫu nhiên của phân phối tương tự (ý tôi là tương tự nhau). Nếu bạn cộng lại mười hoặc nhiều giá trị ngẫu nhiên được phân phối đồng đều thì tổng sẽ được phân phối gần như bình thường. (Thêm hơn mười nếu bạn muốn nó thậm chí bình thường hơn, nhưng mười là đủ cho hầu hết các mục đích.)

Giả sử rằng các giá trị ngẫu nhiên đồng nhất của bạn được phân phối đồng đều trong khoảng từ 0 đến 1. Tổng sau đó sẽ nằm trong khoảng từ 0 đến 10. Trừ 5 từ tổng và giá trị trung bình của phân phối kết quả sẽ là 0. Bây giờ bạn chia kết quả cho độ lệch chuẩn của phân phối chuẩn (gần) và nhân kết quả với độ lệch chuẩn mong muốn. Thật không may, tôi không chắc độ lệch chuẩn của tổng mười độ lệch ngẫu nhiên thống nhất là gì, nhưng nếu chúng ta may mắn sẽ có người cho chúng tôi biết trong một nhận xét!

Tôi thích nói chuyện với sinh viên về phân phối bình thường trong các điều khoản này bởi vì tiện ích của giả định phân phối bình thường trong nhiều hệ thống bắt nguồn hoàn toàn từ tài sản rằng tổng của nhiều ảnh hưởng ngẫu nhiên dẫn đến phân phối bình thường.


Bạn đang sử dụng giới hạn trung tâm Thm ở đây (rằng một loạt các biến ngẫu nhiên iid tổng hợp với một biến ngẫu nhiên bình thường). Tôi đã không cân nhắc điều này bởi vì tôi nghĩ nó sẽ quá chậm, nhưng bạn nói 10 là đủ?! Điều này tốt hơn so với tính toán một bản ghi và một sin / cos và sqrt!
Fixee

Ngoài ra, giá trị trung bình của rv thống nhất trên [0,1] là 0,5 với phương sai 1/12. Nếu bạn tính tổng 10 trong số này, bạn nhận được trung bình là 5 và phương sai 10/12 = 5/6.
Fixee

1
Từ quan điểm sư phạm, phương pháp này cung cấp cho một cuộc thảo luận và trình diễn hay, hữu ích. Tuy nhiên, tôi sẽ không khuyến khích bất cứ ai sử dụng phương pháp này trong thực tế.
Đức hồng y

1
đăng nhậptộicos

1
@Michael: Tuyên bố nó cung cấp phân phối "đúng" là một chút kéo dài, đặc biệt vì phân phối gần đúng có hỗ trợ nhỏ gọn và, trong nhiều ứng dụng, người ta quan tâm đến việc các biến thể có thể được tạo ra hiệu quả như thế nào. :) Vấn đề là có nhiều lựa chọn tốt hơn nhiều . Nhưng, tôi vẫn nghĩ rằng nó cung cấp một cái gì đó hữu ích về mặt sư phạm.
Đức hồng y
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.