bayesml.hiddenmarkovnormal package#

モジュール内容#

このモジュールではガウス・ウィシャート事前分布およびディリクレ事前分布を用いた隠れマルコフモデルを利用できます。

_images/hiddenmarkovnormal_example.png

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

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

  • \(K \in \mathbb{N}\): 潜在クラスの数

  • \(\boldsymbol{z} \in \{ 0, 1 \}^K\): 潜在クラス(潜在変数)を表すone-hotベクトル

  • \(\boldsymbol{\pi} \in [0, 1]^K\):潜在クラスのパラメータ(\(\sum_{k=1}^K \pi_k=1\))

  • \(a_{j,k} \in [0,1]\) : 潜在状態 j における潜在状態 k への遷移確率

  • \(\boldsymbol{a}_j = [a_{j,1}, a_{j,2}, \dots , a_{j,K}]\in [0,1]^K\)、遷移確率のベクトル(\(\sum_{k=1}^K a_{j,k}=1\))

  • \(\boldsymbol{A}=(a_{j,k})_{1\leq j,k\leq K} \in [0, 1]^{K\times K}\): 遷移確率行列

  • \(D \in \mathbb{N}\): データの次元

  • \(\boldsymbol{x} \in \mathbb{R}^D\): データ点

  • \(\boldsymbol{\mu}_k \in \mathbb{R}^D\): パラメータ

  • \(\boldsymbol{\mu} = \{ \boldsymbol{\mu}_k \}_{k=1}^K\)

  • \(\boldsymbol{\Lambda}_k \in \mathbb{R}^{D\times D}\) : パラメータ(正定値行列)

  • \(\boldsymbol{\Lambda} = \{ \boldsymbol{\Lambda}_k \}_{k=1}^K\)

  • \(| \boldsymbol{\Lambda}_k | \in \mathbb{R}\): \(\boldsymbol{\Lambda}_k\) の行列式

\[\begin{split}p(\boldsymbol{z}_{1} | \boldsymbol{\pi}) &= \mathrm{Cat}(\boldsymbol{z}_{1}|\boldsymbol{\pi}) = \prod_{k=1}^K \pi_k^{z_{1,k}},\\ p(\boldsymbol{z}_{n} |\boldsymbol{z}_{n-1} ,\boldsymbol{A}) &= \prod_{k=1}^K \prod_{j=1}^K a_{j,k}^{z_{n-1,j}z_{n,k}},\\ p(\boldsymbol{x}_{n} | \boldsymbol{\mu}, \boldsymbol{\Lambda}, \boldsymbol{z}_{n}) &= \prod_{k=1}^K \mathcal{N}(\boldsymbol{x}|\boldsymbol{\mu}_k,\boldsymbol{\Lambda}_k^{-1})^{z_{n,k}} \\ &= \prod_{k=1}^K \left( \frac{| \boldsymbol{\Lambda}_{k} |^{1/2}}{(2\pi)^{D/2}} \exp \left\{ -\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu}_{k})^\top \boldsymbol{\Lambda}_{k} (\boldsymbol{x}-\boldsymbol{\mu}_{k}) \right\} \right)^{z_{n,k}},\end{split}\]

事前分布#

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

  • \(\boldsymbol{m}_0 \in \mathbb{R}^{D}\): ハイパーパラメータ

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

  • \(\nu_0 \in \mathbb{R}\): ハイパーパラメータ(\(\nu_0 > D-1\))

  • \(\boldsymbol{W}_0 \in \mathbb{R}^{D\times D}\): ハイパーパラメータ(正定値行列)

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

  • \(\boldsymbol{\zeta}_{0,j} \in \mathbb{R}_{> 0}^K\): ハイパーパラメータ

  • \(\mathrm{Tr} \{ \cdot \}\): 行列のトレース

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

\[\begin{split}p(\boldsymbol{\mu},\boldsymbol{\Lambda},\boldsymbol{\pi},\boldsymbol{A}) &= \left\{ \prod_{k=1}^K \mathcal{N}(\boldsymbol{\mu}_k|\boldsymbol{m}_0,(\kappa_0 \boldsymbol{\Lambda}_k)^{-1})\mathcal{W}(\boldsymbol{\Lambda}_k|\boldsymbol{W}_0, \nu_0) \right\} \mathrm{Dir}(\boldsymbol{\pi}|\boldsymbol{\eta}_0) \prod_{j=1}^{K}\mathrm{Dir}(\boldsymbol{a}_{j}|\boldsymbol{\zeta}_{0,j}), \\ &= \Biggl[ \prod_{k=1}^K \left( \frac{\kappa_0}{2\pi} \right)^{D/2} |\boldsymbol{\Lambda}_k|^{1/2} \exp \left\{ -\frac{\kappa_0}{2}(\boldsymbol{\mu}_k -\boldsymbol{m}_0)^\top \boldsymbol{\Lambda}_k (\boldsymbol{\mu}_k - \boldsymbol{m}_0) \right\} \\ &\qquad \times B(\boldsymbol{W}_0, \nu_0) | \boldsymbol{\Lambda}_k |^{(\nu_0 - D - 1) / 2} \exp \left\{ -\frac{1}{2} \mathrm{Tr} \{ \boldsymbol{W}_0^{-1} \boldsymbol{\Lambda}_k \} \right\}\biggl] \\ &\qquad \times \Biggl[ \prod_{k=1}^KC(\boldsymbol{\eta}_0)\pi_k^{\eta_{0,k}-1}\biggl]\\ &\qquad \times \biggl[\prod_{j=1}^KC(\boldsymbol{\zeta}_{0,j})\prod_{k=1}^K a_{j,k}^{\zeta_{0,j,k}-1}\Biggr],\\\end{split}\]

