Bên trong Bayes

Phân tích dữ liệu Bayesian với Python

Michal Oleszak

Machine Learning Engineer

Ôn lại định lý Bayes

 

$$P(A|B) = \frac{P(B|A) * P(A)}{P(B)}$$

Phân tích dữ liệu Bayesian với Python

Ôn lại định lý Bayes

 

$$P(\text{parameters}|\text{data}) = \frac{P(\text{data}|\text{parameters}) * P(\text{parameters})}{P(\text{data})}$$

 

  • P(parameters | data)   →   phân phối hậu nghiệm: ta biết gì về tham số sau khi thấy dữ liệu
  • P(parameters)   →   phân phối tiên nghiệm: ta biết gì về tham số trước khi có dữ liệu
  • P(data | parameters)   →   likelihood của dữ liệu theo mô hình thống kê
  • P(data)   →   hệ số chuẩn hóa
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

num_heads = np.arange(0, 101, 1)
head_prob = np.arange(0, 1.01, 0.01)

coin = pd.DataFrame([(x, y) for x in num_heads for y in head_prob]) coin.columns = ["num_heads", "head_prob"]
       num_heads  head_prob
0              0       0.00
1              0       0.01
2              0       0.02
          ...        ...
10199        100       0.99
10200        100       1.00
[10201 rows x 2 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

from scipy.stats import uniform
coin["prior"] = uniform.pdf(coin["head_prob"])

       num_heads  head_prob
0              0       0.00
1              0       0.01
2              0       0.02
          ...        ...
10199        100       0.99
10200        100       1.00
[10201 rows x 2 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

from scipy.stats import uniform
coin["prior"] = uniform.pdf(coin["head_prob"])

       num_heads  head_prob  prior
0              0       0.00    1.0
1              0       0.01    1.0
2              0       0.02    1.0
          ...        ...    ...
10199        100       0.99    1.0
10200        100       1.00    1.0
[10201 rows x 3 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

from scipy.stats import uniform
coin["prior"] = uniform.pdf(coin["head_prob"])

from scipy.stats import binom coin["likelihood"] = binom.pmf(coin["num_heads"], 100, coin["head_prob"])
       num_heads  head_prob  prior
0              0       0.00    1.0
1              0       0.01    1.0
2              0       0.02    1.0
          ...        ...    ...
10199        100       0.99    1.0
10200        100       1.00    1.0
[10201 rows x 3 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

from scipy.stats import uniform
coin["prior"] = uniform.pdf(coin["head_prob"])

from scipy.stats import binom coin["likelihood"] = binom.pmf(coin["num_heads"], 100, coin["head_prob"])
       num_heads  head_prob  prior  likelihood
0              0       0.00    1.0    1.000000
1              0       0.01    1.0    0.366032
2              0       0.02    1.0    0.132620
          ...        ...    ...         ...
10199        100       0.99    1.0    0.366032
10200        100       1.00    1.0    1.000000
[10201 rows x 4 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

coin["posterior_prob"] = coin["prior"] * coin["likelihood"]
coin["posterior_prob"] /= coin["posterior_prob"].sum()


       num_heads  head_prob  prior  likelihood
0              0       0.00    1.0    1.000000
1              0       0.01    1.0    0.366032
2              0       0.02    1.0    0.132620
          ...        ...    ...         ...
10199        100       0.99    1.0    0.366032
10200        100       1.00    1.0    1.000000
[10201 rows x 4 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

coin["posterior_prob"] = coin["prior"] * coin["likelihood"]
coin["posterior_prob"] /= coin["posterior_prob"].sum()


       num_heads  head_prob  prior  likelihood  posterior_prob
0              0       0.00    1.0    1.000000        0.009901
1              0       0.01    1.0    0.366032        0.003624
2              0       0.02    1.0    0.132620        0.001313
          ...        ...    ...         ...             ...
10199        100       0.99    1.0    0.366032        0.003624
10200        100       1.00    1.0    1.000000        0.009901
[10201 rows x 5 columns]
Phân tích dữ liệu Bayesian với Python

Tung đồng xu lần nữa: xấp xỉ lưới

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

from scipy.stats import binom
from scipy.stats import uniform

num_heads = np.arange(0, 101, 1)
head_prob = np.arange(0, 1.01, 0.01)
coin = pd.DataFrame([(x, y) for x in num_heads for y in head_prob])
coin.columns = ["num_heads", "head_prob"]

coin["prior"] = uniform.pdf(coin["head_prob"])
coin["likelihood"] = binom.pmf(coin["num_heads"], 100, coin["head_prob"])

coin["posterior_prob"] = coin["prior"] * coin["likelihood"]
coin["posterior_prob"] /= coin["posterior_prob"].sum()
Phân tích dữ liệu Bayesian với Python

Vẽ phân phối hậu nghiệm

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung?

heads75 = coin.loc[coin["num_heads"] == 75]
heads75["posterior_prob"] /= heads75["posterior_prob"].sum()
      num_heads  head_prob  prior     likelihood  posterior_prob
7575         75       0.00    1.0   0.000000e+00    0.000000e+00
7576         75       0.01    1.0  1.886367e-127   1.867690e-129
         ...        ...    ...            ...             ...
7674         75       0.99    1.0   1.141263e-27    1.129964e-29
7675         75       1.00    1.0   0.000000e+00    0.000000e+00
[101 rows x 5 columns]
sns.lineplot(heads75["head_prob"], heads75["posterior_prob"])
plt.show()
Phân tích dữ liệu Bayesian với Python

Vẽ phân phối hậu nghiệm

Hỏi: Xác suất tung ra mặt ngửa là bao nhiêu nếu quan sát 75 lần ngửa trong 100 lần tung? Đáp:

Biểu đồ mật độ cho xác suất ra mặt ngửa. Đỉnh khoảng 0,75 và cho phép giá trị xấp xỉ từ 0,60 đến 0,85.

Phân tích dữ liệu Bayesian với Python

Luyện tập tính hậu nghiệm bằng xấp xỉ lưới!

Phân tích dữ liệu Bayesian với Python

Preparing Video For Download...