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;