SHOGUN
v2.0.0
|
00001 /* 00002 * This program is free software; you can redistribute it and/or modify 00003 * it under the terms of the GNU General Public License as published by 00004 * the Free Software Foundation; either version 3 of the License, or 00005 * (at your option) any later version. 00006 * 00007 * Copyright (C) 2012 Sergey Lisitsyn 00008 */ 00009 00010 #include <shogun/transfer/multitask/MultitaskL12LogisticRegression.h> 00011 #include <shogun/lib/malsar/malsar_joint_feature_learning.h> 00012 #include <shogun/lib/malsar/malsar_options.h> 00013 #include <shogun/lib/SGVector.h> 00014 00015 namespace shogun 00016 { 00017 00018 CMultitaskL12LogisticRegression::CMultitaskL12LogisticRegression() : 00019 CMultitaskLogisticRegression(), m_rho1(0.0), m_rho2(0.0) 00020 { 00021 init(); 00022 } 00023 00024 CMultitaskL12LogisticRegression::CMultitaskL12LogisticRegression( 00025 float64_t rho1, float64_t rho2, CDotFeatures* train_features, 00026 CBinaryLabels* train_labels, CTaskGroup* task_group) : 00027 CMultitaskLogisticRegression(0.0,train_features,train_labels,(CTaskRelation*)task_group) 00028 { 00029 set_rho1(rho1); 00030 set_rho2(rho2); 00031 init(); 00032 } 00033 00034 void CMultitaskL12LogisticRegression::init() 00035 { 00036 SG_ADD(&m_rho1,"rho1","rho L1/L2 regularization parameter",MS_AVAILABLE); 00037 SG_ADD(&m_rho2,"rho2","rho L2 regularization parameter",MS_AVAILABLE); 00038 } 00039 00040 void CMultitaskL12LogisticRegression::set_rho1(float64_t rho1) 00041 { 00042 m_rho1 = rho1; 00043 } 00044 00045 void CMultitaskL12LogisticRegression::set_rho2(float64_t rho2) 00046 { 00047 m_rho2 = rho2; 00048 } 00049 00050 float64_t CMultitaskL12LogisticRegression::get_rho1() const 00051 { 00052 return m_rho1; 00053 } 00054 00055 float64_t CMultitaskL12LogisticRegression::get_rho2() const 00056 { 00057 return m_rho2; 00058 } 00059 00060 CMultitaskL12LogisticRegression::~CMultitaskL12LogisticRegression() 00061 { 00062 } 00063 00064 bool CMultitaskL12LogisticRegression::train_locked_implementation(SGVector<index_t>* tasks) 00065 { 00066 SGVector<float64_t> y(m_labels->get_num_labels()); 00067 for (int32_t i=0; i<y.vlen; i++) 00068 y[i] = ((CBinaryLabels*)m_labels)->get_label(i); 00069 00070 malsar_options options = malsar_options::default_options(); 00071 options.termination = m_termination; 00072 options.tolerance = m_tolerance; 00073 options.max_iter = m_max_iter; 00074 options.n_tasks = ((CTaskGroup*)m_task_relation)->get_num_tasks(); 00075 options.tasks_indices = tasks; 00076 #ifdef HAVE_EIGEN3 00077 malsar_result_t model = malsar_joint_feature_learning( 00078 features, y.vector, m_rho1, m_rho2, options); 00079 00080 m_tasks_w = model.w; 00081 m_tasks_c = model.c; 00082 #else 00083 SG_WARNING("Please install Eigen3 to use MultitaskL12LogisticRegression\n"); 00084 m_tasks_w = SGMatrix<float64_t>(((CDotFeatures*)features)->get_dim_feature_space(), options.n_tasks); 00085 m_tasks_c = SGVector<float64_t>(options.n_tasks); 00086 #endif 00087 00088 return true; 00089 } 00090 00091 bool CMultitaskL12LogisticRegression::train_machine(CFeatures* data) 00092 { 00093 if (data && (CDotFeatures*)data) 00094 set_features((CDotFeatures*)data); 00095 00096 ASSERT(features); 00097 ASSERT(m_labels); 00098 ASSERT(m_task_relation); 00099 00100 SGVector<float64_t> y(m_labels->get_num_labels()); 00101 for (int32_t i=0; i<y.vlen; i++) 00102 y[i] = ((CBinaryLabels*)m_labels)->get_label(i); 00103 00104 malsar_options options = malsar_options::default_options(); 00105 options.termination = m_termination; 00106 options.tolerance = m_tolerance; 00107 options.max_iter = m_max_iter; 00108 options.n_tasks = ((CTaskGroup*)m_task_relation)->get_num_tasks(); 00109 options.tasks_indices = ((CTaskGroup*)m_task_relation)->get_tasks_indices(); 00110 00111 #ifdef HAVE_EIGEN3 00112 malsar_result_t model = malsar_joint_feature_learning( 00113 features, y.vector, m_rho1, m_rho2, options); 00114 00115 m_tasks_w = model.w; 00116 m_tasks_c = model.c; 00117 #else 00118 SG_WARNING("Please install Eigen3 to use MultitaskL12LogisticRegression\n"); 00119 m_tasks_w = SGMatrix<float64_t>(((CDotFeatures*)features)->get_dim_feature_space(), options.n_tasks); 00120 m_tasks_c = SGVector<float64_t>(options.n_tasks); 00121 #endif 00122 00123 for (int32_t i=0; i<options.n_tasks; i++) 00124 options.tasks_indices[i].~SGVector<index_t>(); 00125 SG_FREE(options.tasks_indices); 00126 00127 return true; 00128 } 00129 00130 }