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

SigmoidModel.cpp

Go to the documentation of this file.
00001 //===========================================================================
00041 //===========================================================================
00042 
00043 
00044 #include <SharkDefs.h>
00045 #include <ReClaM/SigmoidModel.h>
00046 
00047 
00048 SigmoidModel::SigmoidModel(double A, double B)
00049 {
00050     inputDimension = 1;
00051     outputDimension = 1;
00052 
00053     parameter.resize(2, false);
00054     parameter(0) = A;
00055     parameter(1) = B;
00056 }
00057 
00058 SigmoidModel::~SigmoidModel()
00059 {
00060 }
00061 
00062 
00063 void SigmoidModel::model(const Array<double>& input, Array<double> &output)
00064 {
00065     if (input.ndim() == 1)
00066     {
00067         SIZE_CHECK(input.dim(0) == 1);
00068         output.resize(1, false);
00069         output(0) = 1.0 / (1.0 + exp(parameter(0) * input(0) + parameter(1)));
00070     }
00071     else if (input.ndim() == 2)
00072     {
00073         int j, jc = input.dim(0);
00074         SIZE_CHECK(input.dim(1) == 1);
00075         output.resize(jc, 1, false);
00076         for (j = 0; j < jc; j++)
00077         {
00078             output(j, 0) = 1.0 / (1.0 + exp(parameter(0) * input(j, 0) + parameter(1)));
00079         }
00080     }
00081     else throw SHARKEXCEPTION("[SigmoidModel::model] invalid number of dimensions.");
00082 }
00083 
00084 void SigmoidModel::modelDerivative(const Array<double>& input, Array<double>& derivative)
00085 {
00086     if (input.ndim() == 1)
00087     {
00088         SIZE_CHECK(input.dim(0) == 1);
00089         derivative.resize(1, 2, false);
00090         double e = exp(parameter(0) * input(0) + parameter(1));
00091         double f = 1.0 / (1.0 + e);
00092         double d = -f * f * e;
00093         derivative(0, 0) = d * input(0);
00094         derivative(0, 1) = d;
00095     }
00096     else throw SHARKEXCEPTION("[SigmoidModel::modelDerivative] invalid number of dimensions.");
00097 }
00098 
00099 void SigmoidModel::modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative)
00100 {
00101     if (input.ndim() == 1)
00102     {
00103         SIZE_CHECK(input.dim(0) == 1);
00104         derivative.resize(1, 2, false);
00105         output.resize(1, false);
00106         double e = exp(parameter(0) * input(0) + parameter(1));
00107         double f = 1.0 / (1.0 + e);
00108         double d = -f * f * e;
00109         output(0) = f;
00110         derivative(0, 0) = d * input(0);
00111         derivative(0, 1) = d;
00112     }
00113     else throw SHARKEXCEPTION("[SigmoidModel::modelDerivative] invalid number of dimensions.");
00114 }
00115 
00116 
00118 
00119 
00120 SimpleSigmoidModel::SimpleSigmoidModel(double s)
00121 {
00122     inputDimension = 1;
00123     outputDimension = 1;
00124 
00125     parameter.resize(1, false);
00126     parameter(0) = s;
00127 }
00128 
00129 SimpleSigmoidModel::~SimpleSigmoidModel()
00130 {
00131 }
00132 
00133 
00134 void SimpleSigmoidModel::model(const Array<double>& input, Array<double> &output)
00135 {
00136     if (input.ndim() == 1)
00137     {
00138         SIZE_CHECK(input.dim(0) == 1);
00139         output.resize(1, false);
00140         double x = parameter(0) * input(0);
00141         output(0) = 0.5 * x / (1.0 + fabs(x)) + 0.5;
00142     }
00143     else if (input.ndim() == 2)
00144     {
00145         int j, jc = input.dim(0);
00146         SIZE_CHECK(input.dim(1) == 1);
00147         output.resize(jc, 1, false);
00148         for (j = 0; j < jc; j++)
00149         {
00150             double x = parameter(0) * input(j, 0);
00151             output(j, 0) = 0.5 * x / (1.0 + fabs(x)) + 0.5;
00152         }
00153     }
00154     else throw SHARKEXCEPTION("[SimpleSigmoidModel::model] invalid number of dimensions.");
00155 }
00156 
00157 void SimpleSigmoidModel::modelDerivative(const Array<double>& input, Array<double>& derivative)
00158 {
00159     if (input.ndim() == 1)
00160     {
00161         SIZE_CHECK(input.dim(0) == 1);
00162         derivative.resize(1, 1, false);
00163         double N = 1.0 + fabs(parameter(0) * input(0));
00164         derivative(0, 0) = 0.5 * input(0) / (N * N);
00165     }
00166     else throw SHARKEXCEPTION("[SimpleSigmoidModel::modelDerivative] invalid number of dimensions.");
00167 }
00168 
00169 void SimpleSigmoidModel::modelDerivative(const Array<double>& input, Array<double>& output, Array<double>& derivative)
00170 {
00171     if (input.ndim() == 1)
00172     {
00173         SIZE_CHECK(input.dim(0) == 1);
00174         derivative.resize(1, 1, false);
00175         output.resize(1, false);
00176         double x = parameter(0) * input(0);
00177         double N = 1.0 + fabs(x);
00178         output(0) = 0.5 * (x / N + 1.0);
00179         derivative(0, 0) = 0.5 * input(0) / (N * N);
00180     }
00181     else throw SHARKEXCEPTION("[SimpleSigmoidModel::modelDerivative] invalid number of dimensions.");
00182 }
00183 
00184 bool SimpleSigmoidModel::isFeasible()
00185 {
00186     return (parameter(0) > 0.0);
00187 }