bayesml.bernoulli package#

モジュール内容#

このモジュールではベータ事前分布を用いたベルヌーイ分布を利用できます。

_images/bernoulli_example.png

確率的データ生成モデル#

確率的データ生成モデルは以下の通りです:

  • \(x \in \{ 0, 1\}\): データ

  • \(\theta \in [0, 1]\): パラメータ

\[p(x | \theta) = \mathrm{Bern}(x|\theta) = \theta^x (1-\theta)^{1-x}.\]
\[\begin{split}\mathbb{E}[x | \theta] &= \theta, \\ \mathbb{V}[x | \theta] &= \theta (1 - \theta).\end{split}\]

事前分布#

事前分布は以下の通りです:

  • \(\alpha_0 \in \mathbb{R}_{>0}\): ハイパーパラメータ

  • \(\beta_0 \in \mathbb{R}_{>0}\): ハイパーパラメータ

  • \(B(\cdot,\cdot): \mathbb{R}_{>0} \times \mathbb{R}_{>0} \to \mathbb{R}_{>0}\): ベータ関数

\[p(\theta) = \mathrm{Beta}(\theta|\alpha_0,\beta_0) = \frac{1}{B(\alpha_0, \beta_0)} \theta^{\alpha_0 - 1} (1-\theta)^{\beta_0 - 1}.\]
\[\begin{split}\mathbb{E}[\theta] &= \frac{\alpha_0}{\alpha_0 + \beta_0}, \\ \mathbb{V}[\theta] &= \frac{\alpha_0 \beta_0}{(\alpha_0 + \beta_0)^2 (\alpha_0 + \beta_0 + 1)}.\end{split}\]

事後分布#

事後分布は以下の通りです:

  • \(x^n = (x_1, x_2, \dots , x_n) \in \{ 0, 1\}^n\): 与えられたデータ

  • \(\alpha_n \in \mathbb{R}_{>0}\):ハイパーパラメータ

  • \(\beta_n \in \mathbb{R}_{>0}\): ハイパーパラメータ

\[p(\theta | x^n) = \mathrm{Beta}(\theta|\alpha_n,\beta_n) = \frac{1}{B(\alpha_n, \beta_n)} \theta^{\alpha_n - 1} (1-\theta)^{\beta_n - 1},\]
\[\begin{split}\mathbb{E}[\theta | x^n] &= \frac{\alpha_n}{\alpha_n + \beta_n}, \\ \mathbb{V}[\theta | x^n] &= \frac{\alpha_n \beta_n}{(\alpha_n + \beta_n)^2 (\alpha_n + \beta_n + 1)},\end{split}\]

ここでハイパーパラメータの更新式は以下で与えられます

\[\begin{split}\alpha_n = \alpha_0 + \sum_{i=1}^n I \{ x_i = 1 \},\\ \beta_n = \beta_0 + \sum_{i=1}^n I \{ x_i = 0 \}.\end{split}\]

予測分布#

予測分布は以下の通りです:

  • \(x_{n+1} \in \{ 0, 1\}\): 新しいデータ点

  • \(\alpha_\mathrm{p} \in \mathbb{R}_{>0}\): パラメータ

  • \(\beta_\mathrm{p} \in \mathbb{R}_{>0}\): パラメータ

  • \(\theta_\mathrm{p} \in [0,1]\): パラメータ

\[p(x_{n+1} | x^n) = \mathrm{Bern}(x_{n+1}|\theta_\mathrm{p}) =\theta_\mathrm{p}^{x_{n+1}}(1-\theta_\mathrm{p})^{1-x_{n+1}},\]
\[\begin{split}\mathbb{E}[x_{n+1} | x^n] &= \theta_\mathrm{p}, \\ \mathbb{V}[x_{n+1} | x^n] &= \theta_\mathrm{p} (1 - \theta_\mathrm{p}),\end{split}\]

ここで、パラメータは事後分布のハイパーパラメータから以下のように求められます。

\[\theta_\mathrm{p} = \frac{\alpha_n}{\alpha_n + \beta_n}.\]

GitHubスターのお願い#

もしこのページが参考になったら、GitHubリポジトリにスターをいただけると開発の励みになります。
以下のリンクからリポジトリを開いて右上の☆Starを押してください。

リポジトリを開いて右上の☆Starを押す!

GitHubスター

クラス#

class bayesml.bernoulli.GenModel(theta=0.5, h_alpha=0.5, h_beta=0.5, seed=None)#

ベースクラス: Generative

確率的データ生成モデルと事前分布

パラメータ:
thetafloat, optional

0以上1以下の実数で、デフォルトは 0.5 です。

h_alphafloat, optional

正の実数で、デフォルトは 0.5 です。

h_betafloat, optional

正の実数で、デフォルトは 0.5 です。

seed{None, int}, optional

numpy.random.default_rng()を初期化するためのシード。デフォルトはNone。

メソッド

gen_params()

事前分布からパラメータを生成します。

gen_sample(sample_size)

確率的データ生成モデルからサンプルを生成します。

get_constants()

GenModel の定数を取得します。

get_h_params()

