Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "lib/config.h"
00013
00014 #ifdef HAVE_LAPACK
00015 #include "regression/KRR.h"
00016 #include "lib/lapack.h"
00017 #include "lib/Mathematics.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 delete[] alpha;
00041 }
00042
00043 bool CKRR::train(CFeatures* data)
00044 {
00045 delete[] 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 int32_t m=0;
00058 int32_t n=0;
00059 float64_t *K = kernel->get_kernel_matrix<float64_t>(m, n, NULL);
00060 ASSERT(K && m>0 && n>0);
00061
00062 for(int32_t i=0; i < n; i++)
00063 K[i+i*n]+=tau;
00064
00065
00066 int32_t numlabels=0;
00067 alpha=labels->get_labels(numlabels);
00068 ASSERT(alpha && numlabels==n);
00069
00070 clapack_dposv(CblasRowMajor,CblasUpper, n, 1, K, n, alpha, n);
00071
00072 delete[] K;
00073 return true;
00074 }
00075
00076 bool CKRR::load(FILE* srcfile)
00077 {
00078 return false;
00079 }
00080
00081 bool CKRR::save(FILE* dstfile)
00082 {
00083 return false;
00084 }
00085
00086 CLabels* CKRR::classify()
00087 {
00088 ASSERT(kernel);
00089
00090
00091 int32_t m=0;
00092 int32_t n=0;
00093 float64_t* K=kernel->get_kernel_matrix<float64_t>(m, n, NULL);
00094 ASSERT(K && m>0 && n>0);
00095 float64_t* Yh=new float64_t[n];
00096
00097
00098
00099
00100
00101 int m_int = (int) m;
00102 int n_int = (int) n;
00103 cblas_dgemv(CblasColMajor, CblasTrans, m_int, n_int, 1.0, (double*) K,
00104 m_int, (double*) alpha, 1, 0.0, (double*) Yh, 1);
00105
00106 delete[] K;
00107
00108 CLabels* output=new CLabels(n);
00109 output->set_labels(Yh, n);
00110
00111 delete[] Yh;
00112
00113 return output;
00114 }
00115
00116 float64_t CKRR::classify_example(int32_t num)
00117 {
00118 ASSERT(kernel);
00119
00120
00121 int32_t m=0;
00122 int32_t n=0;
00123
00124 float64_t* K=kernel->get_kernel_matrix<float64_t>(m, n, NULL);
00125 ASSERT(K && m>0 && n>0);
00126 float64_t Yh;
00127
00128
00129 Yh = CMath::dot(K + m*num, alpha, m);
00130
00131 delete[] K;
00132 return Yh;
00133 }
00134
00135 #endif