ここで、\(B(\boldsymbol{W}_0, \nu_0)\) および \(C(\boldsymbol{\eta}_0)\) は次のように定義されます:

\[\begin{split}B(\boldsymbol{W}_0, \nu_0) &= | \boldsymbol{W}_0 |^{-\nu_0 / 2} \left( 2^{\nu_0 D / 2} \pi^{D(D-1)/4} \prod_{i=1}^D \Gamma \left( \frac{\nu_0 + 1 - i}{2} \right) \right)^{-1}, \\ C(\boldsymbol{\eta}_0) &= \frac{\Gamma(\sum_{k=1}^K \eta_{0,k})}{\Gamma(\eta_{0,1})\cdots\Gamma(\eta_{0,K})},\\ C(\boldsymbol{\zeta}_{0,j}) &= \frac{\Gamma(\sum_{k=1}^K \zeta_{0,j,k})}{\Gamma(\zeta_{0,j,1})\cdots\Gamma(\zeta_{0,j,K})}. \end{split}\]

事後分布#

変分ベイズ法の \(t\) 回目の反復における近似事後分布は、以下の通りです:

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

  • \(\boldsymbol{z}^n = (\boldsymbol{z}_1, \boldsymbol{z}_2, \dots , \boldsymbol{z}_n) \in \{ 0, 1 \}^{K \times n}\): 与えられたデータの潜在クラス

  • \(\boldsymbol{m}_{n,k}^{(t)} \in \mathbb{R}^{D}\): ハイパーパラメータ

  • \(\kappa_{n,k}^{(t)} \in \mathbb{R}_{>0}\): ハイパーパラメータ

  • \(\nu_{n,k}^{(t)} \in \mathbb{R}\): ハイパーパラメータ \((\nu_n > D-1)\)

  • \(\boldsymbol{W}_{n,k}^{(t)} \in \mathbb{R}^{D\times D}\): ハイパーパラメータ(正定値行列)

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

  • \(\boldsymbol{\zeta}_{n,j}^{(t)} \in \mathbb{R}_{> 0}^K\): ハイパーパラメータ

\[\begin{split}&q(\boldsymbol{z}^n, \boldsymbol{\mu},\boldsymbol{\Lambda},\boldsymbol{\pi},\boldsymbol{A}) \nonumber \\ &= q^{(t)}(\boldsymbol{z}^n) \left\{ \prod_{k=1}^K \mathcal{N}(\boldsymbol{\mu}_k|\boldsymbol{m}_{n,k}^{(t)},(\kappa_{n,k}^{(t)} \boldsymbol{\Lambda}_k)^{-1})\mathcal{W}(\boldsymbol{\Lambda}_k|\boldsymbol{W}_{n,k}^{(t)}, \nu_{n,k}^{(t)}) \right\} \mathrm{Dir}(\boldsymbol{\pi}|\boldsymbol{\eta}_n^{(t)})\left\{\prod_{j=1}^K\mathrm{Dir}(\boldsymbol{a}_j|\boldsymbol{\zeta}_{n,j}^{(t)})\right\}, \\ &= q^{(t)}(\boldsymbol{z}^n) \Biggl[ \prod_{k=1}^K \left( \frac{\kappa_{n,k}^{(t)}}{2\pi} \right)^{D/2} |\boldsymbol{\Lambda}_k|^{1/2} \exp \left\{ -\frac{\kappa_{n,k}^{(t)}}{2}(\boldsymbol{\mu}_k -\boldsymbol{m}_{n,k}^{(t)})^\top \boldsymbol{\Lambda}_k (\boldsymbol{\mu}_k - \boldsymbol{m}_{n,k}^{(t)}) \right\} \\ &\qquad \times B(\boldsymbol{W}_{n,k}^{(t)}, \nu_{n,k}^{(t)}) | \boldsymbol{\Lambda}_k |^{(\nu_{n,k}^{(t)} - D - 1) / 2} \exp \left\{ -\frac{1}{2} \mathrm{Tr} \{ ( \boldsymbol{W}_{n,k}^{(t)} )^{-1} \boldsymbol{\Lambda}_k \} \right\} \Biggr] \\ &\qquad \times C(\boldsymbol{\eta}_n^{(t)})\prod_{k=1}^K \pi_k^{\eta_{n,k}^{(t)}-1}\left[\prod_{j=1}^K C(\boldsymbol{\zeta}_{n,j}^{(t)})\prod_{k=1}^K a_{j,k}^{\zeta_{n,j,k}^{(t)}-1}\right],\\\end{split}\]

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

