Trọng số xác định hàm phân phối xác suất (pdf). số ngẫu nhiên từ bất kỳ pdf như vậy có thể được tạo ra bởi applying its associated inverse cumulative distribution function đến các số ngẫu nhiên thống nhất giữa 0 và 1.
Xem thêm SO explanation này, hoặc, như được giải thích bởi Wikipedia:
If Y has a U[0,1] distribution then F⁻¹(Y) is distributed as F. This is used in random number generation using the inverse transform sampling-method.
import random
import bisect
import collections
def cdf(weights):
total = sum(weights)
result = []
cumsum = 0
for w in weights:
cumsum += w
result.append(cumsum/total)
return result
def choice(population, weights):
assert len(population) == len(weights)
cdf_vals = cdf(weights)
x = random.random()
idx = bisect.bisect(cdf_vals, x)
return population[idx]
weights=[0.3, 0.4, 0.3]
population = 'ABC'
counts = collections.defaultdict(int)
for i in range(10000):
counts[choice(population, weights)] += 1
print(counts)
# % test.py
# defaultdict(<type 'int'>, {'A': 3066, 'C': 2964, 'B': 3970})
enter code here
Các choice
chức năng trên sử dụng bisect.bisect
, do đó, việc chọn một biến ngẫu nhiên có trọng số được thực hiện trong O(log n)
trong đó n
là độ dài weights
.
Lưu ý rằng kể từ phiên bản 1.7.0, NumPy có mã hoá là np.random.choice function. Ví dụ, điều này tạo ra 1000 mẫu từ dân [0,1,2,3]
với trọng lượng [0.1, 0.2, 0.3, 0.4]
:
import numpy as np
np.random.choice(4, 1000, p=[0.1, 0.2, 0.3, 0.4])
np.random.choice
cũng có một tham số replace
để lấy mẫu có hoặc không có sự thay thế.
Thuật toán tốt hơn về mặt lý thuyết là Alias Method. Nó xây dựng một bảng yêu cầu thời gian O(n)
, nhưng sau đó, các mẫu có thể được rút ra trong thời gian O(1)
. Vì vậy, nếu bạn cần rút ra nhiều mẫu, theo lý thuyết thì phương pháp Alias có thể nhanh hơn. Có triển khai Python của Phương thức Walker Alias here và numpy version here.
Tìm kiếm tìm thấy một số câu hỏi tương tự/giống hệt nhau [ở đây] (http://stackoverflow.com/questions/526255/probability-distribution-in-python) và [tại đây] (http://stackoverflow.com/questions/1056151 – snapshoe
@ ma3: Một trong những điểm yếu của trang web này là vì các câu hỏi cũ có xu hướng bị bỏ qua, không có cơ chế hoặc động lực để cải thiện chúng. Tôi nghĩ câu trả lời của tôi tốt hơn nhiều so với ít nhất là câu trả lời cao hơn cho những câu hỏi đó - không đọc những câu hỏi thấp hơn - nhưng không ai có thể thấy nó nếu tôi đăng nó lên những câu hỏi đó. –