Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <shogun/regression/gp/InferenceMethod.h>
00011 #ifdef HAVE_EIGEN3
00012 #include <shogun/mathematics/lapack.h>
00013 #include <shogun/mathematics/Math.h>
00014 #include <shogun/labels/RegressionLabels.h>
00015 #include <shogun/kernel/GaussianKernel.h>
00016 #include <shogun/features/CombinedFeatures.h>
00017
00018 using namespace shogun;
00019
00020 CInferenceMethod::CInferenceMethod()
00021 {
00022 init();
00023
00024 m_kernel = NULL;
00025 m_model = NULL;
00026 m_labels = NULL;
00027 m_features = NULL;
00028 m_latent_features = NULL;
00029 m_mean = NULL;
00030 }
00031
00032 CInferenceMethod::CInferenceMethod(CKernel* kern, CFeatures* feat,
00033 CMeanFunction* m, CLabels* lab, CLikelihoodModel* mod)
00034 {
00035 init();
00036
00037 set_kernel(kern);
00038 set_features(feat);
00039 set_labels(lab);
00040 set_model(mod);
00041 set_mean(m);
00042 }
00043
00044 CInferenceMethod::~CInferenceMethod()
00045 {
00046 SG_UNREF(m_kernel);
00047 SG_UNREF(m_features);
00048 SG_UNREF(m_latent_features);
00049 SG_UNREF(m_labels);
00050 SG_UNREF(m_model);
00051 SG_UNREF(m_mean);
00052 }
00053
00054 void CInferenceMethod::init()
00055 {
00056 SG_ADD((CSGObject**)&m_kernel, "kernel", "Kernel", MS_AVAILABLE);
00057 SG_ADD(&m_scale, "scale", "Kernel Scale", MS_AVAILABLE);
00058 SG_ADD((CSGObject**)&m_model, "likelihood_model", "Likelihood model",
00059 MS_AVAILABLE);
00060 SG_ADD((CSGObject**)&m_labels, "labels", "Labels", MS_NOT_AVAILABLE);
00061 SG_ADD((CSGObject**)&m_features, "features", "Features", MS_NOT_AVAILABLE);
00062 SG_ADD((CSGObject**)&m_latent_features, "latent_features", "latent Features", MS_NOT_AVAILABLE);
00063 SG_ADD((CSGObject**)&m_mean, "mean_function", "Mean Function", MS_NOT_AVAILABLE);
00064
00065 m_kernel = NULL;
00066 m_model = NULL;
00067 m_labels = NULL;
00068 m_features = NULL;
00069 m_latent_features = NULL;
00070 m_mean = NULL;
00071 m_scale = 1.0;
00072 }
00073
00074 void CInferenceMethod::set_features(CFeatures* feat)
00075 {
00076 SG_REF(feat);
00077 SG_UNREF(m_features);
00078 m_features=feat;
00079
00080 if (m_features && m_features->has_property(FP_DOT) && m_features->get_num_vectors())
00081 m_feature_matrix =
00082 ((CDotFeatures*)m_features)->get_computed_dot_feature_matrix();
00083
00084 else if (m_features && m_features->get_feature_class() == C_COMBINED)
00085 {
00086 CDotFeatures* subfeat =
00087 (CDotFeatures*)((CCombinedFeatures*)m_features)->
00088 get_first_feature_obj();
00089
00090 if (m_features->get_num_vectors())
00091 m_feature_matrix = subfeat->get_computed_dot_feature_matrix();
00092
00093 SG_UNREF(subfeat);
00094 }
00095
00096 update_data_means();
00097 update_train_kernel();
00098 update_chol();
00099 update_alpha();
00100 }
00101
00102 void CInferenceMethod::set_latent_features(CFeatures* feat)
00103 {
00104 SG_REF(feat);
00105 SG_UNREF(m_latent_features);
00106 m_latent_features=feat;
00107
00108 if (m_latent_features && m_latent_features->has_property(FP_DOT) && m_latent_features->get_num_vectors())
00109 m_latent_matrix =
00110 ((CDotFeatures*)m_latent_features)->get_computed_dot_feature_matrix();
00111
00112 else if (m_latent_features && m_latent_features->get_feature_class() == C_COMBINED)
00113 {
00114 CDotFeatures* subfeat =
00115 (CDotFeatures*)((CCombinedFeatures*)m_latent_features)->
00116 get_first_feature_obj();
00117
00118 if (m_latent_features->get_num_vectors())
00119 m_latent_matrix = subfeat->get_computed_dot_feature_matrix();
00120
00121 SG_UNREF(subfeat);
00122 }
00123
00124 update_data_means();
00125 update_train_kernel();
00126 update_chol();
00127 update_alpha();
00128 }
00129
00130 void CInferenceMethod::set_kernel(CKernel* kern)
00131 {
00132 SG_REF(kern);
00133 SG_UNREF(m_kernel);
00134 m_kernel = kern;
00135 update_train_kernel();
00136 update_chol();
00137 update_alpha();
00138 }
00139
00140 void CInferenceMethod::set_mean(CMeanFunction* m)
00141 {
00142 SG_REF(m);
00143 SG_UNREF(m_mean);
00144 m_mean = m;
00145
00146 update_data_means();
00147 update_chol();
00148 update_alpha();
00149 }
00150
00151 void CInferenceMethod::set_labels(CLabels* lab)
00152 {
00153 SG_REF(lab);
00154 SG_UNREF(m_labels);
00155 m_labels = lab;
00156
00157 if (m_labels)
00158 {
00159 m_label_vector =
00160 ((CRegressionLabels*) m_labels)->get_labels().clone();
00161 }
00162
00163 update_data_means();
00164 update_alpha();
00165 }
00166
00167 void CInferenceMethod::set_model(CLikelihoodModel* mod)
00168 {
00169 SG_REF(mod);
00170 SG_UNREF(m_model);
00171 m_model = mod;
00172 update_train_kernel();
00173 update_chol();
00174 update_alpha();
00175 }
00176
00177 void CInferenceMethod::set_scale(float64_t s)
00178 {
00179 update_train_kernel();
00180 m_scale = s;
00181 update_chol();
00182 update_alpha();
00183 }
00184
00185 void CInferenceMethod::update_data_means()
00186 {
00187 if (m_mean)
00188 {
00189 m_data_means =
00190 m_mean->get_mean_vector(m_feature_matrix);
00191
00192
00193 if (m_label_vector.vlen == m_data_means.vlen)
00194 {
00195 for (index_t i = 0; i < m_label_vector.vlen; i++)
00196 m_label_vector[i] -= m_data_means[i];
00197 }
00198 }
00199 }
00200 #endif