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...
Main namespace in ViennaCL. Holds all the basic types such as vector, matrix, etc. and defines operations upon them.
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...