bnmf-algs
collapsed_icm.hpp
Go to the documentation of this file.
1 #pragma once
2 
4 #include "defs.hpp"
5 #include "util/sampling.hpp"
6 #include "util_details.hpp"
7 
8 namespace bnmf_algs {
9 namespace bld {
51 template <typename T, typename Scalar>
53  const alloc_model::Params<Scalar>& model_params,
54  size_t max_iter = 1000, double eps = 1e-50) {
55  details::check_bld_params(X, z, model_params);
56 
57  const auto x = static_cast<size_t>(X.rows());
58  const auto y = static_cast<size_t>(X.cols());
59 
60  tensor_t<T, 3> U(x, y, z);
61  U.setZero();
62 
63  matrix_t<T> U_ipk = matrix_t<T>::Zero(x, z);
64  vector_t<T> U_ppk = vector_t<T>::Zero(z);
65  matrix_t<T> U_pjk = matrix_t<T>::Zero(y, z);
66 
67  const Scalar sum_alpha = std::accumulate(model_params.alpha.begin(),
68  model_params.alpha.end(), 0.0);
69 
70  vector_t<T> prob(U_ppk.cols());
71  Eigen::Map<const vector_t<Scalar>> beta(model_params.beta.data(), 1,
72  model_params.beta.size());
73 
74  // initializing increment sampling without multinomial
75  size_t i, j;
76  for (const auto& pair : util::sample_ones_noreplace(X)) {
77  std::tie(i, j) = pair;
78 
79  vector_t<T> alpha_row = U_ipk.row(i).array() + model_params.alpha[i];
80  vector_t<T> beta_row = (U_pjk.row(j) + beta).array();
81  vector_t<T> sum_alpha_row = U_ppk.array() + sum_alpha;
82  prob = alpha_row.array() * beta_row.array() /
83  (sum_alpha_row.array() + eps);
84 
85  auto k = std::distance(
86  prob.data(),
87  std::max_element(prob.data(), prob.data() + prob.cols()));
88 
89  ++U(i, j, k);
90  ++U_ipk(i, k);
91  ++U_ppk(k);
92  ++U_pjk(j, k);
93  }
94 
95  std::vector<unsigned int> multinomial_sample(
96  static_cast<unsigned long>(U_ppk.cols()));
97  util::gsl_rng_wrapper rnd_gen(gsl_rng_alloc(gsl_rng_taus), gsl_rng_free);
98 
99  for (const auto& pair : util::sample_ones_replace(X, max_iter)) {
100  std::tie(i, j) = pair;
101 
102  // decrement sampling
103  for (long k = 0; k < U.dimension(2); ++k) {
104  prob(k) = U(i, j, k);
105  }
106 
107  gsl_ran_multinomial(rnd_gen.get(), static_cast<size_t>(prob.cols()), 1,
108  prob.data(), multinomial_sample.data());
109  auto k = std::distance(multinomial_sample.begin(),
110  std::max_element(multinomial_sample.begin(),
111  multinomial_sample.end()));
112 
113  --U(i, j, k);
114  --U_ipk(i, k);
115  --U_ppk(k);
116  --U_pjk(j, k);
117 
118  // increment sampling
119  vector_t<T> alpha_row = U_ipk.row(i).array() + model_params.alpha[i];
120  vector_t<T> beta_row = (U_pjk.row(j) + beta).array();
121  vector_t<T> sum_alpha_row = U_ppk.array() + sum_alpha;
122  prob = alpha_row.array() * beta_row.array() /
123  (sum_alpha_row.array() + eps);
124 
125  k = std::distance(
126  prob.data(),
127  std::max_element(prob.data(), prob.data() + prob.cols()));
128 
129  ++U(i, j, k);
130  ++U_ipk(i, k);
131  ++U_ppk(k);
132  ++U_pjk(j, k);
133  }
134 
135  return U;
136 }
137 } // namespace bld
138 } // namespace bnmf_algs
Structure to hold the parameters for the Allocation Model .
Definition: alloc_model_params.hpp:25
T distance(T...args)
T tie(T...args)
util::Generator< std::pair< int, int >, details::SampleOnesNoReplaceComputer< T > > sample_ones_noreplace(const matrix_t< T > &X)
Return a bnmf_algs::util::Generator that will generate a sequence of samples from the given matrix wi...
Definition: sampling.hpp:526
Eigen::Tensor< Scalar, N, Eigen::RowMajor > tensor_t
Tensor type used in the computations.
Definition: defs.hpp:52
Eigen::Matrix< Scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor > matrix_t
Matrix type used in the computations.
Definition: defs.hpp:41
T max_element(T...args)
T end(T...args)
util::Generator< std::pair< int, int >, details::SampleOnesReplaceComputer< T > > sample_ones_replace(const matrix_t< T > &X, size_t num_samples)
Return a bnmf_algs::util::Generator that will generate a sequence of samples from the given matrix wi...
Definition: sampling.hpp:567
T data(T...args)
std::vector< Scalar > alpha
Parameter vector of Dirichlet prior for matrix of size .
Definition: alloc_model_params.hpp:37
T get(T...args)
void check_bld_params(const matrix_t< T > &X, size_t z, const alloc_model::Params< Scalar > &model_params)
Do parameter checks on BLD computing function parameters and throw an assertion error if the paramete...
Definition: util_details.hpp:20
T size(T...args)
T begin(T...args)
tensor_t< T, 3 > collapsed_icm(const matrix_t< T > &X, size_t z, const alloc_model::Params< Scalar > &model_params, size_t max_iter=1000, double eps=1e-50)
Compute tensor , the solution of BLD problem , from matrix using collapsed iterated conditional mode...
Definition: collapsed_icm.hpp:52
T accumulate(T...args)
std::vector< Scalar > beta
Parameter vector of Dirichlet prior for matrix of size .
Definition: alloc_model_params.hpp:42
Eigen::Matrix< Scalar, 1, Eigen::Dynamic, Eigen::RowMajor > vector_t
Vector type used in the computations.
Definition: defs.hpp:27
Main namespace for bnmf-algs library.
Definition: alloc_model_funcs.hpp:12