SHOGUN  v2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Loss.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 2011 Siddharth Kherada
8  * Copyright (C) 1999-2009 Fraunhofer Institute FIRST and Max-Planck-Society
9  */
10 
11 #ifndef __LOSS_H_
12 #define __LOSS_H_
13 
14 #include <shogun/lib/common.h>
15 #include <shogun/io/SGIO.h>
16 //#include <shogun/mathematics/lapack.h>
17 //#include <shogun/base/SGObject.h>
18 //#include <shogun/base/Parallel.h>
19 
20 
21 // Available losses
22 #define HINGELOSS 1
23 #define SMOOTHHINGELOSS 2
24 #define SQUAREDHINGELOSS 3
25 #define LOGLOSS 10
26 #define LOGLOSSMARGIN 11
27 
28 // Select loss
29 #define LOSS HINGELOSS
30 
31 
32 namespace shogun
33 {
36 class CLoss
37 {
38  public:
42 
43  CLoss();
44 
46  virtual ~CLoss();
48 
51  static inline float64_t loss(float64_t z)
52  {
53 #if LOSS == LOGLOSS
54  if (z >= 0)
55  return log(1+exp(-z));
56  else
57  return -z + log(1+exp(z));
58 #elif LOSS == LOGLOSSMARGIN
59  if (z >= 1)
60  return log(1+exp(1-z));
61  else
62  return 1-z + log(1+exp(z-1));
63 #elif LOSS == SMOOTHHINGELOSS
64  if (z < 0)
65  return 0.5 - z;
66  if (z < 1)
67  return 0.5 * (1-z) * (1-z);
68  return 0;
69 #elif LOSS == SQUAREDHINGELOSS
70  if (z < 1)
71  return 0.5 * (1 - z) * (1 - z);
72  return 0;
73 #elif LOSS == HINGELOSS
74  if (z < 1)
75  return 1 - z;
76  return 0;
77 #else
78 # error "Undefined loss"
79 #endif
80  }
81 
85  static inline float64_t dloss(float64_t z)
86  {
87 #if LOSS == LOGLOSS
88  if (z < 0)
89  return 1 / (exp(z) + 1);
90  float64_t ez = exp(-z);
91  return ez / (ez + 1);
92 #elif LOSS == LOGLOSSMARGIN
93  if (z < 1)
94  return 1 / (exp(z-1) + 1);
95  float64_t ez = exp(1-z);
96  return ez / (ez + 1);
97 #elif LOSS == SMOOTHHINGELOSS
98  if (z < 0)
99  return 1;
100  if (z < 1)
101  return 1-z;
102  return 0;
103 #elif LOSS == SQUAREDHINGELOSS
104  if (z < 1)
105  return (1 - z);
106  return 0;
107 #else
108  if (z < 1)
109  return 1;
110  return 0;
111 #endif
112  }
113 };
114 }
115 #endif

SHOGUN Machine Learning Toolbox - Documentation