11 namespace tapkee_internal
14 template <
class RandomAccessIterator,
class FeatureVectorCallback>
15 DenseMatrix project(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback,
30 for (RandomAccessIterator iter=begin; iter!=end; ++iter)
32 callback.vector(*iter,current_vector);
33 X.col(iter-begin) = current_vector - mean_vector;
39 DenseMatrix sig = DenseMatrix::Identity(dimension,dimension);
41 DenseMatrix A = DenseMatrix::Random(dimension, target_dimension).cwiseAbs();
47 while (iter < max_iter)
54 invC = (A*A.transpose() + sig).inverse();
55 M = A.transpose()*invC*X;
56 SC = n*(DenseMatrix::Identity(target_dimension,target_dimension) - A.transpose()*invC*A) + M*M.transpose();
59 A = (X*M.transpose())*SC.inverse();
60 sig =
DenseMatrix(((X*X.transpose() - A*M*X.transpose()).diagonal()/n).asDiagonal()).array() + epsilon;
63 newll = 0.5*(log(invC.determinant()) - (invC*X).cwiseProduct(X).sum()/n);
66 if ((iter > 1) && (fabs(newll - ll) < epsilon))
72 return X.transpose()*A;
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, Eigen::Dynamic > DenseMatrix
dense matrix type (non-overridable)
double ScalarType
default scalar value (can be overrided with TAPKEE_CUSTOM_INTERNAL_NUMTYPE define) ...
Eigen::Matrix< tapkee::ScalarType, Eigen::Dynamic, 1 > DenseVector
dense vector type (non-overridable)
int IndexType
indexing type (non-overridable) set to int for compatibility with OpenMP 2.0
DenseMatrix project(RandomAccessIterator begin, RandomAccessIterator end, FeatureVectorCallback callback, IndexType dimension, const IndexType max_iter, const ScalarType epsilon, const IndexType target_dimension, const DenseVector &mean_vector)