事前分布のハイパーパラメータを取得します。

get_params()

確率的データ生成モデルのパラメータを取得します。

load_h_params(filename)

h_paramsにハイパーパラメータをロードします。

load_params(filename)

``save_paramsで保存したパラメータを読み込みます。

save_h_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

save_params(filename)

python の pickle モジュールを使ってパラメータを保存します。

save_sample(filename, sample_size)

生成されたサンプルを NumPy .npz フォーマットで保存します。

set_h_params([h_alpha, h_beta])

事前分布のハイパーパラメータを設定します。

set_params([theta])

確率的データ生成モデルのパラメータを設定します。

visualize_model([sample_size, sample_num])

確率的データ生成モデルと生成されたサンプルを可視化します。

get_constants()#

GenModel の定数を取得します。

このモデルは定数を持ちません。 したがって、この関数は emtpy dict {} を返します。

返り値:
constantsan empty dict
set_h_params(h_alpha=None, h_beta=None)#

事前分布のハイパーパラメータを設定します。

パラメータ:
h_alphafloat, optional

正の実数。デフォルトは None。

h_betafloat, optional

正の実数。デフォルトは None。

get_h_params()#

事前分布のハイパーパラメータを取得します。

返り値:
h_paramsdict of {str: float}
  • "h_alpha" : self.h_alpha の値

  • "h_beta" : self.h_beta の値

gen_params()#

事前分布からパラメータを生成します。

生成された値は self.theta に設定されます。

set_params(theta=None)#

確率的データ生成モデルのパラメータを設定します。

パラメータ:
thetafloat, optional

正の実数 \(\theta \in [0, 1]\), デフォルトはNone。

get_params()#

確率的データ生成モデルのパラメータを取得します。

返り値:
paramsdict of {str:float}
  • "theta" : self.theta の値

gen_sample(sample_size)#

確率的データ生成モデルからサンプルを生成します。

パラメータ:
sample_sizeint

正の整数

返り値:
xnumpy ndarray

サイズが sammple_size で、要素が 0 または 1 の 1 次元配列。

save_sample(filename, sample_size)#

生成されたサンプルを NumPy .npz フォーマットで保存します。

キーワード "x "でNpzFileとして保存されます。

パラメータ:
filenamestr

サンプルを保存するファイル名。ない場合は .npz が追加されます。

sample_sizeint

正の整数

visualize_model(sample_size=20, sample_num=5)#

確率的データ生成モデルと生成されたサンプルを可視化します。

パラメータ:
sample_sizeint, オプション

正の整数。デフォルトは 20。

sample_numint, オプション

正の整数。デフォルトは 5。

例

>>> from bayesml import bernoulli
>>> model = bernoulli.GenModel()
>>> model.visualize_model()
theta:0.5
x0:[1 1 0 0 0 1 0 1 0 0 0 1 0 1 0 1 0 1 0 0]
x1:[1 1 0 0 0 0 0 1 1 0 0 0 1 0 1 0 0 0 0 0]
x2:[0 1 0 1 0 0 1 0 0 0 1 0 1 1 1 0 1 0 1 1]
x3:[0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1]
x4:[1 0 1 1 1 1 0 1 0 0 1 1 0 0 0 0 0 0 1 1]
_images/bernoulli_example.png
class bayesml.bernoulli.LearnModel(h0_alpha=0.5, h0_beta=0.5)#

ベースクラス: Posterior, PredictiveMixin

事後分布と予測分布

パラメータ:
h0_alphafloat, optional

正の実数で、デフォルトは 0.5 です。

h0_betafloat, optional

正の実数で、デフォルトは 0.5 です。

属性:
hn_alphafloat

正の実数

hn_betafloat

正の実数

p_thetafloat

実数 \(\theta_\mathrm{p} \in [0, 1]\)

メソッド

calc_log_marginal_likelihood()

対数周辺尤度の計算

calc_pred_dist()

予測分布のパラメータを計算します。

estimate_interval([credibility])

パラメータの信頼区間

estimate_params([loss, dict_out])

与えられた基準の下で、確率的データ生成モデルのパラメータを推定します。

fit(x)

モデルをデータに当てはめます。

get_constants()

LearnModel の定数を取得します。

get_h0_params()

事後分布のハイパーパラメータの初期値を取得します。

get_hn_params()

事後分布のハイパーパラメータを取得します。

get_p_params()

予測分布のパラメータを取得します。

load_h0_params(filename)

h0_paramsにハイパーパラメータをロードします。

load_hn_params(filename)

hn_paramsにハイパーパラメータをロードします。

make_prediction([loss])

与えられた基準の下で、新しいデータ点を予測します。

overwrite_h0_params()

事後分布のハイパーパラメータの初期値を学習した値で上書きします。

pred_and_update(x[, loss])

逐次的に新しいデータ点を予測し、事後分布を更新します。

predict()

次のデータ点を予測します。

predict_proba()

次のデータ点を予測します。

reset_hn_params()

事後分布のハイパーパラメータを初期値に戻します。

save_h0_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

save_hn_params(filename)

python pickle モジュールを使ってハイパーパラメータを保存します。