\[\begin{split}N_k^{(t)} &= \sum_{i=1}^n \gamma^{(t)}_{i,k}, \\ M_{j,k}^{(t)} &= \sum_{i=2}^n \xi^{(t)}_{i,j,k},\\ \bar{\boldsymbol{x}}_k^{(t)} &= \frac{1}{N_k^{(t)}} \sum_{i=1}^n \gamma^{(t)}_{i,k} \boldsymbol{x}_i, \\ S_k^{(t)} &= \frac{1}{N_k^{(t)}}\sum_{i=1}^n \gamma^{(t)}_{i,k} (x_i-\bar{\boldsymbol{x}}_k^{(t)})(x_i-\bar{\boldsymbol{x}}_k^{(t)})^{\top},\\ \boldsymbol{m}_{n,k}^{(t+1)} &= \frac{\kappa_0\boldsymbol{\mu}_0 + N_k^{(t)} \bar{\boldsymbol{x}}_k^{(t)}}{\kappa_0 + N_k^{(t)}}, \\ \kappa_{n,k}^{(t+1)} &= \kappa_0 + N_k^{(t)}, \\ (\boldsymbol{W}_{n,k}^{(t+1)})^{-1} &= \boldsymbol{W}_0^{-1} + N_k^{(t)}S_k^{(t)} + \frac{\kappa_0 N_k^{(t)}}{\kappa_0 + N_k^{(t)}}(\bar{\boldsymbol{x}}_k^{(t)}-\boldsymbol{\mu}_0)(\bar{\boldsymbol{x}}_k^{(t)}-\boldsymbol{\mu}_0)^\top, \\ \nu_{n,k}^{(t+1)} &= \nu_0 + N_k^{(t)},\\ \eta_{n,k}^{(t+1)} &= \eta_{0,k} + \gamma^{(t)}_{1,k}, \\ \zeta_{n,j,k}^{(t+1)} &= \zeta_{0,j,k}+M_{j,k}^{(t)}.\end{split}\]

潜在変数 \(q^{(t+1)}(z^n)\) の近似事後分布は、フォワード・バックワードアルゴリズムによって次のように計算されます。

\[\begin{split}\ln \rho_{i,k}^{(t+1)} &= \frac{1}{2} \Biggl[\, \sum_{d=1}^D \psi \left( \frac{\nu_{n,k}^{(t+1)} + 1 - d}{2} \right) + D \ln 2 + \ln | \boldsymbol{W}_{n,k}^{(t+1)} | \notag \\ &\qquad - D \ln (2 \pi ) - \frac{D}{\kappa_{n,k}^{(t+1)}} - \nu_{n,k}^{(t+1)} (\boldsymbol{x}_i - \boldsymbol{m}_{n,k}^{(t+1)})^\top \boldsymbol{W}_{n,k}^{(t+1)} (\boldsymbol{x}_i - \boldsymbol{m}_{n,k}^{(t+1)}) \Biggr], \\ \ln \tilde{\pi}_k^{(t+1)} &= \psi (\eta_{n,k}^{(t+1)}) - \psi \left( \textstyle \sum_{k=1}^K \eta_{n,k}^{(t+1)} \right) \\ \ln \tilde{a}_{j,k}^{(t+1)} &= \psi (\zeta_{n,j,k}^{(t+1)}) - \psi \left( \textstyle \sum_{k=1}^K \zeta_{n,j,k}^{(t+1)} \right) \\ \alpha^{(t+1)} (\boldsymbol{z}_i) &\propto \begin{cases} \prod_{k=1}^{K} \left( \rho_{i,k}^{(t+1)}\right)^{z_{i,k}} \sum_{\boldsymbol{z}_{i-1}} \left[\prod_{k=1}^{K}\prod_{j=1}^{K}\left(\tilde{a}^{(t+1)}_{j,k}\right)^{z_{i-1,j}z_{i,k}}\alpha^{(t+1)}(\boldsymbol{z}_{i-1})\right] & (i>1)\\ \prod_{k=1}^{K}\left( \rho_{1,k}^{(t+1)} \tilde{\pi}_k^{(t+1)} \right)^{z_{1,k}} & (i=1) \end{cases} \\ \beta^{(t+1)} (\boldsymbol{z}_i) &\propto \begin{cases} \sum_{\boldsymbol{z}_{i+1}} \left[ \prod_{k=1}^{K} \left( \rho_{i+1,k}^{(t+1)}\right)^{z_{i+1,k}} \prod_{k=1}^{K}\prod_{j=1}^{K}\left(\tilde{a}^{(t+1)}_{j,k}\right)^{z_{i,j}z_{i+1,k}}\beta^{(t+1)}(\boldsymbol{z}_{i+1})\right] & (i<n)\\ 1 & (i=n) \end{cases} \\ q^{(t+1)}(\boldsymbol{z}_i) &\propto \alpha^{(t+1)}(\boldsymbol{z}_i)\beta^{(t+1)}(\boldsymbol{z}_i) \\ \gamma^{(t+1)}_{i,k} &= \sum_{\boldsymbol{z}_i} q^{(t+1)}(\boldsymbol{z}_i) z_{i,k}\\ q^{(t+1)}(\boldsymbol{z}_{i-1}, \boldsymbol{z}_{i}) &\propto \alpha^{(t+1)}(\boldsymbol{z}_{i-1}) \prod_{k=1}^{K} \left( \rho_{i,k}^{(t+1)}\right)^{z_{i,k}} \prod_{k=1}^{K}\prod_{j=1}^{K}\left(\tilde{a}^{(t+1)}_{j,k}\right)^{z_{i-1,j}z_{i,k}} \beta^{(t+1)}(\boldsymbol{z}_i) \\ \xi^{(t+1)}_{i,j,k} &= \sum_{\boldsymbol{z}_{i-1}} \sum_{\boldsymbol{z}_i} q^{(t+1)}(\boldsymbol{z}_{i-1}, \boldsymbol{z}_{i}) z_{i-1,j} z_{i,k}\end{split}\]

