2010-03-02 56 views
5

Tôi thích sử dụng MySQL để phân tích định lượng và thống kê. Tôi muốn tạo một hàm do người dùng định nghĩa trong biểu mẫu: sample_gaussian (mean, stdev) trả về một giá trị ngẫu nhiên lấy mẫu từ phân phối gaussian có độ lệch trung bình và tiêu chuẩn của đối số do người dùng nhập. MySQL đã có hàm rand() trả về một số ngẫu nhiên, vì vậy tôi chỉ cần biết một số mã giả để ràng buộc/chuyển đổi giá trị để nó rơi vào phân phối đúng. Bất kỳ đề xuất nào?cách tạo phân phối gaussian bằng cách sử dụng hàm mysql do người dùng định nghĩa

BTW- Đây là câu hỏi ngăn xếp đầu tiên của tôi, vì vậy hãy tha thứ cho tôi nếu câu hỏi này đang yêu cầu quá nhiều người dùng trên trang web này.

Trả lời

8

Trong câu trả lời cho câu hỏi của riêng tôi, đây là hàm do người dùng định nghĩa MySQL trả về một giá trị ngẫu nhiên được lấy mẫu từ phân phối Gaussian với giá trị trung bình và độ lệch chuẩn đã cho.

DROP FUNCTION IF EXISTS gauss; 
DELIMITER // 
CREATE FUNCTION gauss(mean float, stdev float) RETURNS float 
BEGIN 
set @x=rand(), @y=rand(); 
set @gaus = ((sqrt(-2*log(@x))*cos(2*pi()*@y))*stdev)+mean; 
return @gaus; 
END 
// 
DELIMITER ; 

Để xác minh rằng điều này là trong thực tế trả về một phân phối Gaussian, bạn có thể tạo ra một loạt số này, sau đó vẽ một biểu đồ:

create temporary table temp (id int, rando float); 
insert into temp (rando) select gauss(2,1); # repeat this operation 500 times 
insert into temp (rando) select gauss(2,1) from any_table_with_500+_entries limit 500; 
select round(temp,1), count(*) from temp group by round(temp,1) # creates a histogram 

Nếu bạn vẽ biểu đồ trong excel hoặc công cụ vẽ đồ thị của lựa chọn, bạn sẽ thấy đường cong hình chuông bình thường.

2

rand() trả về biến ngẫu nhiên được phân phối đồng đều giữa 0 và 1 (bạn nên xác minh điều này vì tôi không chắc chắn - đây là cách nó hoạt động trong Sybase). Bạn có thể sử dụng rand() để tạo một hoặc nhiều biến ngẫu nhiên phân phối bình thường r với giá trị trung bình bằng không và độ lệch chuẩn (và phương sai), nghĩa là r ~ N (0,1), thực hiện một trong các phương pháp được đề cập here

Khi nào bạn đã tạo ra một biến ngẫu nhiên từ N (0,1), bạn có thể khử chuẩn hóa nó (giải quyết cho X trong công thức here) để lấy một biến ngẫu nhiên từ N (my_mean, my_std), bằng cách nhân nó với my_std và sau đó thêm my_mean.

+1

liên kết sitmo.com không hoạt động – vbence

+0

Danh sách thuật toán được cung cấp bởi Wikipedia tại đây: http://en.wikipedia.org/wiki/Normal_distribution#Generating_values_from_normal_distribution –

1

Biến đổi Box-Muller là cách tạo các biến thể ngẫu nhiên chuẩn thông thường bằng các hàm cơ bản. Nó tạo ra hai tại một thời điểm, mà đôi khi lãng phí, nhưng tôi thấy nó rất thanh lịch.

Các vấn đề liên quan