bayesml.categorical package#

モジュール内容#

このモジュールではディリクレ事前分布を用いたカテゴリカル分布を利用できます。

_images/categorical_example.png

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

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

  • \(d\in \mathbb{Z}\): 次元 (\(d \geq 2\))

  • \(\boldsymbol{x} \in \{ 0, 1\}^d\): データ点(one-hot ベクトル、すなわち \(\sum_{k=1}^d x_k=1\))

  • \(\boldsymbol{\theta} \in [0, 1]^d\): パラメータ, (\(\sum_{k=1}^d \theta_k=1\))

\[p(\boldsymbol{x} | \boldsymbol{\theta}) = \mathrm{Cat}(\boldsymbol{x}|\boldsymbol{\theta}) = \prod_{k=1}^d \theta_k^{x_k},\]
\[\begin{split}\mathbb{E}[\boldsymbol{x} | \boldsymbol{\theta}] &= \boldsymbol{\theta}, \\ \mathbb{V}[x_k | \boldsymbol{\theta}] &= \theta_k (1 - \theta_k), \\ \mathrm{Cov}[x_k, x_{k'} | \boldsymbol{\theta}] &= -\theta_k \theta_{k'}.\end{split}\]

事前分布#

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

  • \(\boldsymbol{\alpha}_0 \in \mathbb{R}_{>0}^d\): ハイパーパラメータ

  • \(\Gamma (\cdot)\): ガンマ関数

  • \(\tilde{\alpha}_0 = \sum_{k=1}^d \alpha_{0,k}\)

  • \(C(\boldsymbol{\alpha}_0)=\frac{\Gamma(\tilde{\alpha}_0)}{\Gamma(\alpha_{0,1})\cdots\Gamma(\alpha_{0,d})}\)

\[p(\boldsymbol{\theta}) = \mathrm{Dir}(\boldsymbol{\theta}|\boldsymbol{\alpha}_0) = C(\boldsymbol{\alpha}_0)\prod_{k=1}^d\theta_k^{\alpha_{0,k}-1},\]
\[\begin{split}\mathbb{E}[\boldsymbol{\theta}] &= \frac{\boldsymbol{\alpha}_0}{\tilde{\alpha}_0}, \\ \mathbb{V}[\theta_k] &= \frac{1}{\tilde{\alpha}_0 + 1} \frac{\alpha_{0,k}}{\tilde{\alpha}_0} \left(1 - \frac{\alpha_{0,k}}{\tilde{\alpha}_0} \right), \\ \mathrm{Cov}[\theta_k, \theta_{k'}] &= - \frac{1}{\tilde{\alpha}_0 + 1} \frac{\alpha_{0,k}}{\tilde{\alpha}_0} \frac{\alpha_{0,k'}}{\tilde{\alpha}_0}.\end{split}\]

事後分布#

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

  • \(\boldsymbol{x}^n = (\boldsymbol{x}_1, \boldsymbol{x}_2, \dots , \boldsymbol{x}_n) \in \{ 0, 1\}^{d\times n}\): 与えられたデータ

  • \(\boldsymbol{\alpha}_n \in \mathbb{R}_{>0}^d\): ハイパーパラメータ

  • \(\tilde{\alpha}_n = \sum_{k=1}^d \alpha_{n,k}\)

  • \(C(\boldsymbol{\alpha}_n)=\frac{\Gamma(\tilde{\alpha}_n)}{\Gamma(\alpha_{n,1})\cdots\Gamma(\alpha_{n,d})}\)

\[p(\boldsymbol{\theta} | \boldsymbol{x}^n) = \mathrm{Dir}(\boldsymbol{\theta}|\boldsymbol{\alpha}_n) = C(\boldsymbol{\alpha}_n)\prod_{k=1}^d\theta_k^{\alpha_{n,k}-1},\]
\[\begin{split}\mathbb{E}[\boldsymbol{\theta} | \boldsymbol{x}^n] &= \frac{\boldsymbol{\alpha}_n}{\tilde{\alpha}_n}, \\ \mathbb{V}[\theta_k | \boldsymbol{x}^n] &= \frac{1}{\tilde{\alpha}_n + 1} \frac{\alpha_{n,k}}{\tilde{\alpha}_n} \left(1 - \frac{\alpha_{n,k}}{\tilde{\alpha}_n} \right), \\ \mathrm{Cov}[\theta_k, \theta_{k'} | \boldsymbol{x}^n] &= - \frac{1}{\tilde{\alpha}_n + 1} \frac{\alpha_{n,k}}{\tilde{\alpha}_n} \frac{\alpha_{n,k'}}{\tilde{\alpha}_n},\end{split}\]

ハイパーパラメータの更新ルールは以下の通りです。

\[\alpha_{n,k} = \alpha_{0,k} + \sum_{i=1}^n x_{i,k}, \quad (k \in \{ 1, 2, \dots , d \}).\]

予測分布#

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

  • \(\boldsymbol{x}_{n+1} \in \{ 0, 1\}^d\): 新たなデータ点

  • \(\boldsymbol{\theta}_\mathrm{p} \in [0, 1]^d\): 事後分布のハイパーパラメータ (\(\sum_{k=1}^d \theta_{\mathrm{p},k} = 1\))

\[p(\boldsymbol{x}_{n+1} | \boldsymbol{x}^n) = \mathrm{Cat}(\boldsymbol{x}_{n+1}|\boldsymbol{\theta}_\mathrm{p}) = \prod_{k=1}^d \theta_{\mathrm{p},k}^{x_{n+1,k}},\]
\[\begin{split}\mathbb{E}[\boldsymbol{x}_{n+1} | \boldsymbol{x}^n] &= \boldsymbol{\theta}_\mathrm{p}, \\ \mathbb{V}[x_{n+1,k} | \boldsymbol{x}^n] &= \theta_{\mathrm{p},k} (1 - \theta_{\mathrm{p},k}), \\ \mathrm{Cov}[x_{n+1,k}, x_{n+1,k'} | \boldsymbol{x}^n] &= -\theta_{\mathrm{p},k} \theta_{\mathrm{p},k'},\end{split}\]

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

\[\theta_{\mathrm{p},k} = \frac{\alpha_{n,k}}{\sum_{k=1}^d \alpha_{n,k}}, \quad (k \in \{ 1, 2, \dots , d \}).\]

GitHubスターのお願い#

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

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

GitHubスター

クラス#

class bayesml.categorical.GenModel(c_degree, theta_vec=None, h_alpha_vec=None, seed=None)#

ベースクラス: Generative

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

パラメータ:
c_degreeint

正の整数。

theta_vecnumpy ndarray, optional

\([0, 1]^d\) の範囲に属する実数ベクトル。デフォルトでは [1/d, 1/d, ..., 1/d] となります。

h_alpha_vecnumpy ndarray, optional

正の実数のベクトルであり、デフォルトでは [1/2, 1/2, ..., 1/2] となります。単一の実数が入力された場合、ブロードキャスト処理が行われます。

seed{None, int}, optional

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

メソッド

gen_params()

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

gen_sample(sample_size[, onehot])

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

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[, onehot])

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

set_h_params([h_alpha_vec])

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

set_params([theta_vec])

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

visualize_model([sample_size, sample_num])

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

get_constants()#

GenModel の定数を取得します。

返り値:
constantsdict of {str: int}
  • "c_degree":``self.c_degree``の値

set_h_params(h_alpha_vec=None)#

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

パラメータ:
h_alpha_vecnumpy ndarray, optional

正の実数のベクトルです。デフォルトではNoneとなります。単一の実数が入力された場合、ブロードキャストされます。

get_h_params()#

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

返り値:
h_params{str:numpy ndarray}

{"h_alpha_vec": self.h_alpha_vec}

gen_params()#

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

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

set_params(theta_vec=None)#

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

パラメータ:
pnumpy ndarray, optional

実数ベクトル \(p \in [0, 1]^d\)、デフォルトはNoneです。

get_params()#

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

返り値:
params{str:numpy ndarray}

{"theta_vec":self.theta_vec}

gen_sample(sample_size, onehot=True)#

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

パラメータ:
sample_sizeint

正の整数

onehotbool, optional

Trueの場合、生成されたサンプルは one-hot 符号化されます。デフォルトはTrueです。

返り値:
xnumpy ndarray

非負の整数配列です。onehotオプションがTrueの場合、その形状は``(sample_size,c_degree)``となり、各行は one-hot ベクトルとなります。onehotオプションがFalseの場合、その形状は``(sample_size,)``となり、各要素はself.c_degreeよりも小さくなります。

save_sample(filename, sample_size, onehot=True)#

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

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

パラメータ:
filenamestr

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

sample_sizeint

正の整数

onehotbool, optional

Trueの場合、生成されたサンプルは one-hot 符号化されます。デフォルトはTrueです。

visualize_model(sample_size=20, sample_num=5)#

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

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

正の整数、デフォルトは20です

sample_numint, オプション

正の整数、デフォルトは5です

例

>>> from bayesml import categorical
>>> model = categorical.GenModel(3)
>>> model.visualize_model()
theta_vec:[0.33333333 0.33333333 0.33333333]
_images/categorical_example.png
class bayesml.categorical.LearnModel(c_degree, h0_alpha_vec=None)#

ベースクラス: Posterior, PredictiveMixin

事後分布と予測分布

パラメータ:
c_degreeint

正の整数。

h0_alpha_vecnumpy.ndarray, optional

正の実数のベクトルであり、デフォルトでは [1/2, 1/2, ..., 1/2] となります。単一の実数が入力された場合、ブロードキャスト処理が行われます。

属性:
hn_alpha_vecnumpy.ndarray

正の実数のベクトル

p_theta_vecnumpy.ndarray

`[0, 1]^d`に属する実数ベクトル

メソッド

calc_log_marginal_likelihood()

対数周辺尤度の計算

calc_pred_dist()

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

estimate_params([loss, dict_out])

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

fit(x[, onehot])

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

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, onehot])

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

