Shark Machine Learning Library
  • About Shark
  • Sourceforge
    • Project Summary
    • Downloads
    • Subversion Repository
  • Getting Started
  • Tutorials
  • FAQ
  • Main Modules
    • ReClaM
    • EALib
    • MOO-EALib
    • Fuzzy
  • Tools
    • Mixture
    • Array
    • Rng
    • LinAlg
    • FileUtil
  • Main Page
  • Related Pages
  • Classes

LinearEquation.cpp

Go to the documentation of this file.
00001 //===========================================================================
00042 //===========================================================================
00043 
00044 
00045 #include <ReClaM/LinearEquation.h>
00046 
00047 
00048 LinearEquation::LinearEquation(const Array<double>& mat, const Array<double>& vec)
00049 : matrix(mat)
00050 , vector(vec)
00051 {
00052     if (mat.ndim() != 2
00053             || vec.ndim() != 1
00054             || mat.dim(0) != vec.dim(0)) throw SHARKEXCEPTION("[LinearEquationError::LinearEquationError] dimension conflict");
00055 
00056     parameter.resize(mat.dim(1), false);
00057     parameter = 0.0;
00058 }
00059 
00060 LinearEquation::~LinearEquation()
00061 {
00062 }
00063 
00064 
00065 void LinearEquation::model(const Array<double>& input, Array<double>& output)
00066 {
00067     throw SHARKEXCEPTION("[LinearEquation::model] this is not a data processing model");
00068 }
00069 
00070 double LinearEquation::error()
00071 {
00072     int i, ic = matrix.dim(0);
00073     int p, pc = matrix.dim(1);
00074 
00075     double ret = 0.0;
00076     for (i=0; i<ic; i++)
00077     {
00078         double sum = 0.0;
00079         for (p=0; p<pc; p++) sum += matrix(i, p) * getParameter(p);
00080         double diff = sum - vector(i);
00081         ret += diff * diff;
00082     }
00083     return ret;
00084 }
00085 
00086 double LinearEquation::errorDerivative(Array<double>& derivative)
00087 {
00088     int i, ic = matrix.dim(0);
00089     int p, pc = matrix.dim(1);
00090     double ret = 0.0;
00091     derivative.resize(pc, false);
00092     Array<double> tmp(ic);
00093     for (i=0; i<ic; i++)
00094     {
00095         double sum = 0.0;
00096         for (p=0; p<pc; p++) sum += matrix(i, p) * getParameter(p);
00097         double diff = sum - vector(i);
00098         tmp(i) = 2.0 * diff;
00099         ret += diff * diff;
00100     }
00101     for (p=0; p<pc; p++)
00102     {
00103         double sum = 0.0;
00104         for (i=0; i<ic; i++) sum += matrix(i, p) * tmp(i);
00105         derivative(p) = sum;
00106     }
00107     return ret;
00108 }
00109 
00110 double LinearEquation::error(Model& model, const Array<double>& input, const Array<double>& target)
00111 {
00112     return error();
00113 }
00114 
00115 double LinearEquation::errorDerivative(Model& model, const Array<double>& input, const Array<double>& target, Array<double>& derivative)
00116 {
00117     return errorDerivative(derivative);
00118 }
00119 
00120 void LinearEquation::getSolution(Array<double>& solution)
00121 {
00122     solution = parameter;
00123 }
00124