Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __LOSS_H_
00012 #define __LOSS_H_
00013
00014 #include <shogun/lib/common.h>
00015 #include <shogun/io/SGIO.h>
00016
00017
00018
00019
00020
00021
00022 #define HINGELOSS 1
00023 #define SMOOTHHINGELOSS 2
00024 #define SQUAREDHINGELOSS 3
00025 #define LOGLOSS 10
00026 #define LOGLOSSMARGIN 11
00027
00028
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