overwrite_h0_params()

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

pred_and_update(x[, loss, onehot])

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

predict([onehot])

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

predict_proba()

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

reset_hn_params()

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

save_h0_params(filename)

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

save_hn_params(filename)

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

set_h0_params([h0_alpha_vec])

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

set_hn_params([hn_alpha_vec])

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

update_posterior(x[, onehot])

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

visualize_posterior()

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

get_constants()#

LearnModel の定数を取得します。

返り値:
constantsdict of {str: int}
  • "c_degree":``self.c_degree``の値

set_h0_params(h0_alpha_vec=None)#

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

パラメータ:
h0_alpha_vecnumpy ndarray, optional

正の実数のベクトルです。デフォルトではNoneとなります。単一の実数が入力された場合、ブロードキャストされます。

get_h0_params()#

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

返り値:
h0_paramsdict of {str: float, numpy.ndarray}

"h0_alpha_vec" : The value of self.h0_alpha_vec

set_hn_params(hn_alpha_vec=None)#

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

パラメータ:
hn_alpha_vecnumpy ndarray, optional

正の実数のベクトルです。デフォルトではNoneとなります。単一の実数が入力された場合、ブロードキャストされます。

get_hn_params()#

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

返り値:
hn_paramsdict of {str: numpy.ndarray}

