Преглед изворни кода

HIK and EXPHIK implemented

bodesheim пре 12 година
родитељ
комит
dedb607640

+ 81 - 0
math/kernels/KernelEXPHIK.cpp

@@ -0,0 +1,81 @@
+/** 
+* @file KernelEXPHIK.cpp
+* @brief Interface for the generalized rbf kernel with HIK metric
+* @author Paul Bodesheim
+* @date 02/07/2013
+
+*/
+
+#include <iostream>
+
+#include <math.h>
+#include "KernelEXPHIK.h"
+
+using namespace OBJREC;
+
+using namespace std;
+using namespace NICE;
+
+KernelEXPHIK::KernelEXPHIK ( double _gamma, double _alpha, double _beta ) : KernelHIK(_alpha, _beta)
+{
+        gamma = _gamma;
+}
+
+KernelEXPHIK::KernelEXPHIK ( const KernelEXPHIK & src ) : KernelHIK(src.alpha, src.beta)
+{
+        gamma = src.gamma;
+}
+
+KernelEXPHIK::KernelEXPHIK ( const KernelHIK & src, double _gamma ) : KernelHIK(src)
+{
+        gamma = _gamma;
+}
+
+KernelEXPHIK::~KernelEXPHIK()
+{
+}
+
+KernelEXPHIK *KernelEXPHIK::clone(void) const
+{
+	return new KernelEXPHIK ( *this );
+}
+
+	
+double KernelEXPHIK::K (const NICE::Vector & x, const NICE::Vector & y) const
+{
+	if ( x.size() != y.size() ) {
+		cerr << "KernelEXPHIK: dimensions: " << x.size() << " vs " << y.size() << endl;
+		fthrow(Exception, "Vector dimensions do not match!");
+	}
+
+	double dist = KernelHIK::K(x,x) + KernelHIK::K(y,y) - 2.0*KernelHIK::K(x,y);
+
+        return exp(-gamma*dist);
+}
+
+void KernelEXPHIK::updateKernelData ( KernelData *kernelData ) const
+{
+        NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
+        fthrow(Exception, "Not yet implemented!");
+
+}
+
+void KernelEXPHIK::getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const
+{
+	fthrow(Exception, "Not yet implemented!");
+}
+
+void KernelEXPHIK::setParameters( const NICE::Vector & newParameters ) 
+{
+        alpha = newParameters[0];
+        beta = newParameters[1];
+        gamma = newParameters[2];
+}
+
+void KernelEXPHIK::getParameters( NICE::Vector & newParameters ) const
+{
+	newParameters.resize(3);
+        newParameters[0] = alpha;
+        newParameters[1] = beta;
+        newParameters[2] = gamma;
+}

+ 60 - 0
math/kernels/KernelEXPHIK.h

@@ -0,0 +1,60 @@
+/** 
+* @file KernelEXPHIK.h
+* @brief Interface for the generalized rbf kernel with HIK metric
+* @author Paul Bodesheim
+* @date 02/07/2013
+
+*/
+#ifndef KERNELEXPHIKINCLUDE
+#define KERNELEXPHIKINCLUDE
+
+#include "Kernel.h"
+#include "KernelHIK.h"
+#include "ParameterizedKernel.h"
+
+namespace OBJREC {
+
+/** Interface for the generalized rbf kernel with HIK metric */
+class KernelEXPHIK : KernelHIK
+{
+
+    protected:
+
+	double gamma;
+
+    public:
+  
+	/** simple constructor with HIK parameters*/
+        KernelEXPHIK ( double gamma = 1.0, double alpha = 1.0, double beta = 1.0 );
+        
+	/** copy constructor */
+	KernelEXPHIK ( const KernelEXPHIK & src );
+        
+        /** constructor with HIK kernel*/
+        KernelEXPHIK ( const KernelHIK & src, double gamma = 1.0 );
+        
+	/** simple destructor */
+	virtual ~KernelEXPHIK();
+
+	/** clone this object */
+	KernelEXPHIK *clone(void) const;
+     
+	/** compute the kernel value */
+	double K (const NICE::Vector & x, const NICE::Vector & y) const;
+
+	size_t getParameterSize () const { return 3; }; 
+        
+        void updateKernelData ( KernelData *kernelData ) const;
+
+	void getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const;
+
+	void setParameters( const NICE::Vector & newParameters );
+	
+	void getParameters( NICE::Vector & newParameters ) const;
+
+};
+
+
+} // namespace
+
+#endif

+ 82 - 0
math/kernels/KernelHIK.cpp

