bayesml.contexttree package#

モジュール内容#

このモジュールでは文脈木モデルとその共役事前分布を利用できます。

_images/contexttree_example.png

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

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

  • \(\mathcal{X}=\{1,2,\ldots,K\}\) : 情報源シンボルの集合

  • \(x^n = x_1 x_2 \cdots x_n \in \mathcal{X}^n~(n\in\mathbb{N})\) : 情報源系列

  • \(D_\mathrm{max} \in \mathbb{N}\) : 文脈木モデルの最大深さ

  • \(T\):文脈木モデルであり、深さが \(D_\mathrm{max}\) 以下である正則 \(K\) 分木です。ここで、「正則」とは、すべての内部ノードが \(K\) 個の子ノードを持つことを意味します

  • \(\mathcal{T}\) : :math:`T`の集合

  • \(s\) :文脈木モデルのノード

  • \(\mathcal{I}(T)\) : \(T\) の内部ノードの集合

  • \(\mathcal{L}(T)\) : \(T\) の葉ノードの集合

  • \(\mathcal{S}(T)\):\(T`のすべてのノードの集合、すなわち、:math:\)mathcal{S}(T) = mathcal{I}(T) cup mathcal{L}(T)`

  • \(s_T(x^{n-1}) \in \mathcal{L}(T)\):\(x^{n-1} = x_1 x_2\cdots x_{n-1}\) に対応する \(T\) の葉ノード

  • \(\boldsymbol{\theta}_s = (\theta_{1|s}, \theta_{2|s}, \ldots, \theta_{K|s})\):葉ノード上のパラメータ。ただし \(\theta_{k|s}\) は \(k\in\mathcal{X}\) の生起確率を表します。

\[p(x_n | x^{n-1}, \boldsymbol{\theta}_T, T)=\theta_{x_n|s_T(x^{n-1})}.\]

事前分布#

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

  • \(g_{0,s} \in [0,1]\):\(s \in \mathcal{S}(T)\) に割り当てられたハイパーパラメータ

  • \(\beta_0(k|s) \in\mathbb{R}_{>0}\) : ディリクレ分布のハイパーパラメータ

  • \(\boldsymbol{\beta}_0(s) = (\beta_0(1|s), \beta_0(2|s), \ldots, \beta_0(K|s)) \in\mathbb{R}^{K}_{>0}\)

  • \(C(\boldsymbol{\beta}_0(s)) = \frac{\Gamma\left(\sum_{k=1}^{K} \beta_0(k|s)\right)}{\prod_{k=1}^{K} \Gamma\left(\beta_0(k|s)\right)}\)

\(s\in\mathcal{L}(T)\) における \(\boldsymbol{\theta}_s\) について、事前分布としてディリクレ分布が次のように仮定されます:

\[p(\boldsymbol{\theta}_s|T) = \mathrm{Dir}(\boldsymbol{\theta}_s|\,\boldsymbol{\beta}_0(s)) = C(\boldsymbol{\beta}_0(s)) \prod_{k=1}^{K} \theta_{k|s}^{\beta_0(k|s)-1}.\]

\(T \in \mathcal{T}\) に対して

\[p(T)=\prod_{s \in \mathcal{I}(T)} g_{0,s} \prod_{s' \in \mathcal{L}(T)} (1-g_{0,s'}),\]

ここで、\(s\) の深さが \(D_\mathrm{max}\) である場合、\(g_{0,s}=0\) となります。

事後分布#

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

  • \(g_{n,s} \in [0,1]\) : 更新されたハイパーパラメータ

  • \(T_\mathrm{max}\):重ね合わせ文脈木(すべての文脈木モデルを重ね合わせた深さが \(D_\mathrm{max}\) である \(K\) 分完全木)

  • \(s_\lambda\) : 根ノード

  • \(\beta_n(k|s) \in\mathbb{R}_{>0}\):事後ディリクレ分布のハイパーパラメータ

  • \(\boldsymbol{\beta}_n(s) = (\beta_n(1|s), \beta_n(2|s), \ldots, \beta_n(K|s)) \in\mathbb{R}^{K}_{>0}\)

  • \(I \{ \cdot \}\): 指標関数