"hn_alpha_vec" : The value of self.hn_alpha_vec

update_posterior(x, onehot=True)#

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

パラメータ:
xnumpy.ndarray

非負の整数配列です。onehotオプションがTrueの場合、その形状は``(sample_size,c_degree)``でなければならず、各行はone-hotベクトルである必要があります。onehotオプションがFalseの場合、その形状は``(sample_size,)``でなければならず、各要素は``self.c_degree``より小さい必要があります。

onehotbool, optional

Trueの場合、入力サンプルはone-hotエンコーディングされている必要があります。デフォルトはTrueです。

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

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

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数は、デフォルトで「二乗誤差損失」となります。この関数は「二乗誤差損失」、「0-1損失」、「KL」をサポートしております。

dict_outbool, optional

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

返り値:
estimates{numpy ndarray, float, None, or rv_frozen}

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

visualize_posterior()#

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

例

>>> from bayesml import categorical
>>> gen_model = categorical.GenModel(3)
>>> x = gen_model.gen_sample(20)
>>> learn_model = categorical.LearnModel()
>>> learn_model.update_posterior(x)
>>> learn_model.visualize_posterior()
hn_alpha_vec:[6.5 8.5 6.5]
_images/categorical_posterior.png
get_p_params()#

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

返り値:
p_paramsdict of {str: numpy.ndarray}

"p_theta_vec" : self.p_theta_vec の値

calc_pred_dist()#

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

make_prediction(loss='squared', onehot=True)#

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

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数は、デフォルトで「二乗誤差損失」となります。この関数は「二乗誤差損失」、「0-1損失」、「KL」をサポートしております。

onehotbool, optional

Trueの場合、「0-1」損失関数における予測値は one-hot 符号化されます。デフォルトではTrueです。

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

指定された損失関数に基づく予測値です。損失関数が「KL」の場合、予測分布は出現確率で構成される1次元のnumpy.ndarrayとして返されます。

pred_and_update(x, loss='squared', onehot=True)#

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

パラメータ:
xnumpy.ndarray or int

onehot オプションが True の場合、長さ c_degree の 1 次元配列となります。onehot オプションが False の場合、非負の整数となります。

lossstr, optional

ベイズリスク関数の基礎となる損失関数は、デフォルトで「二乗誤差損失」となります。この関数は「二乗誤差損失」、「0-1損失」、「KL」をサポートしております。

onehotbool, optional

Trueの場合、入力はone-hot エンコードされなければなりません。また、「0-1」損失関数における予測値もone-hot エンコードされます。デフォルトではTrueです。

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

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

calc_log_marginal_likelihood()#

対数周辺尤度の計算

返り値:
log_marginal_likelihoodfloat

対数周辺尤度

fit(x, onehot=True)#

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

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

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

非負の整数配列です。onehotオプションがTrueの場合、その形状は``(sample_size,c_degree)``でなければならず、各行はone-hotベクトルである必要があります。onehotオプションがFalseの場合、その形状は``(sample_size,)``でなければならず、各要素は``self.c_degree``より小さい必要があります。

onehotbool, optional

Trueの場合、入力サンプルはone-hotエンコーディングされている必要があります。デフォルトはTrueです。

返り値:
selfLearnModel

The fitted model.

predict(onehot=True)#

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

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

>>> self.calc_pred_dist()
>>> return self.make_prediction(loss="0-1",onehot=onehot)
パラメータ:
onehotbool, optional

Trueの場合、予測値はone-hot 符号化されます。デフォルトではTrueです。

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

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

predict_proba()#

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

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

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

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