予測分布#

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

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

  • \((a_{\mathrm{p},j,k})_{1\leq j,k\leq K} \in [0, 1]^{K\times K}\): 潜在クラスの予測遷移確率のパラメータです(\(\sum_{k=1}^K a_{\mathrm{p},j,k}=1\))。

  • \(\boldsymbol{\mu}_{\mathrm{p},k} \in \mathbb{R}^D\): 予測分布のパラメータ

  • \(\boldsymbol{\Lambda}_{\mathrm{p},k} \in \mathbb{R}^{D \times D}\): 予測分布のパラメータ(正定値行列)

  • \(\nu_{\mathrm{p},k} \in \mathbb{R}_{>0}\): 予測分布のパラメータ

\[\begin{split}&p(x_{n+1}|x^n) \\ &\approx \sum_{k=1}^K \left( \sum_{j=1}^K \gamma_{n,j}^{(t)} a_{\mathrm{p},j,k} \right) \mathrm{St}(x_{n+1}|\boldsymbol{\mu}_{\mathrm{p},k},\boldsymbol{\Lambda}_{\mathrm{p},k}, \nu_{\mathrm{p},k}) \\ &= \sum_{k=1}^K \left( \sum_{j=1}^K \gamma_{n,j}^{(t)} a_{\mathrm{p},j,k} \right)\Biggl[ \frac{\Gamma (\nu_{\mathrm{p},k} / 2 + D / 2)}{\Gamma (\nu_{\mathrm{p},k} / 2)} \frac{|\boldsymbol{\Lambda}_{\mathrm{p},k}|^{1/2}}{(\nu_{\mathrm{p},k} \pi)^{D/2}} \nonumber \\ &\qquad \qquad \qquad \qquad \qquad \times \left( 1 + \frac{1}{\nu_{\mathrm{p},k}} (\boldsymbol{x}_{n+1} - \boldsymbol{\mu}_{\mathrm{p},k})^\top \boldsymbol{\Lambda}_{\mathrm{p},k} (\boldsymbol{x}_{n+1} - \boldsymbol{\mu}_{\mathrm{p},k}) \right)^{-\nu_{\mathrm{p},k}/2 - D/2} \Biggr],\end{split}\]

ここで、パラメータは予測分布のハイパーパラメータから次のように求められます:

\[\begin{split}a_{\mathrm{p},j,k} &= \frac{\zeta_{n,j,k}^{(t)}}{\sum_{k=1}^K \zeta_{n,j,k}^{(t)}}, \\ \boldsymbol{\mu}_{\mathrm{p},k} &= \boldsymbol{m}_{n,k}^{(t)}, \\ \boldsymbol{\Lambda}_{\mathrm{p},k} &= \frac{\kappa_{n,k}^{(t)} (\nu_{n,k}^{(t)} - D + 1)}{\kappa_{n,k}^{(t)} + 1} \boldsymbol{W}_{n,k}^{(t)}, \\ \nu_{\mathrm{p},k} &= \nu_{n,k}^{(t)} - D + 1.\end{split}\]

GitHubスターのお願い#

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

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

GitHubスター

