#ifndef __PCSVM_KERNEL__ #define __PCSVM_KERNEL__ #include #include "Vector.hpp" class KernelI { public: virtual float operator()(const Vector&, const Vector&) const = 0; virtual float operator()(const SparseVector&, const SparseVector& ) const = 0; virtual bool isLinear() const = 0; }; class LinearKernel: public KernelI { public: virtual float operator() (const Vector &v1, const Vector &v2) const {return v1*v2; } virtual float operator() (const SparseVector &v1, const SparseVector &v2) const {return v1*v2; } virtual bool isLinear() const { return true; } }; class PolynomialKernel: public KernelI { float c_; int d_; public: PolynomialKernel(float c=1.0f, int d=2): c_(c), d_(d) { }; virtual float operator()(const Vector &v1, const Vector &v2) const {return std::pow(1.0 + c_* v1*v2, d_);} virtual float operator()(const SparseVector &v1, const SparseVector &v2) const {return std::pow(1.0 + c_* v1*v2, d_);} virtual bool isLinear() const { return false; } }; template class RadialKernel // : public KernelI { float gamma_; public: RadialKernel(float gamma): gamma_(gamma) { }; virtual float operator()(const V &v1, const V &v2) {return std::exp(-gamma_* euk_distance(v1,v2)); } virtual bool isLinear() const { return false; } }; #endif