Під капотом баєсівського підходу

Баєсівський аналіз даних у Python

Michal Oleszak

Machine Learning Engineer

Повернімося до теореми Баєса

 

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

Баєсівський аналіз даних у Python

Повернімося до теореми Баєса

 

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

 

  • P(parameters | data)   →   апостеріорний розподіл: що ми знаємо про параметри після спостереження даних
  • P(parameters)   →   апріорний розподіл: що ми знаємо про параметри до появи будь-яких даних
  • P(data | parameters)   →   правдоподібність даних за нашою статистичною моделлю
  • P(data)   →   коефіцієнт масштабування
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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]
Баєсівський аналіз даних у Python

Ще раз про монету: ґраткова апроксимація

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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()
Баєсівський аналіз даних у Python

Візуалізація апостеріорного розподілу

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків?

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()
Баєсівський аналіз даних у Python

Візуалізація апостеріорного розподілу

Питання: Яка ймовірність випадання герба, якщо ми спостерігали 75 гербів зі 100 кидків? Відповідь:

Графік густини ймовірності для ймовірності випадання герба. Пік близько 0,75; можливі значення приблизно між 0,60 і 0,85.

Баєсівський аналіз даних у Python

Давайте потренуємось обчислювати апостеріори за допомогою ґраткової апроксимації!

Баєсівський аналіз даних у Python

Preparing Video For Download...