\(\boldsymbol{\theta}_s \in\mathcal{L}(T_\mathrm{max})\) に対して

\[p(\boldsymbol{\theta}_s|x^n) = \mathrm{Dir}(\boldsymbol{\theta}_s|\,\boldsymbol{\beta}_n(s)) = C(\boldsymbol{\beta}_n(s)) \prod_{k=1}^{K} \theta_{k|s}^{\beta_n(k|s)-1},\]

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

\[\beta_n(k|s) = \beta_0(k|s) + \sum_{i=1}^n I \left\{ s \ \mathrm{is \ the \ ancestor \ of} \ s_{T_\mathrm{max}}(x^{i-1}) \ \mathrm{and} \ x_i=k \right\}.\]

\(T \in \mathcal{T}\) に対して

\[p(T|x^{n-1})=\prod_{s \in \mathcal{I}(T)} g_{n,s} \prod_{s' \in \mathcal{L}(T)} (1-g_{n,s'}),\]

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

\[\begin{split}g_{n,s} = \begin{cases} g_{0,s}, & n=0, \\ \frac{ g_{n-1,s} \tilde{q}_{s_{\mathrm{child}}} (x_n|x^{n-1}) } { \tilde{q}_s(x_n|x^{n-1}) } & \mathrm{otherwise}, \end{cases}\end{split}\]

ここで、\(s_{\mathrm{child}}\) は、\(s_\lambda\) から \(s_{T_\mathrm{max}}(x^n)\) への経路上の \(s\) の子ノードであり

\[\begin{split}\tilde{q}_s(x_n|x^{n-1}) = \begin{cases} q_s(x_n|x^{n-1}) & s\in\mathcal{L}(T_\mathrm{max}), \\ (1-g_{n-1,s}) q_s(x_n|x^{n-1}) + g_{n-1,s} \tilde{q}_{s_{\mathrm{child}}}(x_n|x^{n-1}) & \mathrm{otherwise}. \end{cases}\end{split}\]

ただし

\[q_s(x_n|x^{n-1}) = \frac{ \beta_{n-1}(x_n|s) } {\sum_{k'=1}^{K} \beta_{n-1}(k'|s)}.\]

予測分布#

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

  • \(\boldsymbol{\theta}_\mathrm{p} = (\theta_{\mathrm{p},1}, \theta_{\mathrm{p},2}, \ldots, \theta_{\mathrm{p},K})\):予測分布のパラメータであり、 \(\theta_{\mathrm{p},k}\) は \(k\in\mathcal{X}\) の生起確率を表します。

\[p(x_n|x^{n-1}) = \theta_{\mathrm{p},x_n},\]

ここで、予測分布のパラメータの更新規則は以下の通りです。

\[\theta_{\mathrm{p}, k} = \tilde{q}_{s_\lambda}(k|x^{n-1})\]

参照

  • Matsushima, T.; and Hirasawa, S. Reducing the space complexity of a Bayes coding algorithm using an expanded context tree, 2009 IEEE International Symposium on Information Theory, 2009, pp. 719-723, https://doi.org/10.1109/ISIT.2009.5205677

  • Nakahara, Y.; Saito, S.; Kamatsuka, A.; Matsushima, T. Probability Distribution on Full Rooted Trees. Entropy 2022, 24, 328. https://doi.org/10.3390/e24030328

GitHubスターのお願い#

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

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

GitHubスター

クラス#

class bayesml.contexttree.GenModel(c_k, c_d_max=2, root=None, h_g=0.5, h_beta_vec=None, h_root=None, seed=None)#

ベースクラス: Generative

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

パラメータ:
c_kint

正の整数

c_d_maxint, オプション

正の整数(デフォルトは10)

rootcontexttree._Node, optional

文脈木の根ノードです。デフォルトでは、木は1つのノードのみで構成されます。

