SHOGUN
v3.2.0
|
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