Loss.h

Go to the documentation of this file.
00001 /*
00002  * This program is free software; you can redistribute it and/or modify
00003  * it under the terms of the GNU General Public License as published by
00004  * the Free Software Foundation; either version 3 of the License, or
00005  * (at your option) any later version.
00006  *
00007  * Written (W) 2011 Siddharth Kherada
00008  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
00009  */
00010 
00011 #ifndef __LOSS_H_
00012 #define __LOSS_H_
00013 
00014 #include <shogun/lib/common.h>
00015 #include <shogun/io/SGIO.h>
00016 //#include <shogun/mathematics/lapack.h>
00017 //#include <shogun/base/SGObject.h>
00018 //#include <shogun/base/Parallel.h>
00019 
00020 
00021 // Available losses
00022 #define HINGELOSS 1
00023 #define SMOOTHHINGELOSS 2
00024 #define SQUAREDHINGELOSS 3
00025 #define LOGLOSS 10
00026 #define LOGLOSSMARGIN 11
00027 
00028 // Select loss
00029 #define LOSS HINGELOSS
00030 
00031 
00032 namespace shogun
00033 {
00036 class CLoss
00037 {
00038     public:
00042 
00043         CLoss();
00044 
00046         virtual ~CLoss();
00048 
00051         static inline float64_t loss(float64_t z)
00052         {
00053 #if LOSS == LOGLOSS
00054             if (z >= 0)
00055                 return log(1+exp(-z));
00056             else
00057                 return -z + log(1+exp(z));
00058 #elif LOSS == LOGLOSSMARGIN
00059             if (z >= 1)
00060                 return log(1+exp(1-z));
00061             else
00062                 return 1-z + log(1+exp(z-1));
00063 #elif LOSS == SMOOTHHINGELOSS
00064             if (z < 0)
00065                 return 0.5 - z;
00066             if (z < 1)
00067                 return 0.5 * (1-z) * (1-z);
00068             return 0;
00069 #elif LOSS == SQUAREDHINGELOSS
00070             if (z < 1)
00071                 return 0.5 * (1 - z) * (1 - z);
00072             return 0;
00073 #elif LOSS == HINGELOSS
00074             if (z < 1)
00075                 return 1 - z;
00076             return 0;
00077 #else
00078 # error "Undefined loss"
00079 #endif
00080         }
00081 
00085         static inline float64_t dloss(float64_t z)
00086         {
00087 #if LOSS == LOGLOSS
00088             if (z < 0)
00089                 return 1 / (exp(z) + 1);
00090             float64_t ez = exp(-z);
00091             return ez / (ez + 1);
00092 #elif LOSS == LOGLOSSMARGIN
00093             if (z < 1)
00094                 return 1 / (exp(z-1) + 1);
00095             float64_t ez = exp(1-z);
00096             return ez / (ez + 1);
00097 #elif LOSS == SMOOTHHINGELOSS
00098             if (z < 0)
00099                 return 1;
00100             if (z < 1)
00101                 return 1-z;
00102             return 0;
00103 #elif LOSS == SQUAREDHINGELOSS
00104             if (z < 1)
00105                 return (1 - z);
00106             return 0;
00107 #else
00108             if (z < 1)
00109                 return 1;
00110             return 0;
00111 #endif
00112         }
00113 };
00114 }
00115 #endif
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

SHOGUN Machine Learning Toolbox - Documentation