From 870ce63ddff7e77f6ade614f73bcac45b5a4f55f Mon Sep 17 00:00:00 2001 From: Tanmoy Mukherjee Date: Sun, 17 Apr 2011 01:29:23 +0530 Subject: [PATCH 1/2] BesselKernel --- src/libshogun/kernel/BesselKernel.cpp | 62 ++++++++++++++ src/libshogun/kernel/BesselKernel.h | 116 ++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 src/libshogun/kernel/BesselKernel.cpp create mode 100644 src/libshogun/kernel/BesselKernel.h diff --git a/src/libshogun/kernel/BesselKernel.cpp b/src/libshogun/kernel/BesselKernel.cpp new file mode 100644 index 00000000000..9f3c96b1168 --- /dev/null +++ b/src/libshogun/kernel/BesselKernel.cpp @@ -0,0 +1,62 @@ +#include "BesselKernel.h" +#include "lib/Mathematics.h" +#include + +using namespace shogun; + +CBesselKernel::CBesselKernel(void): CBesselKernel(0), distance(NULL) +{ + init(); + set_sigma(1.0); +} + +CBesselKernel::CBesselKernel(int32_t cache, float64_t sigma, CDistance* dist) +: CKernel(cache), distance(dist), sigma(sigma) +{ + init(); + ASSERT(distance); + SG_REF(distance); +} + +CBesselKernel::CBesselKernel(CFeatures *l, CFeatures *r, float64_t sigma, CDistance* dist) +: CKernel(10), distance(dist), sigma(sigma) +{ + init(); + ASSERT(distance); + SG_REF(distance); + init(l, r); +} + +CBesselKernel::~CBesselKernel() +{ + cleanup(); + SG_UNREF(distance); +} + +CBesselKernel::~CBesselKernel() +{ + cleanup(); + SG_UNREF(distance); +} + +bool CBesselKernel::init(CFeatures* l, CFeatures* r) +{ + + CKernel::init(l,r); + distance->init(l,r); + return init_normalizer(); +} + +void CBesselKernel::init() +{ + ASSERT(distance); + m_parameters->add(&sigma, "sigma", "Sigma kernel parameter."); + m_parameters->add((CSGObject**) &distance, "distance", "Distance to be used."); +} + +float64_t CBesselKernel::compute(int32_t idx_a, int32_t idx_b) +{ + float64_t dist = distance->distance(idx_a, idx_b); + return -j1(sigma*(dist*dist)) +} + diff --git a/src/libshogun/kernel/BesselKernel.h b/src/libshogun/kernel/BesselKernel.h new file mode 100644 index 00000000000..85ec5d6ec68 --- /dev/null +++ b/src/libshogun/kernel/BesselKernel.h @@ -0,0 +1,116 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Written (W) 2011 Tanmoy Mukherjee + * Copyright (C) 2007-2011 Fraunhofer Institute FIRST and Max-Planck-Society + * Copyright (C) 2011 IIIT Hyderabad + */ + +#include "lib/config.h" + +#ifndef BESSELKERNEL_H_ +#define BESSELKERNEL_H_ + +#include "lib/common.h" +#include "kernel/Kernel.h" +#include "distance/Distance.h" + +namespace shogun { + +class CDistance; +/** Bessel kernel + * + * It is described as + * + * \f[ + * K(x,x') = -Bessel^{n}_{nu+1}{1}{\sigma*\|x-x'\|^2} + * \f] + * + */ + + +class CBesselKernel:public CKernel +{ + + public: + /** Default Constructor */ + CBesselKernel(); + /** constructor + * + * @param size cache size + * @param sigma kernel parameter sigma + * @param dist distance + */ + + CBesselKernel(int32_t size, float64_t sigma, CDistance* dist); + /** initialize kernel with features + * + * @param l features of left-side + * @param r features of right-side + * @return true if successful + */ + virtual bool init(CFeatures* l, CFeatures* r); + + + + + inline virtual EKernelType get_kernel_type() { return K_BESSEL; } + + /** + * @return type of features + */ + inline virtual EFeatureType get_feature_type() { return distance->get_feature_type(); } + /** + * @return class of features + */ + + inline virtual EFeatureClass get_feature_class() { return distance->get_feature_class(); } + + /** + * @return name of kernel + */ + inline virtual const char* get_name() const { return "Bessel"; } + + inline virtual void set_sigma(float64_t s) + { + sigma=s; + } + + virtual ~CBesselKernel(); + + + protected: + /// distance to be used + CDistance* distance; + + /// sigma parameter of kernel + float64_t sigma; + + /** + * compute kernel for specific feature vectors + * corresponding to [idx_a] of left-side and [idx_b] of right-side + * @param idx_a left-side index + * @param idx_b right-side index + * @return kernel value + */ + virtual float64_t compute(int32_t idx_a, int32_t idx_b); + + /** Can (optionally) be overridden to post-initialize some + * member variables which are not PARAMETER::ADD'ed. Make + * sure that at first the overridden method + * BASE_CLASS::LOAD_SERIALIZABLE_POST is called. + * + * @exception ShogunException Will be thrown if an error + * occurres. + */ + virtual void load_serializable_post(void) throw (ShogunException); + + private: + void init(); + +}; +} +#endif /* BESSELKERNEL_H_ */ From e3447df9215b40186b5153e5f3ab3a72f0924181 Mon Sep 17 00:00:00 2001 From: Tanmoy Mukherjee Date: Sun, 17 Apr 2011 03:56:24 +0530 Subject: [PATCH 2/2] Bessel Kernel Updated --- src/libshogun/kernel/BesselKernel.cpp | 15 ++++++++------- src/libshogun/kernel/BesselKernel.h | 10 +++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/libshogun/kernel/BesselKernel.cpp b/src/libshogun/kernel/BesselKernel.cpp index 9f3c96b1168..3e9bc3bbd66 100644 --- a/src/libshogun/kernel/BesselKernel.cpp +++ b/src/libshogun/kernel/BesselKernel.cpp @@ -4,7 +4,7 @@ using namespace shogun; -CBesselKernel::CBesselKernel(void): CBesselKernel(0), distance(NULL) +CBesselKernel::CBesselKernel():CKernel(0),distance(NULL) { init(); set_sigma(1.0); @@ -33,11 +33,6 @@ CBesselKernel::~CBesselKernel() SG_UNREF(distance); } -CBesselKernel::~CBesselKernel() -{ - cleanup(); - SG_UNREF(distance); -} bool CBesselKernel::init(CFeatures* l, CFeatures* r) { @@ -47,6 +42,12 @@ bool CBesselKernel::init(CFeatures* l, CFeatures* r) return init_normalizer(); } +void CBesselKernel::load_serializable_post(void) throw (ShogunException) +{ + CKernel::load_serializable_post(); +} + + void CBesselKernel::init() { ASSERT(distance); @@ -57,6 +58,6 @@ void CBesselKernel::init() float64_t CBesselKernel::compute(int32_t idx_a, int32_t idx_b) { float64_t dist = distance->distance(idx_a, idx_b); - return -j1(sigma*(dist*dist)) + return -j1(sigma*(dist*dist)); } diff --git a/src/libshogun/kernel/BesselKernel.h b/src/libshogun/kernel/BesselKernel.h index 85ec5d6ec68..dd754360e8b 100644 --- a/src/libshogun/kernel/BesselKernel.h +++ b/src/libshogun/kernel/BesselKernel.h @@ -32,7 +32,7 @@ class CDistance; */ -class CBesselKernel:public CKernel +class CBesselKernel: public CKernel { public: @@ -52,6 +52,14 @@ class CBesselKernel:public CKernel * @param r features of right-side * @return true if successful */ + + CBesselKernel(CFeatures *l, CFeatures *r, float64_t coef, CDistance* dist); + /** initialize kernel with features + * @param l features left-side + * @param r features right-side + * @return true if successful + */ + virtual bool init(CFeatures* l, CFeatures* r);