set_h0_params([h0_alpha, h0_beta])

事後分布のハイパーパラメータの初期値を設定します。

set_hn_params([hn_alpha, hn_beta])

事後分布のハイパーパラメータの更新値を設定します。

update_posterior(x)

訓練データを使って事後分布のハイパーパラメータを更新します。

visualize_posterior()

パラメータの事後分布を可視化します。

get_constants()#

LearnModel の定数を取得します。

このモデルは定数を持ちません。 したがって、この関数は emtpy dict {} を返します。

返り値:
constantsan empty dict
set_h0_params(h0_alpha=None, h0_beta=None)#

事後分布のハイパーパラメータの初期値を設定します。

パラメータ:
h0_alphafloat, optional

正の実数。デフォルトは None。

h0_betafloat, optionanl

正の実数。デフォルトは None。

get_h0_params()#

事後分布のハイパーパラメータの初期値を取得します。

返り値:
h0_paramsdict of {str: float}
  • "h0_alpha" : self.h0_alpha の値

  • "h0_beta" : self.h0_beta の値

set_hn_params(hn_alpha=None, hn_beta=None)#

事後分布のハイパーパラメータの更新値を設定します。

パラメータ:
hn_alphafloat, optional

正の実数。デフォルトは None。

hn_betafloat, optional

正の実数。デフォルトは None。

get_hn_params()#

事後分布のハイパーパラメータを取得します。

返り値:
hn_paramsdict of {str: float}
  • "hn_alpha" : self.hn_alpha の値

  • "hn_beta" : self.hn_beta の値

update_posterior(x)#

訓練データを使って事後分布のハイパーパラメータを更新します。

パラメータ:
xnumpy.ndarray

すべての要素は0か1でなければなりません。

estimate_params(loss='squared', dict_out=False)#

与えられた基準の下で、確率的データ生成モデルのパラメータを推定します。

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数、デフォルトは "squared"。この関数は "squared"、"0-1"、"abs"、"KL "をサポートしています。

dict_outbool, optional

If True, output will be a dict, by default False.

返り値:
estimator{float, None, rv_frozen} or dict of {strfloat, None}

与えられた損失関数の下での推定値。存在しない場合は None が返されます。損失関数が "KL" の場合、事後分布そのものが scipy.stats の rv_frozen オブジェクトとして返されます。

estimate_interval(credibility=0.95)#

パラメータの信頼区間

パラメータ:
credibilityfloat, optional

区間がパラメータを含む事後確率,デフォルトは0.95.

返り値:
lower, upper: float

区間の下限と上限

visualize_posterior()#

パラメータの事後分布を可視化します。

例

>>> from bayesml import bernoulli
>>> gen_model = bernoulli.GenModel()
>>> x = gen_model.gen_sample(20)
>>> print(x)
[0 1 1 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0]
>>> learn_model = bernoulli.LearnModel()
>>> learn_model.update_posterior(x)
>>> learn_model.visualize_posterior()
_images/bernoulli_posterior.png
get_p_params()#

予測分布のパラメータを取得します。

返り値:
p_paramsdict of {str: float}
  • "p_theta" : The value of self.p_theta

calc_pred_dist()#

予測分布のパラメータを計算します。

make_prediction(loss='squared')#

与えられた基準の下で、新しいデータ点を予測します。

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数、デフォルトは "squared"。この関数は "squared"、"0-1"、"abs"、"KL "をサポートしています。

返り値:
Predicted_value{int, numpy.ndarray}

与えられた損失関数の下での予測値。 損失関数が "KL "の場合、予測分布自体がnumpy.ndarrayとして返されます。

pred_and_update(x, loss='squared')#

逐次的に新しいデータ点を予測し、事後分布を更新します。

パラメータ:
xint

0または1でなければなりません

lossstr, optional

ベイズリスク関数の基礎となる損失関数、デフォルトは "squared"。この関数は "squared"、"0-1"、"abs"、"KL "をサポートしています。

返り値:
Predicted_value{int, numpy.ndarray}

与えられた損失関数の下での予測値。 損失関数が "KL "の場合、予測分布自体がnumpy.ndarrayとして返されます。

calc_log_marginal_likelihood()#

対数周辺尤度の計算

返り値:
log_marginal_likelihoodfloat

対数周辺尤度

fit(x)#

モデルをデータに当てはめます。

この関数は以下の関数のラッパーです:

>>> self.reset_hn_params()
>>> self.update_posterior(x)
>>> return self
パラメータ:
xnumpy.ndarray

すべての要素は0か1でなければなりません。

返り値:
selfLearnModel

The fitted model.

predict()#

次のデータ点を予測します。

この関数は以下の関数のラッパーです:

>>> self.calc_pred_dist()
>>> return self.make_prediction(loss="0-1")
返り値:
predicted_valueint

0-1損失関数の下での予測値。

predict_proba()#

次のデータ点を予測します。

この関数は以下の関数のラッパーです:

>>> self.calc_pred_dist()
>>> return self.make_prediction(loss="KL")
返り値:
predicted_distributionnumpy.ndarray

KL損失関数のもとでの予測分布。