bayesml.categorical package#
モジュール内容#
このモジュールではディリクレ事前分布を用いたカテゴリカル分布を利用できます。
確率的データ生成モデル#
確率的データ生成モデルは以下の通りです:
\(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\))
事前分布#
事前分布は以下の通りです:
\(\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})}\)
事後分布#
事後分布は以下の通りです:
\(\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})}\)
ハイパーパラメータの更新ルールは以下の通りです。
予測分布#
予測分布は以下の通りです:
\(\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\))
ここで、パラメータは事後分布のハイパーパラメータから以下のように求められます:
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_sample(sample_size[, onehot])確率的データ生成モデルからサンプルを生成します。
GenModel の定数を取得します。
事前分布のハイパーパラメータを取得します。
確率的データ生成モデルのパラメータを取得します。
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]
- 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`に属する実数ベクトル
メソッド
対数周辺尤度の計算
予測分布のパラメータを計算します。
estimate_params([loss, dict_out])与えられた基準の下で、確率的データ生成モデルのパラメータを推定します。
fit(x[, onehot])モデルをデータに当てはめます。
LearnModel の定数を取得します。
事後分布のハイパーパラメータの初期値を取得します。
事後分布のハイパーパラメータを取得します。
予測分布のパラメータを取得します。
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])次のデータ点を予測します。
次のデータ点を予測します。
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])訓練データを使って事後分布のハイパーパラメータを更新します。
パラメータの事後分布を可視化します。
- 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 ofself.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 ofself.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 defaultFalse.
- 返り値:
- 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]
- 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損失関数のもとでの予測分布。