1 #ifndef VIENNACL_LINALG_HOST_BASED_NMF_OPERATIONS_HPP_
2 #define VIENNACL_LINALG_HOST_BASED_NMF_OPERATIONS_HPP_
42 nmf_config(
double val_epsilon = 1e-4,
double val_epsilon_stagnation = 1e-5,
44 eps_(val_epsilon), stagnation_eps_(val_epsilon_stagnation), max_iters_(num_max_iters), check_after_steps_(
45 (num_check_iters > 0) ? num_check_iters : 1), print_relative_error_(false),
iters_(0)
64 return stagnation_eps_;
93 return check_after_steps_;
99 check_after_steps_ = c;
105 return print_relative_error_;
110 print_relative_error_ = b;
113 template<
typename ScalarType>
120 double stagnation_eps_;
123 bool print_relative_error_;
131 template<
typename NumericT>
136 #ifdef VIENNACL_WITH_OPENMP
137 #pragma omp parallel for
139 for (
long i2 = 0; i2 < long(size); i2++)
142 NumericT val = matrix1[i] * matrix2[i];
144 matrix1[i] = (divisor > (
NumericT) 0.00001) ? (val / divisor) : (
NumericT) 0;
155 template<
typename NumericT>
182 bool stagnation_flag =
false;
192 NumericT * data_H = detail::extract_raw_pointer<NumericT>(H);
193 NumericT * data_hn = detail::extract_raw_pointer<NumericT>(hn);
194 NumericT * data_hd = detail::extract_raw_pointer<NumericT>(hd);
202 NumericT * data_W = detail::extract_raw_pointer<NumericT>(W);
203 NumericT * data_wn = detail::extract_raw_pointer<NumericT>(wn);
204 NumericT * data_wd = detail::extract_raw_pointer<NumericT>(wd);
216 diff_init = diff_val;
219 std::cout << diff_val / diff_init << std::endl;
222 if (diff_val / diff_init < conf.
tolerance())
232 stagnation_flag =
true;
235 stagnation_flag =
false;
238 last_diff = diff_val;
Generic interface for the l^2-norm. See viennacl/linalg/vector_operations.hpp for implementations...
friend void nmf(viennacl::matrix_base< ScalarType > const &V, viennacl::matrix_base< ScalarType > &W, viennacl::matrix_base< ScalarType > &H, nmf_config const &conf)
The nonnegative matrix factorization (approximation) algorithm as suggested by Lee and Seung...
Generic interface for matrix-vector and matrix-matrix products. See viennacl/linalg/vector_operations...
Implementation of the dense matrix class.
vcl_size_t check_after_steps() const
Number of steps after which the convergence of NMF should be checked (again)
Configuration class for the nonnegative-matrix-factorization algorithm. Specify tolerances, maximum iteration counts, etc., here.
void nmf(viennacl::matrix_base< NumericT > const &V, viennacl::matrix_base< NumericT > &W, viennacl::matrix_base< NumericT > &H, viennacl::linalg::nmf_config const &conf)
The nonnegative matrix factorization (approximation) algorithm as suggested by Lee and Seung...
VectorT prod(std::vector< std::vector< T, A1 >, A2 > const &matrix, VectorT const &vector)
vcl_size_t size(VectorType const &vec)
Generic routine for obtaining the size of a vector (ViennaCL, uBLAS, etc.)
Generic interface for the Frobenius norm.
vcl_size_t max_iterations() const
Returns the maximum number of iterations for the NMF algorithm.
void check_after_steps(vcl_size_t c)
Set the number of steps after which the convergence of NMF should be checked (again) ...
Represents a vector consisting of scalars 's' only, i.e. v[i] = s for all i. To be used as an initial...
double tolerance() const
Returns the relative tolerance for convergence.
void print_relative_error(bool b)
Specify whether the relative error should be printed at each convergence check after 'num_check_iters...
size_type size2() const
Returns the number of columns.
Common routines for single-threaded or OpenMP-enabled execution on CPU.
void tolerance(double e)
Sets the relative tolerance for convergence, i.e. norm(V - W * H) / norm(V - W_init * H_init) ...
void el_wise_mul_div(NumericT *matrix1, NumericT const *matrix2, NumericT const *matrix3, vcl_size_t size)
Missing OpenMP kernel for nonnegative matrix factorization of a dense matrices.
size_type size1() const
Returns the number of rows.
double stagnation_tolerance() const
Relative tolerance for the stagnation check.
nmf_config(double val_epsilon=1e-4, double val_epsilon_stagnation=1e-5, vcl_size_t num_max_iters=10000, vcl_size_t num_check_iters=100)
vcl_size_t iters() const
Returns the number of iterations of the last NMF run using this configuration object.
The vector type with operator-overloads and proxy classes is defined here. Linear algebra operations ...
scalar_expression< const matrix_base< NumericT >, const matrix_base< NumericT >, op_norm_frobenius > norm_frobenius(const matrix_base< NumericT > &A)
void trans(const matrix_expression< const matrix_base< NumericT, SizeT, DistanceT >, const matrix_base< NumericT, SizeT, DistanceT >, op_trans > &proxy, matrix_base< NumericT > &temp_trans)
void max_iterations(vcl_size_t m)
Sets the maximum number of iterations for the NMF algorithm.
void stagnation_tolerance(double e)
Sets the tolerance for the stagnation check (i.e. the minimum required relative change of the residua...
size_type internal_size2() const
Returns the internal number of columns. Usually required for launching OpenCL kernels only...
size_type internal_size1() const
Returns the internal number of rows. Usually required for launching OpenCL kernels only...
bool print_relative_error() const
Returns the flag specifying whether the relative tolerance should be printed in each iteration...