SHOGUN  4.1.0
 全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 宏定义  
KernelMeanMatching.cpp
浏览该文件的文档.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Copyright (W) 2012 Sergey Lisitsyn
8  */
9 
11 #include <shogun/lib/external/libqp.h>
12 
13 
14 static float64_t* kmm_K = NULL;
15 static int32_t kmm_K_ld = 0;
16 
17 static const float64_t* kmm_get_col(uint32_t i)
18 {
19  return kmm_K + kmm_K_ld*i;
20 }
21 
22 namespace shogun
23 {
25  CSGObject(), m_kernel(NULL)
26 {
27 }
28 
30  SGVector<index_t> test_indices) :
31  CSGObject(), m_kernel(NULL)
32 {
33  set_kernel(kernel);
34  set_training_indices(training_indices);
35  set_test_indices(test_indices);
36 }
37 
39 {
40  int32_t i,j;
44 
45  int32_t n_tr = m_training_indices.vlen;
46  int32_t n_te = m_test_indices.vlen;
47 
48  SGVector<float64_t> weights(n_tr);
49  weights.zero();
50 
51  kmm_K = SG_MALLOC(float64_t, n_tr*n_tr);
52  kmm_K_ld = n_tr;
53  float64_t* diag_K = SG_MALLOC(float64_t, n_tr);
54  for (i=0; i<n_tr; i++)
55  {
57  diag_K[i] = d;
58  kmm_K[i*n_tr+i] = d;
59  for (j=i+1; j<n_tr; j++)
60  {
62  kmm_K[i*n_tr+j] = d;
63  kmm_K[j*n_tr+i] = d;
64  }
65  }
66  float64_t* kappa = SG_MALLOC(float64_t, n_tr);
67  for (i=0; i<n_tr; i++)
68  {
69  float64_t avg = 0.0;
70  for (j=0; j<n_te; j++)
72 
73  avg *= float64_t(n_tr)/n_te;
74  kappa[i] = -avg;
75  }
76  float64_t* a = SG_MALLOC(float64_t, n_tr);
77  for (i=0; i<n_tr; i++) a[i] = 1.0;
78  float64_t* LB = SG_MALLOC(float64_t, n_tr);
79  float64_t* UB = SG_MALLOC(float64_t, n_tr);
80  float64_t B = 2.0;
81  for (i=0; i<n_tr; i++)
82  {
83  LB[i] = 0.0;
84  UB[i] = B;
85  }
86  for (i=0; i<n_tr; i++)
87  weights[i] = 1.0/float64_t(n_tr);
88 
89  libqp_state_T result =
90  libqp_gsmo_solver(&kmm_get_col,diag_K,kappa,a,1.0,LB,UB,weights,n_tr,1000,1e-9,NULL);
91 
92  SG_DEBUG("libqp exitflag=%d, %d iterations passed, primal objective=%f\n",
93  result.exitflag,result.nIter,result.QP);
94 
95  SG_FREE(kappa);
96  SG_FREE(a);
97  SG_FREE(LB);
98  SG_FREE(UB);
99  SG_FREE(diag_K);
100  SG_FREE(kmm_K);
101 
102  return weights;
103 }
104 
105 }
SGVector< index_t > m_training_indices
static int32_t kmm_K_ld
static const float64_t * kmm_get_col(uint32_t i)
float64_t kernel(int32_t idx_a, int32_t idx_b)
Definition: Kernel.h:206
SGVector< float64_t > compute_weights()
void set_kernel(CKernel *kernel)
index_t vlen
Definition: SGVector.h:494
#define ASSERT(x)
Definition: SGIO.h:201
Class SGObject is the base class of all shogun objects.
Definition: SGObject.h:112
void set_training_indices(SGVector< index_t > training_indices)
double float64_t
Definition: common.h:50
SGVector< index_t > m_test_indices
void set_test_indices(SGVector< index_t > test_indices)
#define SG_DEBUG(...)
Definition: SGIO.h:107
all of classes and functions are contained in the shogun namespace
Definition: class_list.h:18
The Kernel base class.
Definition: Kernel.h:158
static float64_t * kmm_K

SHOGUN 机器学习工具包 - 项目文档