h_gfloat, optional

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

h_beta_vecnumpy.ndarray, optional

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

h_rootcontexttree._Node, optional

ハイパーパラメータ用の重ね合わせ木の根ノード。デフォルトは None です。

seed{None, int}, optional

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

メソッド

gen_params([tree_fix])

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

gen_sample(sample_length[, initial_values])

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

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

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

set_h_params([h_g, h_beta_vec, h_root])

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

set_params([root])

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

visualize_model([filename, format, ...])

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

get_constants()#

GenModel の定数を取得します。

返り値:
constantsdict of {str: int, numpy.ndarray}
  • "c_k":``self.c_k``の値

  • "c_d_max":``self.c_d_max``の値

set_h_params(h_g=None, h_beta_vec=None, h_root=None)#

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

パラメータ:
h_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

h_beta_vecnumpy.ndarray, optional

正の実数のベクトル。デフォルトは None です

h_rootcontexttree._Node, optional

ハイパーパラメータ用の重ね合わせ木の根ノード。デフォルトは None です。

get_h_params()#

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

返り値:
h_paramsdict of {str: float, numpy.ndarray, contexttree._Node}
  • "h_g":``self.h_g``の値

  • "h_beta_vec":``self.h_beta_vec``の値

  • "h_root":``self.h_root``の値

gen_params(tree_fix=False)#

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

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

パラメータ:
tree_fixbool

「True」の場合、木の形状は固定されます。デフォルトは「False」です。

set_params(root=None)#

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

パラメータ:
rootcontexttree._Node, optional

文脈木の根ノードです。デフォルトでは None です。

get_params()#

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

返り値:
paramsdict of {str:float}
  • "root" : self.root の値です。

gen_sample(sample_length, initial_values=None)#

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

パラメータ:
sample_lengthint

正の整数

initial_valulesnumpy ndarray, optional

「self.c_d_max」と同じサイズの1次元整数配列です。デフォルトは「None」です。その要素は [0, c_k-1] の範囲内である必要があります

返り値:
xnumpy ndarray

サイズが「sample_length」の1次元整数配列です。

save_sample(filename, sample_length, initial_values=None)#

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

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

パラメータ:
filenamestr

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

sample_lengthint

正の整数

initial_valulesnumpy ndarray, optional

「self.c_d_max」と同じサイズの1次元整数配列です。デフォルトは「None」です。その要素は [0, c_k-1] の範囲内である必要があります

visualize_model(filename=None, format=None, sample_length=10)#

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

パラメータ:
filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

sample_lengthint, オプション

正の整数(デフォルトは10)

例

>>> from bayesml import contexttree
>>> gen_model = contexttree.GenModel(c_k=2,c_d_max=3,h_g=0.75)
>>> gen_model.gen_params()
>>> gen_model.visualize_model()
[1 0 1 0 0 0 1 0 0 0]
_images/contexttree_example.png
class bayesml.contexttree.LearnModel(c_k, c_d_max=2, h0_g=0.5, h0_beta_vec=None, h0_root=None)#

ベースクラス: Posterior, PredictiveMixin

事後分布と予測分布

パラメータ:
c_kint

正の整数

c_d_maxint, オプション

正の整数(デフォルトは10)

h0_gfloat, optional

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

h0_beta_vecnumpy.ndarray, optional

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

h0_rootcontexttree._Node, optional

ハイパーパラメータ用の重ね合わせ木の根ノード。デフォルトは None です。

属性:
hn_gfloat

:math:`[0, 1]`に属する実数

hn_beta_vecnumpy.ndarray

正の実数のベクトル

hn_rootcontexttree._Node

ハイパーパラメータ用の重ね合わせ木の根ノードです

メソッド

calc_pred_dist(x)

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

estimate_params([loss, visualize, filename, ...])

与えられた基準に基づいたパラメータ推定

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

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

reset_hn_params()

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

save_h0_params(filename)

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

save_hn_params(filename)

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

set_h0_params([h0_g, h0_beta_vec, h0_root])

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

