Skip to content

Release 0.2.5 #81

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
Nov 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ Plain text

```
Y. Nakahara, N. Ichijo, K. Shimada, Y. Iikubo,
S. Saito, K. Kazama, T. Matsushima, BayesML Developers, ``BayesML 0.2.4,''
S. Saito, K. Kazama, T. Matsushima, BayesML Developers, ``BayesML 0.2.5,''
[Online] https://github.com/yuta-nakahara/BayesML
```

Expand All @@ -148,7 +148,7 @@ BibTeX
author = {Nakahara, Yuta and Ichijo, Naoki and Shimada, Koshi and
Iikubo, Yuji and Saito, Shota and Kazama, Koki and
Matsushima, Toshiyasu and {BayesML Developers}},
title = {BayesML 0.2.4},
title = {BayesML 0.2.5},
howpublished = {\url{https://github.com/yuta-nakahara/BayesML}},
year = {2022}
}
Expand Down
4 changes: 2 additions & 2 deletions README_jp.md
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ BayesMLへのコントリビューションを考えてくださってありが

```
Y. Nakahara, N. Ichijo, K. Shimada, Y. Iikubo,
S. Saito, K. Kazama, T. Matsushima, BayesML Developers, ``BayesML 0.2.4,''
S. Saito, K. Kazama, T. Matsushima, BayesML Developers, ``BayesML 0.2.5,''
[Online] https://github.com/yuta-nakahara/BayesML
```

Expand All @@ -145,7 +145,7 @@ BibTeX
author = {Nakahara, Yuta and Ichijo, Naoki and Shimada, Koshi and
Iikubo, Yuji and Saito, Shota and Kazama, Koki and
Matsushima, Toshiyasu and {BayesML Developers}},
title = {BayesML 0.2.4},
title = {BayesML 0.2.5},
howpublished = {\url{https://github.com/yuta-nakahara/BayesML}},
year = {2022}
}
Expand Down
32 changes: 18 additions & 14 deletions bayesml/gaussianmixture/_gaussianmixture.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,7 +556,7 @@ def set_h0_params(
self.h0_w_mats[:] = h0_w_mats
self.h0_w_mats_inv[:] = np.linalg.inv(self.h0_w_mats)

self._calc_prior_char()
self._calc_prior_features()
self.reset_hn_params()
return self

Expand Down Expand Up @@ -634,8 +634,8 @@ def set_hn_params(
self.hn_w_mats[:] = hn_w_mats
self.hn_w_mats_inv[:] = np.linalg.inv(self.hn_w_mats)

self._calc_q_pi_char()
self._calc_q_lambda_char()
self._calc_q_pi_features()
self._calc_q_lambda_features()

self.calc_pred_dist()
return self
Expand All @@ -658,7 +658,7 @@ def get_hn_params(self):
"hn_nus":self.hn_nus,
"hn_w_mats":self.hn_w_mats}

def _calc_prior_char(self):
def _calc_prior_features(self):
self._ln_c_h0_alpha = gammaln(self.h0_alpha_vec.sum()) - gammaln(self.h0_alpha_vec).sum()
self._ln_b_h0_w_nus = (
- self.h0_nus*np.linalg.slogdet(self.h0_w_mats)[1]
Expand Down Expand Up @@ -700,13 +700,13 @@ def _calc_vl(self):
- np.sum(self.h0_w_mats_inv * self._e_lambda_mats,axis=(1,2))
) / 2.0

# E[ln q(Z|pi)]
# -E[ln q(Z|pi)]
self._vl_q_z = -np.sum(xlogy(self.r_vecs,self.r_vecs))

# E[ln q(pi)]
# -E[ln q(pi)]
self._vl_q_pi = ss_dirichlet.entropy(self.hn_alpha_vec)

# E[ln q(mu,Lambda)]
# -E[ln q(mu,Lambda)]
self._vl_q_mu_lambda = np.sum(
+ self.c_degree * (1.0 + np.log(2.0*np.pi) - np.log(self.hn_kappas))
- self._ln_b_hn_w_nus * 2.0
Expand Down Expand Up @@ -742,14 +742,14 @@ def _init_random_responsibility(self,x):
self.r_vecs[:] = self.rng.dirichlet(np.ones(self.c_num_classes),self.r_vecs.shape[0])
self._calc_n_x_bar_s(x)

def _calc_q_pi_char(self):
def _calc_q_pi_features(self):
self._e_ln_pi_vec[:] = digamma(self.hn_alpha_vec) - digamma(self.hn_alpha_vec.sum())

def _update_q_pi(self):
self.hn_alpha_vec[:] = self.h0_alpha_vec + self.ns
self._calc_q_pi_char()
self._calc_q_pi_features()

def _calc_q_lambda_char(self):
def _calc_q_lambda_features(self):
self._e_lambda_mats[:] = self.hn_nus[:,np.newaxis,np.newaxis] * self.hn_w_mats
self._e_ln_lambda_dets[:] = (np.sum(digamma((self.hn_nus[:,np.newaxis]-np.arange(self.c_degree)) / 2.0),axis=1)
+ self.c_degree*np.log(2.0)
Expand All @@ -774,7 +774,7 @@ def _update_q_mu_lambda(self):
@ (self.x_bar_vecs - self.h0_m_vecs)[:,np.newaxis,:])
)
self.hn_w_mats[:] = np.linalg.inv(self.hn_w_mats_inv)
self._calc_q_lambda_char()
self._calc_q_lambda_features()

def _update_q_z(self,x):
self._ln_rho[:] = (self._e_ln_pi_vec
Expand All @@ -801,7 +801,7 @@ def _init_subsampling(self,x):
/ _size * self.hn_nus[k]
+ np.eye(self.c_degree) * 1.0E-5) # avoid singular matrix
self.hn_w_mats[k] = np.linalg.inv(self.hn_w_mats_inv[k])
self._calc_q_lambda_char()
self._calc_q_lambda_features()

def _init_rho_r(self):
self._ln_rho[:] = 0.0
Expand All @@ -820,6 +820,7 @@ def update_posterior(
Parameters
----------
x : numpy.ndarray
(sample_size,c_degree)-dimensional ndarray.
All the elements must be real number.
max_itr : int, optional
maximum number of iterations, by default 100
Expand Down Expand Up @@ -897,8 +898,8 @@ def update_posterior(
self.hn_nus[:] = tmp_nus
self.hn_w_mats[:] = tmp_w_mats
self.hn_w_mats_inv[:] = tmp_w_mats_inv
self._calc_q_pi_char()
self._calc_q_lambda_char()
self._calc_q_pi_features()
self._calc_q_lambda_features()
self._update_q_z(x)
return self

Expand Down Expand Up @@ -1168,6 +1169,9 @@ def estimate_latent_vars(self,x,loss="0-1"):

Parameters
----------
x : numpy.ndarray
(sample_size,c_degree)-dimensional ndarray.
All the elements must be real number.
loss : str, optional
Loss function underlying the Bayes risk function, by default \"0-1\".
This function supports \"squared\", \"0-1\", and \"KL\".
Expand Down
38 changes: 19 additions & 19 deletions bayesml/hiddenmarkovnormal/_hiddenmarkovnormal.py
Original file line number Diff line number Diff line change
Expand Up @@ -694,7 +694,7 @@ def set_h0_params(

self.h0_w_mats_inv[:] = np.linalg.inv(self.h0_w_mats)

self._calc_prior_char()
self._calc_prior_features()
self.reset_hn_params()
return self

Expand Down Expand Up @@ -796,9 +796,9 @@ def set_hn_params(

self.hn_w_mats_inv[:] = np.linalg.inv(self.hn_w_mats)

self._calc_q_pi_char()
self._calc_q_a_char()
self._calc_q_lambda_char()
self._calc_q_pi_features()
self._calc_q_a_features()
self._calc_q_lambda_features()

self.calc_pred_dist()
return self
Expand All @@ -823,7 +823,7 @@ def get_hn_params(self):
'hn_nus':self.hn_nus,
'hn_w_mats':self.hn_w_mats}

def _calc_prior_char(self):
def _calc_prior_features(self):
self._ln_c_h0_eta_vec = gammaln(self.h0_eta_vec.sum()) - gammaln(self.h0_eta_vec).sum()
self._ln_c_h0_zeta_vecs_sum = np.sum(gammaln(self.h0_zeta_vecs.sum(axis=1)) - gammaln(self.h0_zeta_vecs).sum(axis=1))
self._ln_b_h0_w_nus = (
Expand Down Expand Up @@ -851,16 +851,16 @@ def _calc_n_m_x_bar_s(self,x):
@ (x[:,np.newaxis,:] - self.x_bar_vecs[indices])[:,:,np.newaxis,:]),
axis=0) / self.ns[indices,np.newaxis,np.newaxis]

def _calc_q_pi_char(self):
def _calc_q_pi_features(self):
self._ln_pi_tilde_vec[:] = digamma(self.hn_eta_vec) - digamma(self.hn_eta_vec.sum())
self._pi_tilde_vec[:] = np.exp(self._ln_pi_tilde_vec - self._ln_pi_tilde_vec.max())

def _calc_q_a_char(self):
def _calc_q_a_features(self):
self._ln_a_tilde_mat[:] = digamma(self.hn_zeta_vecs) - digamma(self.hn_zeta_vecs.sum(axis=1,keepdims=True))
self._a_tilde_mat[:] = np.exp(self._ln_a_tilde_mat - self._ln_a_tilde_mat.max())
self._ln_c_hn_zeta_vecs_sum = np.sum(gammaln(self.hn_zeta_vecs.sum(axis=1)) - gammaln(self.hn_zeta_vecs).sum(axis=1))

def _calc_q_lambda_char(self):
def _calc_q_lambda_features(self):
self._e_lambda_mats[:] = self.hn_nus[:,np.newaxis,np.newaxis] * self.hn_w_mats
self._e_ln_lambda_dets[:] = (np.sum(digamma((self.hn_nus[:,np.newaxis]-np.arange(self.c_degree)) / 2.0),axis=1)
+ self.c_degree*np.log(2.0)
Expand Down Expand Up @@ -908,19 +908,19 @@ def _calc_vl(self):
- np.sum(self.h0_w_mats_inv * self._e_lambda_mats,axis=(1,2))
) / 2.0

# E[ln q(Z|pi)]
# -E[ln q(Z|pi)]
self._vl_q_z = (-(self.gamma_vecs * self._ln_rho).sum()
-(self.ms * (self._ln_a_tilde_mat - self._ln_a_tilde_mat.max())).sum()
-(self.gamma_vecs[0] * (self._ln_pi_tilde_vec - self._ln_pi_tilde_vec.max())).sum()
+np.log(self._cs).sum())

# E[ln q(pi)]
# -E[ln q(pi)]
self._vl_q_pi = ss_dirichlet.entropy(self.hn_eta_vec)

# E[ln p(A)]
# -E[ln p(A)]
self._vl_q_a = -self._ln_c_hn_zeta_vecs_sum - ((self.hn_zeta_vecs - 1) * self._ln_a_tilde_mat).sum()

# E[ln q(mu,Lambda)]
# -E[ln q(mu,Lambda)]
self._vl_q_mu_lambda = np.sum(
+ self.c_degree * (1.0 + np.log(2.0*np.pi) - np.log(self.hn_kappas))
- self._ln_b_hn_w_nus * 2.0
Expand Down Expand Up @@ -968,7 +968,7 @@ def _init_subsampling(self,x):
/ _size * self.hn_nus[k]
+ np.eye(self.c_degree) * 1.0E-5) # avoid singular matrix
self.hn_w_mats[k] = np.linalg.inv(self.hn_w_mats_inv[k])
self._calc_q_lambda_char()
self._calc_q_lambda_features()

def _update_q_mu_lambda(self):
self.hn_kappas[:] = self.h0_kappas + self.ns
Expand All @@ -982,15 +982,15 @@ def _update_q_mu_lambda(self):
@ (self.x_bar_vecs - self.h0_m_vecs)[:,np.newaxis,:])
)
self.hn_w_mats[:] = np.linalg.inv(self.hn_w_mats_inv)
self._calc_q_lambda_char()
self._calc_q_lambda_features()

def _update_q_pi(self):
self.hn_eta_vec[:] = self.h0_eta_vec + self.ns
self._calc_q_pi_char()
self._calc_q_pi_features()

def _update_q_a(self):
self.hn_zeta_vecs[:] = self.h0_zeta_vecs + self.ms
self._calc_q_a_char()
self._calc_q_a_features()

def _calc_rho(self,x):
self._ln_rho[:] = ((self._e_ln_lambda_dets
Expand Down Expand Up @@ -1135,9 +1135,9 @@ def update_posterior(
self.hn_nus[:] = tmp_nus
self.hn_w_mats[:] = tmp_w_mats
self.hn_w_mats_inv[:] = tmp_w_mats_inv
self._calc_q_pi_char()
self._calc_q_a_char()
self._calc_q_lambda_char()
self._calc_q_pi_features()
self._calc_q_a_features()
self._calc_q_lambda_features()
self._update_q_z(x)
return self

Expand Down
4 changes: 2 additions & 2 deletions bayesml/metatree/_metatree.py
Original file line number Diff line number Diff line change
Expand Up @@ -1091,7 +1091,7 @@ class LearnModel(base.Posterior,base.PredictiveMixin):
h0_k_weight_vec : numpy.ndarray, optional
A vector of positive real numbers whose length is
``c_dim_continuous+c_dim_categorical``,
by default [1/c_num_assignment_vec.sum(),...,1/c_num_assignment_vec.sum()].
by default [1,...,1].
h0_g : float, optional
A real number in :math:`[0, 1]`, by default 0.5
sub_h0_params : dict, optional
Expand Down Expand Up @@ -2218,7 +2218,7 @@ def _visualize_model_recursion(self,tree_graph,node:_Node,node_id,parent_id,pare
label_string += f'\\l{key}:{value}'
label_string += '}\\l'
else:
label_string += '\\lNone}\\l'
label_string += 'sub_model=\\lNone\\l'

tree_graph.node(name=f'{tmp_id}',label=label_string,fillcolor=f'{rgb2hex(_CMAP(tmp_p_s))}')
if tmp_p_s > 0.65:
Expand Down
4 changes: 2 additions & 2 deletions doc/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
author = 'BayesML Developers'

# The full version, including alpha/beta/rc tags
release = '0.2.1'
release = '0.2.5'


# -- General configuration ---------------------------------------------------
Expand Down Expand Up @@ -81,7 +81,7 @@

#numpydoc_show_class_members = False

html_style = 'css/customize.css'
# html_style = 'css/customize.css'

autosummary_generate = True

Expand Down
Loading