クラス#

class bayesml.hiddenmarkovnormal.GenModel(c_num_classes, c_degree, *, pi_vec=None, a_mat=None, mu_vecs=None, lambda_mats=None, h_eta_vec=None, h_zeta_vecs=None, h_m_vecs=None, h_kappas=None, h_nus=None, h_w_mats=None, seed=None)#

ベースクラス: Generative

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

パラメータ:
c_num_classesint

正の整数

c_degreeint

正の整数

pi_vecnumpy.ndarray, optional

\([0, 1]\) の実数のベクトルで、デフォルトでは [1/c_num_classes, 1/c_num_classes, ..., 1/c_num_classes] となります。その要素の和は 1.0 でなければなりません。

a_matnumpy.ndarray, optional

実数の行列で、範囲は \([0, 1]\) です。デフォルトでは、[1/c_num_classes, 1/c_num_classes, ..., 1/c_num_classes] を積み重ねて得られる行列となります。各行ベクトルの要素の和は 1.0 でなければなりません。単一のベクトルが入力された場合、ブロードキャストされます。

mu_vecsnumpy.ndarray, optional

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

lambda_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列です。単一の行列が入力された場合、ブロードキャスト処理が行われます。

h_eta_vecnumpy.ndarray, optional

正の実数のベクトル。デフォルトでは [1/2, 1/2, ..., 1/2] です。

h_zeta_vecsnumpy.ndarray, optional

正の数のベクトル。デフォルトでは、要素がすべて 1/2 であるベクトルです。単一のベクトルが入力された場合、ブロードキャストされます。

h_m_vecsnumpy.ndarray, optional

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

h_kappasfloat or numpy.ndarray, optional

正の実数。デフォルトでは [1.0, 1.0, ..., 1.0] です。単一の実数が入力された場合、それはブロードキャストされます。

h_nusfloat or numpy.ndarray, optional

「c_degree-1」より大きい実数。デフォルトでは [c_degree, c_degree, ..., c_degree] です。単一の実数が入力された場合、ブロードキャストされます。

h_w_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列です。単一の行列が入力された場合、ブロードキャスト処理が行われます。

seed{None, int}, optional

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

メソッド

gen_params()

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

gen_sample(sample_length)

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

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_eta_vec, h_zeta_vecs, ...])

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

set_params([pi_vec, a_mat, mu_vecs, lambda_mats])

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

visualize_model([sample_length])

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

get_constants()#

GenModel の定数を取得します。

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

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

set_params(pi_vec=None, a_mat=None, mu_vecs=None, lambda_mats=None)#

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

パラメータ:
pi_vecnumpy.ndarray, optional

\([0, 1]\) の実数のベクトルで、デフォルトでは [1/c_num_classes, 1/c_num_classes, ..., 1/c_num_classes] となります。その要素の和は 1.0 でなければなりません。

a_matnumpy.ndarray, optional

実数の行列で、範囲は \([0, 1]\) です。デフォルトでは、[1/c_num_classes, 1/c_num_classes, ..., 1/c_num_classes] を積み重ねて得られる行列となります。各行ベクトルの要素の和は 1.0 でなければなりません。単一のベクトルが入力された場合、ブロードキャストされます。

mu_vecsnumpy.ndarray, optional

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

lambda_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列です。単一の行列が入力された場合、ブロードキャスト処理が行われます。

set_h_params(h_eta_vec=None, h_zeta_vecs=None, h_m_vecs=None, h_kappas=None, h_nus=None, h_w_mats=None)#

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

パラメータ:
h_eta_vecnumpy.ndarray, optional

正の実数のベクトル。デフォルトでは [1/2, 1/2, ..., 1/2] です。

h_zeta_vecsnumpy.ndarray, optional

正の数のベクトル。デフォルトでは、要素がすべて 1/2 であるベクトルです。単一のベクトルが入力された場合、ブロードキャストされます。

h_m_vecsnumpy.ndarray, optional

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

h_kappasfloat or numpy.ndarray, optional

正の実数。デフォルトでは [1.0, 1.0, ..., 1.0] です。単一の実数が入力された場合、それはブロードキャストされます。

h_nusfloat or numpy.ndarray, optional

「c_degree-1」より大きい実数。デフォルトでは [c_degree, c_degree, ..., c_degree] です。単一の実数が入力された場合、ブロードキャストされます。

h_w_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列です。単一の行列が入力された場合、ブロードキャスト処理が行われます。

get_params()#

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

返り値:
params{str:float, numpy.ndarray}
  • "pi_vec" : self.pi_vec の値

  • "a_mat" : self.a_mat の値

  • "mu_vecs" : self.mu_vecs の値

  • "lambda_mats" : self.lambda_mats の値

get_h_params()#

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

