26 using namespace shogun;
27 using namespace Eigen;
63 "Transformation matrix (Eigenvectors of covariance matrix).",
66 SG_ADD(&m_eigenvalues_vector,
"eigenvalues_vector",
92 ->get_feature_matrix();
93 int32_t num_vectors = feature_matrix.num_cols;
94 int32_t num_features = feature_matrix.num_rows;
95 SG_INFO(
"num_examples: %ld num_features: %ld \n", num_vectors, num_features)
98 int32_t max_dim_allowed =
CMath::min(num_vectors, num_features);
102 "target dimension should be less or equal to than minimum of N and D")
105 Map<MatrixXd> fmatrix(feature_matrix.matrix, num_features, num_vectors);
108 data_mean = fmatrix.rowwise().
sum()/(
float64_t) num_vectors;
109 fmatrix = fmatrix.colwise()-data_mean;
120 MatrixXd cov_mat(num_features, num_features);
121 cov_mat = fmatrix*fmatrix.transpose();
122 cov_mat /= (num_vectors-1);
124 SG_INFO(
"Computing Eigenvalues ... ")
126 SelfAdjointEigenSolver<MatrixXd> eigenSolve =
127 SelfAdjointEigenSolver<MatrixXd>(cov_mat);
128 eigenValues = eigenSolve.eigenvalues().tail(max_dim_allowed);
141 for (int32_t i=num_features-1; i<-1; i++)
152 for (int32_t i=num_features-1; i<-1; i++)
161 SG_INFO(
"Done\nReducing from %i to %i features..", num_features,
num_dim)
169 transformMatrix = eigenSolve.eigenvectors().block(0,
173 for (int32_t i=0; i<
num_dim; i++)
174 transformMatrix.col(i) /=
175 sqrt(eigenValues[i+max_dim_allowed-num_dim]);
182 JacobiSVD<MatrixXd> svd(fmatrix.transpose(), ComputeThinU | ComputeThinV);
185 eigenValues = svd.singularValues();
186 eigenValues = eigenValues.cwiseProduct(eigenValues)/(num_vectors-1);
199 for (int32_t i=0; i<num_features; i++)
210 for (int32_t i=0; i<num_features; i++)
219 SG_INFO(
"Done\nReducing from %i to %i features..", num_features,
num_dim)
225 transformMatrix = svd.matrixV().block(0, 0, num_features,
num_dim);
228 for (int32_t i=0; i<
num_dim; i++)
229 transformMatrix.col(i) /= sqrt(eigenValues[i]);
234 fmatrix = fmatrix.colwise()+data_mean;
257 SG_INFO(
"Transforming feature matrix\n")
265 SG_INFO(
"Preprocessing feature matrix\n")
266 Map<MatrixXd> feature_matrix(m.
matrix, num_features, num_vectors);
267 VectorXd data_mean = feature_matrix.rowwise().sum()/(
float64_t) num_vectors;
268 feature_matrix = feature_matrix.colwise()-data_mean;
270 feature_matrix.block(0,0,
num_dim,num_vectors) =
271 transform_matrix.transpose()*feature_matrix;
273 SG_INFO(
"Form matrix of target dimension")
274 for (int32_t col=0; col<num_vectors; col++)
276 for (int32_t row=0; row<
num_dim; row++)
277 m.
matrix[row*num_dim+col] = feature_matrix(row,col);
292 SG_INFO(
"Preprocessing feature matrix\n")
293 Map<MatrixXd> feature_matrix(m.
matrix, num_features, num_vectors);
294 VectorXd data_mean = feature_matrix.rowwise().sum()/(
float64_t) num_vectors;
295 feature_matrix = feature_matrix.colwise()-data_mean;
297 ret_matrix = transform_matrix.transpose()*feature_matrix;
308 Map<VectorXd> inputVec(vector.
vector, vector.
vlen);
314 inputVec = inputVec-mean;
315 resultVec = transformMat.transpose()*inputVec;
316 inputVec = inputVec+mean;
346 #endif // HAVE_EIGEN3