PLearn 0.1
Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Static Protected Member Functions | Protected Attributes | Private Types
PLearn::PartsDistanceKernel Class Reference

This class implements an Ln distance (defaults to L2 i.e. euclidean distance). More...

#include <PartsDistanceKernel.h>

Inheritance diagram for PLearn::PartsDistanceKernel:
Inheritance graph
[legend]
Collaboration diagram for PLearn::PartsDistanceKernel:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 PartsDistanceKernel ()
virtual void train (VMat data)
 Subclasses may override this method for kernels that can be trained on a dataset prior to being used (e.g.
virtual real evaluate (const Vec &x1, const Vec &x2) const
 ** Subclasses must override this method **
virtual string classname () const
virtual OptionListgetOptionList () const
virtual OptionMapgetOptionMap () const
virtual RemoteMethodMapgetRemoteMethodMap () const
virtual PartsDistanceKerneldeepCopy (CopiesMap &copies) const

Static Public Member Functions

static string _classname_ ()
static OptionList_getOptionList_ ()
static RemoteMethodMap_getRemoteMethodMap_ ()
static Object_new_instance_for_typemap_ ()
static bool _isa_ (const Object *o)
static void _static_initialize_ ()
static const PPathdeclaringFile ()

Public Attributes

real partsize
real n
 1 for L1, 2 for L2, etc...
bool standardize
real min_stddev
real epsilon
bool pow_distance
Vec inv_stddev

Static Public Attributes

static StaticInitializer _static_initializer_

Static Protected Member Functions

static void declareOptions (OptionList &ol)
 Declare options (data fields) for the class.

Protected Attributes

Vec elementdist

Private Types

typedef Kernel inherited

Detailed Description

This class implements an Ln distance (defaults to L2 i.e. euclidean distance).

Definition at line 51 of file PartsDistanceKernel.h.


Member Typedef Documentation

Reimplemented from PLearn::Kernel.

Definition at line 56 of file PartsDistanceKernel.h.


Constructor & Destructor Documentation

PLearn::PartsDistanceKernel::PartsDistanceKernel ( )

Definition at line 57 of file PartsDistanceKernel.cc.

References n.

{
    partsize = 0.9;
    n = 2;
    standardize = true;
    min_stddev = 1e-8;
    epsilon = 1e-8;
    pow_distance = false;
}

Member Function Documentation

string PLearn::PartsDistanceKernel::_classname_ ( ) [static]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

OptionList & PLearn::PartsDistanceKernel::_getOptionList_ ( ) [static]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

RemoteMethodMap & PLearn::PartsDistanceKernel::_getRemoteMethodMap_ ( ) [static]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

bool PLearn::PartsDistanceKernel::_isa_ ( const Object o) [static]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

Object * PLearn::PartsDistanceKernel::_new_instance_for_typemap_ ( ) [static]

Reimplemented from PLearn::Object.

Definition at line 52 of file PartsDistanceKernel.cc.

StaticInitializer PartsDistanceKernel::_static_initializer_ & PLearn::PartsDistanceKernel::_static_initialize_ ( ) [static]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

string PLearn::PartsDistanceKernel::classname ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 52 of file PartsDistanceKernel.cc.

void PLearn::PartsDistanceKernel::declareOptions ( OptionList ol) [static, protected]

Declare options (data fields) for the class.

Redefine this in subclasses: call declareOption(...) for each option, and then call inherited::declareOptions(options). Please call the inherited method AT THE END to get the options listed in a consistent order (from most recently defined to least recently defined).

  static void MyDerivedClass::declareOptions(OptionList& ol)
  {
      declareOption(ol, "inputsize", &MyObject::inputsize_,
                    OptionBase::buildoption,
                    "The size of the input; it must be provided");
      declareOption(ol, "weights", &MyObject::weights,
                    OptionBase::learntoption,
                    "The learned model weights");
      inherited::declareOptions(ol);
  }
Parameters:
olList of options that is progressively being constructed for the current class.

Reimplemented from PLearn::Kernel.

Definition at line 70 of file PartsDistanceKernel.cc.

References PLearn::OptionBase::buildoption, PLearn::declareOption(), epsilon, inv_stddev, PLearn::OptionBase::learntoption, min_stddev, n, partsize, pow_distance, and standardize.

{
    declareOption(ol, "n", &PartsDistanceKernel::n, OptionBase::buildoption, 
                  "This class implements a Ln parts distance (L2 is the default).");

    declareOption(ol, "pow_distance", &PartsDistanceKernel::pow_distance, OptionBase::buildoption, 
                  "If set to 1 (true), the distance computed will be elevated to power n.");

    declareOption(ol, "standardize", &PartsDistanceKernel::standardize, OptionBase::buildoption, 
                  "If set to 1 (true), the inverse standard deviation inv_stddev will be used to scale the vector differences.");

    declareOption(ol, "min_stddev", &PartsDistanceKernel::min_stddev, OptionBase::buildoption, 
                  "When method train computes inv_stddev, it will set it to FLT_MAX for \n"
                  "any component for which the standard deviation is below min_stddev");

    declareOption(ol, "epsilon", &PartsDistanceKernel::epsilon, OptionBase::buildoption, 
                  "This is added to the absolute value of the elementwise difference between the 2 vectors.\n" 
                  "It's especially important for this to be non-zero when standardizing.");

    declareOption(ol, "partsize", &PartsDistanceKernel::partsize, OptionBase::buildoption, 
                  "This determines the number of elements (the size of the part) that will be used to compute the distance.\n"
                  "If >=1 it's interpreted as anabsolute number of elements. If it's <1 it's taken to mean a fraction of all the elements.\n");

    declareOption(ol, "inv_stddev", &PartsDistanceKernel::inv_stddev, OptionBase::learntoption, 
                  "This is computed when calling method train, and will be used when evaluating distances only if standardize is true.\n"
                  "It crresponds to the inverse of the standard deviation of inputs in the dataset passed to train. But see also min_stddev.\n");

    inherited::declareOptions(ol);
}

Here is the call graph for this function:

static const PPath& PLearn::PartsDistanceKernel::declaringFile ( ) [inline, static]

Reimplemented from PLearn::Kernel.

Definition at line 74 of file PartsDistanceKernel.h.

:
    mutable Vec elementdist;
PartsDistanceKernel * PLearn::PartsDistanceKernel::deepCopy ( CopiesMap copies) const [virtual]

Reimplemented from PLearn::Kernel.

Definition at line 52 of file PartsDistanceKernel.cc.

real PLearn::PartsDistanceKernel::evaluate ( const Vec x1,
const Vec x2 
) const [virtual]

** Subclasses must override this method **

returns K(x1,x2)

Implements PLearn::Kernel.

Definition at line 123 of file PartsDistanceKernel.cc.

References d, PLearn::TVec< T >::data(), i, PLearn::TVec< T >::length(), PLearn::mypow(), n, PLERROR, and PLearn::sortElements().

{
    int l = x1.length();
    if(x2.length() != l)
        PLERROR("vectors x1 and x2 must have the same size");
    
    if(standardize && l!=inv_stddev.length())
        PLERROR("In PartsDistanceKernel::evaluate, size of vectors (%d) does not match size of inv_stddev (%d). Make sure you called train on the kernel with appropriate dataset",l,inv_stddev.length());
        
    elementdist.resize(l);

    const real* px1 = x1.data();
    const real* px2 = x2.data();
    real* pelementdist = elementdist.data();
    real* pinv_stddev = 0;
    if(standardize)
        pinv_stddev = inv_stddev.data();

    char specialn = 0;
    if(n==2)
        specialn = 2;
    else if(n==1)
        specialn = 1;
        
    for(int i=0; i<l; i++)
    {
        real d;
        if(standardize && pinv_stddev[i]>=FLT_MAX )
            d = FLT_MAX;
        else
        {
            d = fabs(px1[i]-px2[i])+epsilon;                
            if(standardize)
                d *= pinv_stddev[i];
            
            switch(specialn)
            {
            case 2:
                d *= d;
                break;
            case 1:
                break;
            default:
                d = mypow(d,n);
            }
        }
        pelementdist[i] = d;
    }
    
    int ps = (partsize>=1 ? (int)partsize :(int)(partsize*l+0.5));
    if(ps<l)
        sortElements(elementdist);
    else
        ps = l;

    real res = 0;

    for(int i=0; i<ps; i++)
    {
        real d = elementdist[i];
        if(d<FLT_MAX)
            res += d;
    }

    if(!pow_distance)
        res = mypow(res, 1/n);

    return res;
}

Here is the call graph for this function:

OptionList & PLearn::PartsDistanceKernel::getOptionList ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 52 of file PartsDistanceKernel.cc.

OptionMap & PLearn::PartsDistanceKernel::getOptionMap ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 52 of file PartsDistanceKernel.cc.

RemoteMethodMap & PLearn::PartsDistanceKernel::getRemoteMethodMap ( ) const [virtual]

Reimplemented from PLearn::Object.

Definition at line 52 of file PartsDistanceKernel.cc.

void PLearn::PartsDistanceKernel::train ( VMat  data) [virtual]

Subclasses may override this method for kernels that can be trained on a dataset prior to being used (e.g.

a Mahalanobis distance which could learn the empirical covariance) Note: in general only the input and weight part of the vmat are used

Reimplemented from PLearn::Kernel.

Definition at line 100 of file PartsDistanceKernel.cc.

References PLearn::computeInputMeanAndStddev(), i, and PLearn::TVec< T >::length().

{    
    if(standardize)
    {
        Vec meanvec;
        Vec stddev;    
        computeInputMeanAndStddev(data, meanvec, stddev, 0.0);
        int l = stddev.length();
        inv_stddev.resize(l);
        for(int i=0; i<l; i++)
        {
            if(stddev[i]<min_stddev)
                inv_stddev[i] = FLT_MAX;
            else
                inv_stddev[i] = 1/stddev[i]; 
        }
    }
}

Here is the call graph for this function:


Member Data Documentation

Reimplemented from PLearn::Kernel.

Definition at line 74 of file PartsDistanceKernel.h.

Definition at line 74 of file PartsDistanceKernel.h.

Definition at line 64 of file PartsDistanceKernel.h.

Referenced by declareOptions().

Definition at line 67 of file PartsDistanceKernel.h.

Referenced by declareOptions().

Definition at line 63 of file PartsDistanceKernel.h.

Referenced by declareOptions().

1 for L1, 2 for L2, etc...

Definition at line 61 of file PartsDistanceKernel.h.

Referenced by declareOptions().

Definition at line 60 of file PartsDistanceKernel.h.

Referenced by declareOptions().

Definition at line 65 of file PartsDistanceKernel.h.

Referenced by declareOptions().

Definition at line 62 of file PartsDistanceKernel.h.

Referenced by declareOptions().


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines