From 82c499bea7e49a92ce0287be94ea4b470a1f1aab Mon Sep 17 00:00:00 2001 From: Wuwei Lin Date: Mon, 5 Feb 2018 21:41:54 +0800 Subject: [PATCH] Use linalg in LinearRidgeRegression (#4149) --- cmake/FindMetaExamples.cmake | 1 - .../regression/LinearRidgeRegression.cpp | 39 ++++++------------- src/shogun/regression/LinearRidgeRegression.h | 3 -- 3 files changed, 11 insertions(+), 32 deletions(-) diff --git a/cmake/FindMetaExamples.cmake b/cmake/FindMetaExamples.cmake index 8e382fe27bf..e92629fed78 100644 --- a/cmake/FindMetaExamples.cmake +++ b/cmake/FindMetaExamples.cmake @@ -39,7 +39,6 @@ function(get_excluded_meta_examples) IF(NOT HAVE_LAPACK) LIST(APPEND EXCLUDED_META_EXAMPLES - regression/linear_ridge_regression.sg distance/mahalanobis.sg ) ENDIF() diff --git a/src/shogun/regression/LinearRidgeRegression.cpp b/src/shogun/regression/LinearRidgeRegression.cpp index d8e537a2af5..e2454347632 100644 --- a/src/shogun/regression/LinearRidgeRegression.cpp +++ b/src/shogun/regression/LinearRidgeRegression.cpp @@ -6,15 +6,12 @@ */ #include -#ifdef HAVE_LAPACK -#include -#include -#include -#include #include +#include +#include +#include using namespace shogun; -using namespace Eigen; CLinearRidgeRegression::CLinearRidgeRegression() : CLinearMachine() @@ -62,7 +59,6 @@ bool CLinearRidgeRegression::train_machine(CFeatures* data) CDenseFeatures* feats=(CDenseFeatures*) data; int32_t num_feat=feats->get_num_features(); - int32_t num_vec=feats->get_num_vectors(); SGMatrix kernel_matrix(num_feat,num_feat); SGMatrix feats_matrix(feats->get_feature_matrix()); @@ -72,29 +68,17 @@ bool CLinearRidgeRegression::train_machine(CFeatures* data) tau_vector.zero(); tau_vector.add(m_tau); - Map eigen_kernel_matrix(kernel_matrix.matrix, num_feat,num_feat); - Map eigen_feats_matrix(feats_matrix.matrix, num_feat,num_vec); - Map eigen_y(y.vector, num_feat); - Map eigen_labels(((CRegressionLabels*)m_labels)->get_labels(),num_vec); - Map eigen_tau(tau_vector.vector, num_feat); - - eigen_kernel_matrix = eigen_feats_matrix*eigen_feats_matrix.transpose(); - - eigen_kernel_matrix.diagonal() += eigen_tau; + linalg::matrix_prod(feats_matrix, feats_matrix, kernel_matrix, false, true); + linalg::add_diag(kernel_matrix, tau_vector); - eigen_y = eigen_feats_matrix*eigen_labels ; + auto labels = ((CRegressionLabels*)m_labels)->get_labels(); + linalg::matrix_prod(feats_matrix, labels, y); - LLT llt; - llt.compute(eigen_kernel_matrix); - if(llt.info() != Eigen::Success) - { - SG_WARNING("Features covariance matrix was not positive definite\n"); - return false; - } - eigen_y = llt.solve(eigen_y); + auto decomposition = linalg::cholesky_factor(kernel_matrix); + y = linalg::cholesky_solver(decomposition, y); - set_w(y); - return true; + set_w(y); + return true; } bool CLinearRidgeRegression::load(FILE* srcfile) @@ -110,4 +94,3 @@ bool CLinearRidgeRegression::save(FILE* dstfile) SG_RESET_LOCALE; return false; } -#endif diff --git a/src/shogun/regression/LinearRidgeRegression.h b/src/shogun/regression/LinearRidgeRegression.h index 890e7e80671..058f0f95577 100644 --- a/src/shogun/regression/LinearRidgeRegression.h +++ b/src/shogun/regression/LinearRidgeRegression.h @@ -10,8 +10,6 @@ #include -#ifdef HAVE_LAPACK - #include #include #include @@ -106,5 +104,4 @@ class CLinearRidgeRegression : public CLinearMachine float64_t m_tau; }; } -#endif // HAVE_LAPACK #endif // _LINEARRIDGEREGRESSION_H__