Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <shogun/lib/config.h>
00013
00014 #ifdef HAVE_LAPACK
00015 #include <shogun/regression/KRR.h>
00016 #include <shogun/mathematics/lapack.h>
00017 #include <shogun/mathematics/Math.h>
00018
00019 using namespace shogun;
00020
00021 CKRR::CKRR()
00022 : CKernelMachine()
00023 {
00024 alpha=NULL;
00025 tau=1e-6;
00026 }
00027
00028 CKRR::CKRR(float64_t t, CKernel* k, CLabels* lab)
00029 : CKernelMachine()
00030 {
00031 tau=t;
00032 set_labels(lab);
00033 set_kernel(k);
00034 alpha=NULL;
00035 }
00036
00037
00038 CKRR::~CKRR()
00039 {
00040 SG_FREE(alpha);
00041 }
00042
00043 bool CKRR::train_machine(CFeatures* data)
00044 {
00045 SG_FREE(alpha);
00046
00047 ASSERT(labels);
00048 if (data)
00049 {
00050 if (labels->get_num_labels() != data->get_num_vectors())
00051 SG_ERROR("Number of training vectors does not match number of labels\n");
00052 kernel->init(data, data);
00053 }
00054 ASSERT(kernel && kernel->has_features());
00055
00056
00057 SGMatrix<float64_t> kernel_matrix=kernel->get_kernel_matrix<float64_t>();
00058 int32_t n = kernel_matrix.num_cols;
00059 int32_t m = kernel_matrix.num_rows;
00060 ASSERT(kernel_matrix.matrix && m>0 && n>0);
00061
00062 for(int32_t i=0; i < n; i++)
00063 kernel_matrix.matrix[i+i*n]+=tau;
00064
00065
00066 if (!labels)
00067 SG_ERROR("No labels set\n");
00068
00069 SGVector<float64_t> alpha_orig=labels->get_labels();
00070
00071 alpha=CMath::clone_vector(alpha_orig.vector, alpha_orig.vlen);
00072
00073 if (alpha_orig.vlen!=n)
00074 {
00075 SG_ERROR("Number of labels does not match number of kernel"
00076 " columns (num_labels=%d cols=%d\n", alpha_orig.vlen, n);
00077 }
00078
00079 clapack_dposv(CblasRowMajor,CblasUpper, n, 1, kernel_matrix.matrix, n, alpha, n);
00080
00081 SG_FREE(kernel_matrix.matrix);
00082 return true;
00083 }
00084
00085 bool CKRR::load(FILE* srcfile)
00086 {
00087 SG_SET_LOCALE_C;
00088 SG_RESET_LOCALE;
00089 return false;
00090 }
00091
00092 bool CKRR::save(FILE* dstfile)
00093 {
00094 SG_SET_LOCALE_C;
00095 SG_RESET_LOCALE;
00096 return false;
00097 }
00098
00099 CLabels* CKRR::apply()
00100 {
00101 ASSERT(kernel);
00102
00103
00104 SGMatrix<float64_t> kernel_matrix=kernel->get_kernel_matrix<float64_t>();
00105 int32_t n = kernel_matrix.num_cols;
00106 int32_t m = kernel_matrix.num_rows;
00107 ASSERT(kernel_matrix.matrix && m>0 && n>0);
00108
00109 SGVector<float64_t> Yh(n);
00110
00111
00112
00113
00114
00115 int m_int = (int) m;
00116 int n_int = (int) n;
00117 cblas_dgemv(CblasColMajor, CblasTrans, m_int, n_int, 1.0, (double*) kernel_matrix.matrix,
00118 m_int, (double*) alpha, 1, 0.0, (double*) Yh.vector, 1);
00119
00120 SG_FREE(kernel_matrix.matrix);
00121
00122 return new CLabels(Yh);
00123 }
00124
00125 float64_t CKRR::apply(int32_t num)
00126 {
00127 ASSERT(kernel);
00128
00129
00130
00131 SGMatrix<float64_t> kernel_matrix=kernel->get_kernel_matrix<float64_t>();
00132 int32_t n = kernel_matrix.num_cols;
00133 int32_t m = kernel_matrix.num_rows;
00134 ASSERT(kernel_matrix.matrix && m>0 && n>0);
00135
00136 float64_t Yh;
00137
00138
00139 Yh = CMath::dot(kernel_matrix.matrix + m*num, alpha, m);
00140
00141 SG_FREE(kernel_matrix.matrix);
00142 return Yh;
00143 }
00144
00145 #endif