返り値:
h_params{str:float, np.ndarray}
  • "h_eta_vec" : self.h_eta_vec の値

  • "h_zeta_vecs" : self.h_zeta_vecs の値

  • "h_m_vecs" : self.h_m_vecs の値

  • "h_kappas" : self.h_kappas の値

  • "h_nus" : self.h_nus の値

  • "h_w_mats" : self.h_w_mats の値

gen_params()#

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

生成された値を確認するには、self.get_params() を使用してください。

gen_sample(sample_length)#

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

パラメータ:
sample_lengthint

正の整数

返り値:
xnumpy ndarray

形状が (sample_length,c_degree) である2次元配列です。その要素は実数です。

znumpy ndarray

形状が (sample_length,c_num_classes) で、各行がone-hotベクトルからなる2次元配列です。

save_sample(filename, sample_length)#

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

キーワード「x」、「z」を指定して、NpzFileとして保存されます。

パラメータ:
filenamestr

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

sample_lengthint

正の整数

visualize_model(sample_length=200)#

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

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

正の整数、デフォルトは100

例

>>> from bayesml import hiddenmarkovnormal
>>> import numpy as np
>>> model = hiddenmarkovnormal.GenModel(
        c_num_classes=2,
        c_degree=1,
        mu_vecs=np.array([[5],[-5]]),
        a_mat=np.array([[0.95,0.05],[0.1,0.9]]))
>>> model.visualize_model()
pi_vec:
[0.5 0.5]
a_mat:
[[0.95 0.05]
[0.1  0.9 ]]
mu_vecs:
[[ 5.]
[-5.]]
lambda_mats:
[[[1.]]
[[1.]]]
_images/hiddenmarkovnormal_example.png
class bayesml.hiddenmarkovnormal.LearnModel(c_num_classes, c_degree, *, h0_eta_vec=None, h0_zeta_vecs=None, h0_m_vecs=None, h0_kappas=None, h0_nus=None, h0_w_mats=None, seed=None)#

ベースクラス: Posterior, PredictiveMixin

事後分布と予測分布

パラメータ:
c_num_classesint

正の整数。

c_degreeint

正の整数。

h0_eta_vecnumpy.ndarray, optional

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

h0_zeta_vecsnumpy.ndarray, optional

正の数のベクトル。デフォルトでは、すべての要素が 1.0 であるベクトルです。実数または単一のベクトルが入力された場合、ブロードキャスト処理が行われます。

h0_m_vecsnumpy.ndarray, optional

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

h0_kappasfloat or numpy.ndarray, optional

正の実数。デフォルトでは [1.0, 1.0, ..., 1.0] です。単一の実数が入力された場合、ブロードキャストされます。

h0_nusfloat or numpy.ndarray, optional

c_degree-1 より大きい実数(デフォルトは c_degree)。単一の実数が入力された場合、ブロードキャストされます。

h0_w_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列となります。単一の行列が入力された場合、ブロードキャスト処理が行われます。

seed{None, int}, optional

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

属性:
h0_w_mats_invnumpy.ndarray

h0_w_mats の逆行列

hn_eta_vecnumpy.ndarray

正の実数のベクトル

hn_zeta_vecsnumpy.ndarray

正の数のベクトル

hn_m_vecsnumpy.ndarray

実数のベクトル

hn_kappasnumpy.ndarray

正の実数

hn_nusnumpy.ndarray

c_degree-1 より大きい実数

hn_w_matsnumpy.ndarray

正定値対称行列

hn_w_mats_invnumpy.ndarray

hn_w_mats の逆行列

vlfloat

実数

p_mu_vecsnumpy.ndarray

実数のベクトル

p_nusnumpy.ndarray

正の実数

p_lambda_matsnumpy.ndarray

正定値対称行列

メソッド

calc_pred_dist()

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

estimate_latent_vars(x[, loss, viterbi])

指定された基準に基づいて潜在変数を推定します。

estimate_latent_vars_and_update(x[, loss, ...])

潜在変数を推定し、事後分布を逐次的に更新します。

estimate_params([loss])

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

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

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

reset_hn_params()

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

save_h0_params(filename)

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

save_hn_params(filename)

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

set_h0_params([h0_eta_vec, h0_zeta_vecs, ...])

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

set_hn_params([hn_eta_vec, hn_zeta_vecs, ...])

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

update_posterior(x[, max_itr, num_init, ...])

訓練データを用いて事後分布を更新します。

visualize_posterior()

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

get_constants()#

LearnModel の定数を取得します。

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

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

set_h0_params(h0_eta_vec=None, h0_zeta_vecs=None, h0_m_vecs=None, h0_kappas=None, h0_nus=None, h0_w_mats=None)#

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

パラメータ:
h0_eta_vecnumpy.ndarray, optional

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

h0_zeta_vecsnumpy.ndarray, optional

正の数のベクトル。デフォルトでは、すべての要素が 1.0 であるベクトルです。実数または単一のベクトルが入力された場合、ブロードキャスト処理が行われます。