@@ -0,0 +1,82 @@
+/** 
+* @file KernelHIK.cpp
+* @brief Interface for the (parameterized) histogram intersection kernel (HIK)
+* @author Paul Bodesheim
+* @date 02/07/2013
+
+*/
+
+#include <iostream>
+
+#include <math.h>
+#include "KernelHIK.h"
+
+using namespace OBJREC;
+
+using namespace std;
+using namespace NICE;
+
+
+
+KernelHIK::KernelHIK( double _alpha, double _beta )
+{
+    alpha = _alpha;
+    beta = _beta;
+}
+
+KernelHIK::KernelHIK ( const KernelHIK & src )
+{
+	alpha = src.alpha;
+	beta = src.beta;
+}
+
+KernelHIK::~KernelHIK()
+{
+}
+
+KernelHIK *KernelHIK::clone(void) const
+{
+	return new KernelHIK ( *this );
+}
+
+	
+double KernelHIK::K (const NICE::Vector & x, const NICE::Vector & y) const
+{
+	if ( x.size() != y.size() ) {
+		cerr << "KernelHIK: dimensions: " << x.size() << " vs " << y.size() << endl;
+		fthrow(Exception, "Vector dimensions do not match!");
+	}
+
+	double sim = 0.0;
+	for ( size_t i = 0 ; i < x.size() ; i++ )
+	{
+                double d = alpha*pow(min(x[i], y[i]), beta);
+		sim += d;
+	}
+        return sim;
+}
+
+void KernelHIK::updateKernelData ( KernelData *kernelData ) const
+{
+        NICE::Matrix & kernelMatrix = kernelData->getKernelMatrix();
+        fthrow(Exception, "Not yet implemented!");
+
+}
+
+void KernelHIK::getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const
+{
+	fthrow(Exception, "Not yet implemented!");
+}
+
+void KernelHIK::setParameters( const NICE::Vector & newParameters ) 
+{
+	alpha = newParameters[0];
+        beta = newParameters[1];
+}
+
+void KernelHIK::getParameters( NICE::Vector & newParameters ) const
+{
+	newParameters.resize(2);
+	newParameters[0] = alpha;
+        newParameters[1] = beta;
+}

+ 57 - 0
math/kernels/KernelHIK.h

@@ -0,0 +1,57 @@
+/** 
+* @file KernelHIK.h
+* @brief Interface for the (generalized) histogram intersection kernel (HIK)
+* @author Paul Bodesheim
+* @date 02/07/2013
+
+*/
+#ifndef KERNELHIKINCLUDE
+#define KERNELHIKINCLUDE
+
+#include "Kernel.h"
+#include "ParameterizedKernel.h"
+
+namespace OBJREC {
+
+/** Interface for the popular exponential mercer kernel / rbf kernel */
+class KernelHIK : ParameterizedKernel
+{
+
+    protected:
+
+	double alpha;
+	double beta;
+
+    public:
+  
+	/** simple constructor */
+	KernelHIK( double alpha = 1.0, double beta = 1.0 );
+
+	/** copy constructor */
+	KernelHIK ( const KernelHIK & src );
+      
+	/** simple destructor */
+	virtual ~KernelHIK();
+
+	/** clone this object */
+	KernelHIK *clone(void) const;
+     
+	/** compute the kernel value */
+	double K (const NICE::Vector & x, const NICE::Vector & y) const;
+
+	size_t getParameterSize () const { return 2; }; 
+        
+        void updateKernelData ( KernelData *kernelData ) const;
+
+	void getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const;
+
+	void setParameters( const NICE::Vector & newParameters );
+	
+	void getParameters( NICE::Vector & newParameters ) const;
+
+};
+
+
+} // namespace
+
+#endif

+ 15 - 0
math/kernels/genericKernel.h

@@ -4,6 +4,8 @@
 #include <vector>
 #include "KernelRBF.h"
 #include "KernelExp.h"
+#include "KernelHIK.h"
+#include "KernelEXPHIK.h"
 
 namespace OBJREC
 {
@@ -27,6 +29,19 @@ class GenericKernelSelection
         double log_rbf_sv = conf->gD ( "Kernel","log_rbf_sv",0.0 );
         kernel = new KernelExp ( log_rbf_gamma, log_rbf_sv );
       }
+      else if ( kernel_type == "hik" )
+      {
+        double alpha = conf->gD ( "Kernel","alpha",1.0 );
+        double beta = conf->gD ( "Kernel","beta",1.0 );
+        kernel = new KernelHIK ( alpha, beta );
+      }
+      else if ( kernel_type == "exphik" )
+      {
+        double alpha = conf->gD ( "Kernel","alpha",1.0 );
+        double beta = conf->gD ( "Kernel","beta",1.0 );
+        double gamma = conf->gD ( "Kernel","gamma",1.0 );
+        kernel = new KernelHIK ( gamma, alpha, beta );
+      }      
       else
       {
         fthrow ( NICE::Exception, "Kernel type " << kernel_type << " is unknown" );