00001
00002
00003 #ifndef RBF_H
00004 #define RBF_H
00005
00006 #include <vector>
00007 #include <iostream>
00008 #include "Object.h"
00009 #include "kmeans.h"
00010
00011 namespace FD {
00012
00013 class RBF : public KMeans {
00014 public:
00015 static float mahalanobis (const float *x, const float *c, const float *y, int len)
00016 {
00017 float sum1=0,sum2=0,sum3=0,sum4=0;
00018 const float *end = x+len;
00019 while (x<end-3)
00020 {
00021 sum1 += *c++ *(*x-*y)*(*x-*y);
00022 x++; y++;
00023 sum2 += *c++ *(*x-*y)*(*x-*y);
00024 x++; y++;
00025 sum3 += *c++ *(*x-*y)*(*x-*y);
00026 x++; y++;
00027 sum4 += *c++ *(*x-*y)*(*x-*y);
00028 x++; y++;
00029 }
00030 while (x<end)
00031 {
00032 sum1 += *c++ *(*x-*y)*(*x-*y);
00033 x++; y++;
00034 }
00035 return (sum1+sum2)+(sum3+sum4);
00036 }
00037
00038 protected:
00039 std::vector<std::vector<float> > covar;
00040
00041
00042 public:
00043 explicit RBF (float (*_dist)(const float *, const float*, int) = euclidian)
00044 : KMeans(_dist)
00045 {}
00046
00047 void train (int codeSize, const std::vector<float *> &data, int len, bool binary=false);
00048
00049 void calcDist (const float *v, float *dist_return) const;
00050
00051 void printOn(std::ostream &out=std::cout) const;
00052 void readFrom (std::istream &in=std::cin);
00053 friend std::istream &operator >> (std::istream &in, RBF &mdl);
00054 };
00055 }
00056 #endif