h0_m_vecsnumpy.ndarray, optional

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

h0_kappasfloat or numpy.ndarray, optional

正の実数。デフォルトでは [1.0, 1.0, ..., 1.0] です。単一の実数が入力された場合、ブロードキャストされます。

h0_nusfloat or numpy.ndarray, optional

c_degree-1 より大きい実数(デフォルトは c_degree)。単一の実数が入力された場合、ブロードキャストされます。

h0_w_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列となります。単一の行列が入力された場合、ブロードキャスト処理が行われます。

get_h0_params()#

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

返り値:
h0_paramsdict of {str: numpy.ndarray}
  • "h0_eta_vec":``self.h0_eta_vec``の値

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

  • "h0_m_vecs" : self.h0_m_vecs の値

  • "h0_kappas" : self.h0_kappas の値

  • "h0_nus" : self.h0_nus の値

  • "h0_w_mats" : self.h0_w_mats の値

set_hn_params(hn_eta_vec=None, hn_zeta_vecs=None, hn_m_vecs=None, hn_kappas=None, hn_nus=None, hn_w_mats=None)#

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

パラメータ:
hn_eta_vecnumpy.ndarray, optional

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

hn_zeta_vecsnumpy.ndarray, optional

正の数のベクトル。デフォルトでは、すべての要素が 1.0 であるベクトルです。実数または単一のベクトルが入力された場合、ブロードキャスト処理が行われます。

hn_m_vecsnumpy.ndarray, optional

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

hn_kappasfloat or numpy.ndarray, optional

正の実数。デフォルトでは [1.0, 1.0, ..., 1.0] です。単一の実数が入力された場合、ブロードキャストされます。

hn_nusfloat or numpy.ndarray, optional

c_degree-1 より大きい実数(デフォルトは c_degree)。単一の実数が入力された場合、ブロードキャストされます。

hn_w_matsnumpy.ndarray, optional

正定値対称行列。デフォルトでは単位行列となります。単一の行列が入力された場合、ブロードキャスト処理が行われます。

get_hn_params()#

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

返り値:
hn_paramsdict of {str: numpy.ndarray}
  • "hn_eta_vec":``self.hn_eta_vec``の値

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

  • "hn_m_vecs" : self.hn_m_vecs の値

  • "hn_kappas" : self.hn_kappas の値

  • "hn_nus" : self.hn_nus の値

  • "hn_w_mats" : self.hn_w_mats の値

update_posterior(x, max_itr=100, num_init=10, tolerance=1.0E-8, init_type='subsampling')#

訓練データを用いて事後分布を更新します。

パラメータ:
xnumpy.ndarray

(sample_length, c_degree) 次元の ndarray です。すべての要素は実数でなければなりません。

max_itrint, オプション

反復回数の最大値(デフォルトは100)

num_initint, オプション

初期化の回数(デフォルトは10)

tolerancefloat, optional

変分下界の収束基準。デフォルトは 1.0E-8 です

init_typestr, optional
  • 'サブサンプリング':各潜在クラスについて、サイズが int(np.sqrt(x.shape[0])) となる部分サンプルを抽出します。そして、その平均と共分散行列を hn_m_vecs および hn_lambda_mats の初期値として使用します。

  • 'random_responsibility': gamma_vecs に負担率をランダムに割り当てます

初期化の種類。デフォルトは 'subsampling' です

estimate_params(loss='squared')#

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

この基準は、pi_vec、a_mat、mu_vecs、および``lambda_mats``の推定にそれぞれ個別に適用される点にご注意ください。したがって、loss="KL" を指定した場合、ディリクレ分布、スチューデントのt分布、およびウィシャートの分布のタプルが返されます。

パラメータ:
lossstr, optional

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

返り値:
Estimatestuple of {numpy ndarray, float, None, or rv_frozen}
  • pi_vec_hat:pi_vec の推定値

  • a_mat_hat:a_mat の推定値

  • mu_vecs_hat:mu_vecs の推定値

  • lambda_mats_hat:lambda_mats の推定値

指定された損失関数に基づく推定値です。存在しない場合は、`np.nan`が返されます。損失関数が「KL」の場合、事後分布そのものがscipy.statsのrv_frozenオブジェクトとして返されます。

visualize_posterior()#

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

例

>>> from bayesml import hiddenmarkovnormal
>>> gen_model = hiddenmarkovnormal.GenModel(
>>>     c_num_classes=2,
>>>     c_degree=1,
>>>     mu_vecs=np.array([[2],[-2]]),
>>>     a_mat=np.array([[0.95,0.05],[0.1,0.9]])
>>> x,z = gen_model.gen_sample(100)
>>> learn_model = hiddenmarkovnormal.LearnModel(c_num_classes=2, c_degree=1)
>>> learn_model.update_posterior(x)
>>> learn_model.visualize_posterior()
hn_alpha_vec:
[153.65657765  47.34342235]
E[pi_vec]:
[0.76446059 0.23553941]
hn_zeta_vecs:
[[147.64209251   5.51848792]
[  5.51448518  42.3249344 ]]
E[a_mat]
[[0.96396927 0.03603073]
[0.11527074 0.88472926]]
hn_m_vecs (equivalent to E[mu_vecs]):
[[ 1.99456861]
[-2.15581846]]
hn_kappas:
[154.15657765  47.84342235]
hn_nus:
[154.15657765  47.84342235]
hn_w_mats:
[[[0.00525177]]
[[0.02569298]]]
E[lambda_mats]=
[[[0.8095951 ]]
[[1.22924015]]]
_images/hiddenmarkovnormal_posterior.png
get_p_params()#

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

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

  • "p_mu_vecs" : self.p_mu_vecs の値

  • "p_nus" : self.p_nus の値

  • "p_lambda_mats" : self.p_lambda_mats の値

calc_pred_dist()#

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

make_prediction(loss='squared')#

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

パラメータ:
lossstr, optional

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

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

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

pred_and_update(x, loss='squared', max_itr=100, num_init=10, tolerance=1.0E-8, init_type='random_responsibility')#

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

h0_params は、x によって hn_params を更新する前に、現在の hn_params で上書きされます

パラメータ:
xnumpy.ndarray

それはc次元のベクトルでなければなりません

lossstr, optional

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

max_itrint, オプション

反復回数の最大値(デフォルトは100)

num_initint, オプション

初期化の回数(デフォルトは10)

tolerancefloat, optional

変分下限の収束基準。デフォルトは 1.0E-8 です

init_typestr, optional
  • 'random_responsibility': xi_mats と gamma_vecs に負担率をランダムに割り当てます

  • 'サブサンプリング':各潜在クラスについて、サイズが int(np.sqrt(x.shape[0])) となる部分サンプルを抽出します。そして、その平均と共分散行列を hn_m_vecs および hn_lambda_mats の初期値として使用します。

初期化の種類。デフォルトは 'random_responsibility' です

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

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

estimate_latent_vars(x, loss='0-1', viterbi=True)#

指定された基準に基づいて潜在変数を推定します。

「viterbi」オプションが「True」の場合、この関数は、同時分布を最大化する潜在変数を推定します。「False」の場合、この関数は各時点において潜在変数を個別に推定します。

パラメータ:
xnumpy.ndarray

(sample_length, c_degree) 次元の ndarray です。すべての要素は実数でなければなりません。

lossstr, optional

ベイズリスク関数の基礎となる損失関数で、デフォルトは「0-1」です。viterbi オプションが True の場合、この関数は「0-1」のみをサポートします。それ以外の場合は、「0-1」、「squared」、および「KL」がサポートされます。

viterbibool, optional

「True」の場合、この関数は潜在変数をシーケンスとして推定します。

返り値:
estimatesnumpy.ndarray

指定された損失関数に基づく推定値です。viterbi オプションが False で、損失関数が "KL" の場合、各潜在変数の出現確率からなる要素を持つ numpy.ndarray として、周辺化された事後分布が返されます。

estimate_latent_vars_and_update(x, loss='0-1', viterbi=True, max_itr=100, num_init=10, tolerance=1.0E-8, init_type='subsampling')#

潜在変数を推定し、事後分布を逐次的に更新します。

h0_params は、x によって hn_params を更新する前に、現在の hn_params で上書きされます

パラメータ:
xnumpy.ndarray

それはc次元のベクトルでなければなりません

lossstr, optional

ベイズリスク関数の基礎となる損失関数で、デフォルトは「0-1」です。viterbi オプションが True の場合、この関数は「0-1」のみをサポートします。それ以外の場合は、「0-1」、「squared」、および「KL」がサポートされます。

viterbibool, optional

「True」の場合、この関数は潜在変数をシーケンスとして推定します。

max_itrint, オプション

反復回数の最大値(デフォルトは100)

num_initint, オプション

初期化の回数(デフォルトは10)

tolerancefloat, optional

変分下限の収束基準。デフォルトは 1.0E-8 です

init_typestr, optional
  • 'random_responsibility': xi_mats と gamma_vecs に負担率をランダムに割り当てます

  • 'サブサンプリング':各潜在クラスについて、サイズが int(np.sqrt(x.shape[0])) となる部分サンプルを抽出します。そして、その平均と共分散行列を hn_m_vecs および hn_lambda_mats の初期値として使用します。

初期化の種類。デフォルトは 'random_responsibility' です

返り値:
estimatesnumpy.ndarray

指定された損失関数に基づく推定値です。viterbi オプションが False で、損失関数が "KL" の場合、各潜在変数の出現確率からなる要素を持つ numpy.ndarray として、周辺化された事後分布が返されます。