set_hn_params([hn_g, hn_beta_vec, hn_root])

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

update_posterior(x)

訓練データを使用してハイパーパラメータを更新します。

visualize_posterior([filename, format, h_params])

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

get_constants()#

LearnModel の定数を取得します。

返り値:
constantsdict of {str: int, numpy.ndarray}
  • "c_k":``self.c_k``の値

  • "c_d_max":``self.c_d_max``の値

set_h0_params(h0_g=None, h0_beta_vec=None, h0_root=None)#

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

パラメータ:
h0_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

h0_beta_vecnumpy.ndarray, optional

正の実数のベクトル。デフォルトは None です

h0_rootcontexttree._Node, optional

ハイパーパラメータ用の重ね合わせ木の根ノード。デフォルトは None です。

get_h0_params()#

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

返り値:
h0_paramsdict of {str: float, numpy.ndarray, contexttre._Node}
  • "h0_g":``self.h0_g``の値

  • "h0_beta_vec":``self.h0_beta_vec``の値

  • "h0_root":``self.h0_root``の値

set_hn_params(hn_g=None, hn_beta_vec=None, hn_root=None)#

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

パラメータ:
hn_gfloat, optional

\([0, 1]\) 内の実数。デフォルトは None です

hn_beta_vecnumpy.ndarray, optional

正の実数のベクトル。デフォルトは None です

hn_rootcontexttree._Node, optional

ハイパーパラメータ用の重ね合わせ木の根ノード。デフォルトは None です。

get_hn_params()#

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

返り値:
hn_paramsdict of {str: float, numpy.ndarray, contexttre._Node}
  • "hn_g":``self.hn_g``の値

  • "hn_beta_vec":``self.hn_beta_vec``の値

  • "hn_root":``self.hn_root``の値

update_posterior(x)#

訓練データを使用してハイパーパラメータを更新します。

パラメータ:
xnumpy ndarray

1次元の整数配列

estimate_params(loss='0-1', visualize=True, filename=None, format=None)#

与えられた基準に基づいたパラメータ推定

パラメータ:
lossstr, optional

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

visualizebool, optional

「True」の場合、推定された文脈木モデルが可視化されます。デフォルトでは「True」です。この可視化には「graphviz」が必要です。

filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

返り値:
map_rootcontexttree._Node

推定された文脈木モデルの根ノードであり、各ノードには推定されたパラメータも含まれています。

visualize_posterior(filename=None, format=None, h_params=False)#

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

この方法には「graphviz」が必要です。

パラメータ:
filenamestr, optional

図を保存する際のファイル名。デフォルトは「None」です

formatstr, optional

レンダリングの出力形式(「pdf」、 「png」など)。

h_paramsbool, optional

「True」の場合、各ノードのハイパーパラメータが表示されます。「False」の場合、各ノードの推定パラメータが表示されます。

例

>>> from bayesml import contexttree
>>> gen_model = contexttree.GenModel(c_k=2,c_d_max=3,h_g=0.75)
>>> gen_model.gen_params()
>>> x = gen_model.gen_sample(500)
>>> learn_model = contexttree.LearnModel(c_k=2,c_d_max=3,h0_g=0.75)
>>> learn_model.update_posterior(x)
>>> learn_model.visualize_posterior()
_images/contexttree_posterior.png
get_p_params()#

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

返り値:
p_paramsdict of {str: numpy.ndarray}
  • "p_theta_vec" : self.p_theta_vec の値

calc_pred_dist(x)#

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

パラメータ:
xnumpy ndarray

1次元の整数配列

make_prediction(loss='KL')#

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

パラメータ:
lossstr, optional

ベイズリスク関数の基礎となる損失関数で、デフォルトは「KL」です。この関数は「KL」と「0-1」に対応しています。

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

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

pred_and_update(x, loss='KL')#

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

パラメータ:
xnumpy.ndarray

1次元の整数配列

lossstr, optional

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

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

与えられた損失関数に基づく予測値です。