// Copyright (C) 1999 Jean-Marc Valin
#include "RBF.h"
#include "ObjectParser.h"
#include "misc.h"
using namespace std;
namespace FD {
DECLARE_TYPE(RBF)
//@implements VQ
void RBF::train (int codeSize, const vector<float *> &data/*, const vector<float *> &data_out*/, int len, bool binary)
{
KMeans::train (codeSize, data, len, binary);
covar.resize(nbClasses());
vector<int> counts(covar.size(), 0);
for (int i=0;i<covar.size();i++)
covar[i].resize(len,0);
for (int i=0;i<data.size();i++)
{
int id = getClassID(data[i]);
counts[id]++;
for (int j=0;j<len;j++)
covar[id][j] += sqr(data[i][j] - means[id][j]);
}
for (int i=0;i<covar.size();i++)
{
float scale = 1.0/counts[i];
for (int j=0;j<len;j++)
covar[i][j] = 1/(covar[i][j]*scale);
}
//Calculate X'X and X'Y
//invert matrix
}
void RBF::calcDist (const float *v, float *dist_return) const
{
for (int i=0;i<means.size();i++)
{
dist_return[i] = mahalanobis(&means[i][0], &covar[i][0], v, length);
}
}
void RBF::printOn(ostream &out) const
{
out << "<RBF " << endl;
out << "<means " << means << ">" << endl;
out << "<covar " << covar << ">" << endl;
out << "<length " << length << ">" << endl;
out << ">\n";
}
void RBF::readFrom (istream &in)
{
string tag;
while (1)
{
char ch;
in >> ch;
if (ch == '>') break;
else if (ch != '<')
throw new ParsingException ("RBF::readFrom : Parse error: '<' expected");
in >> tag;
if (tag == "length")
in >> length;
else if (tag == "covar")
in >> covar;
else if (tag == "means")
in >> means;
else
throw new ParsingException ("RBF::readFrom : unknown argument: " + tag);
if (!in) throw new ParsingException ("RBF::readFrom : Parse error trying to build " + tag);
in >> tag;
if (tag != ">")
throw new ParsingException ("RBF::readFrom : Parse error: '>' expected ");
}
}
istream &operator >> (istream &in, RBF &mdl)
{
if (!isValidType(in, "RBF")) return in;
mdl.readFrom(in);
return in;
}
}//namespace FD
syntax highlighted by Code2HTML, v. 0.9.1