35 #ifndef SHARK_MODELS_KERNELS_MULTITASKKERNEL_H 36 #define SHARK_MODELS_KERNELS_MULTITASKKERNEL_H 41 #include "Impl/MklKernelBase.h" 53 template <
class InputTypeT>
83 #ifndef DOXYGEN_SHOULD_SKIP_THIS 85 BOOST_FUSION_ADAPT_TPL_STRUCT(
95 template<
class InputType>
96 struct Batch< MultiTaskSample<InputType> >{
131 template <
class InputTypeT >
135 typedef DiscreteKernel base_type;
148 Data<MultiTaskSampleType>
const& data,
150 KernelType& inputkernel,
152 : DiscreteKernel(RealMatrix(tasks, tasks,0.0))
154 , m_inputkernel(inputkernel)
161 {
return "GaussianTaskKernel"; }
165 const std::size_t n = m_inputkernel.numberOfParameters();
166 RealVector ret(n + 1);
177 return m_inputkernel.numberOfParameters() + 1;
191 {
return (1.0 / std::sqrt(2 * m_gamma)); }
206 m_gamma = 1.0 / (2.0 * sigma * sigma);
219 base_type::write(ar);
244 const std::size_t tasks = numberOfTasks();
245 std::size_t elements = m_data.numberOfElements();
246 std::vector<std::size_t> ell(tasks, 0);
247 for (std::size_t i=0; i<elements; i++)
248 ell[m_data.element(i).task]++;
251 for (std::size_t i=0; i<elements; i++)
253 const std::size_t task_i = m_data.element(i).task;
254 for (std::size_t j=0; j<i; j++)
256 const std::size_t task_j = m_data.element(j).task;
257 const double k = m_inputkernel.eval(m_data.element(i).input, m_data.element(j).input);
258 base_type::m_matrix(task_i, task_j) += k;
259 base_type::m_matrix(task_j, task_i) += k;
261 const double k = m_inputkernel.eval(m_data.element(i).input, m_data.element(i).input);
262 base_type::m_matrix(task_i, task_i) += k;
264 for (std::size_t i=0; i<tasks; i++)
266 if (ell[i] == 0)
continue;
267 for (std::size_t j=0; j<tasks; j++)
269 if (ell[j] == 0)
continue;
270 base_type::m_matrix(i, j) /= (double)(ell[i] * ell[j]);
275 for (std::size_t i=0; i<tasks; i++)
277 const double norm2_i = base_type::m_matrix(i, i);
278 for (std::size_t j=0; j<i; j++)
280 const double norm2_j = base_type::m_matrix(j, j);
281 const double dist2 = norm2_i + norm2_j - 2.0 * base_type::m_matrix(i, j);
282 const double k = std::exp(-m_gamma * dist2);
283 base_type::m_matrix(i, j) = base_type::m_matrix(j, i) = k;
286 for (std::size_t i=0; i<tasks; i++) base_type::m_matrix(i, i) = 1.0;
290 Data<MultiTaskSampleType >
const&
m_data;
305 template <
class InputTypeT>
307 :
private detail::MklKernelBase<MultiTaskSample<InputTypeT> >
308 ,
public ProductKernel< MultiTaskSample<InputTypeT> >
311 typedef detail::MklKernelBase<MultiTaskSample<InputTypeT> > base_type1;
312 typedef ProductKernel< MultiTaskSample<InputTypeT> > base_type2;
320 InputKernelType* inputkernel,
321 DiscreteKernel* taskkernel)
322 :base_type1(
boost::fusion::make_vector(inputkernel,taskkernel))
323 ,base_type2(base_type1::makeKernelVector())
328 {
return "MultiTaskKernel"; }