00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef _REJECTIONSTRATEGY_H___
00012 #define _REJECTIONSTRATEGY_H___
00013
00014 namespace shogun
00015 {
00016
00018 class CRejectionStrategy : public CSGObject
00019 {
00020 public:
00022 CRejectionStrategy() { };
00023
00025 virtual ~CRejectionStrategy() { };
00026
00028 virtual const char* get_name() const
00029 {
00030 return "RejectionStrategy";
00031 };
00032
00034 virtual bool reject(SGVector<float64_t> outputs) const = 0;
00035
00036 };
00037
00039 class CThresholdRejectionStrategy : public CRejectionStrategy
00040 {
00041 public:
00042
00044 CThresholdRejectionStrategy() :
00045 CRejectionStrategy(), m_threshold(0.0) { };
00046
00048 CThresholdRejectionStrategy(float64_t threshold) :
00049 CRejectionStrategy(), m_threshold(threshold) { };
00050
00051 virtual ~CThresholdRejectionStrategy() {};
00052
00054 virtual const char* get_name() const
00055 {
00056 return "ThresholdRejectionStrategy";
00057 }
00058
00060 virtual bool reject(SGVector<float64_t> outputs) const
00061 {
00062 for (int32_t i=0; i<outputs.vlen; i++)
00063 {
00064 if (outputs[i]>m_threshold)
00065 return false;
00066 }
00067 return true;
00068 }
00069
00070 protected:
00071
00073 float64_t m_threshold;
00074
00075
00076 };
00077
00078 static const float64_t Q_test_statistic_values[10][8] =
00079 {
00080
00081 {0.713,0.683,0.637,0.597,0.551,0.477,0.409,0.325},
00082 {0.627,0.604,0.568,0.538,0.503,0.450,0.401,0.339},
00083 {0.539,0.517,0.484,0.456,0.425,0.376,0.332,0.278},
00084 {0.490,0.469,0.438,0.412,0.382,0.337,0.295,0.246},
00085 {0.460,0.439,0.410,0.384,0.355,0.312,0.272,0.226},
00086 {0.437,0.417,0.388,0.363,0.336,0.294,0.256,0.211},
00087 {0.422,0.403,0.374,0.349,0.321,0.280,0.244,0.201},
00088 {0.408,0.389,0.360,0.337,0.310,0.270,0.234,0.192},
00089 {0.397,0.377,0.350,0.326,0.300,0.261,0.226,0.185},
00090 {0.387,0.368,0.341,0.317,0.292,0.253,0.219,0.179}
00091 };
00092
00097 class CDixonQTestRejectionStrategy : public CRejectionStrategy
00098 {
00099 public:
00100
00102 CDixonQTestRejectionStrategy() :
00103 CRejectionStrategy()
00104 {
00105 s_index = 3;
00106 }
00107
00112 CDixonQTestRejectionStrategy(float64_t significance_level) :
00113 CRejectionStrategy()
00114 {
00115 if (significance_level==0.001)
00116 s_index = 0;
00117 else if (significance_level==0.002)
00118 s_index = 1;
00119 else if (significance_level==0.005)
00120 s_index = 2;
00121 else if (significance_level==0.01)
00122 s_index = 3;
00123 else if (significance_level==0.02)
00124 s_index = 4;
00125 else if (significance_level==0.05)
00126 s_index = 5;
00127 else if (significance_level==0.1)
00128 s_index = 6;
00129 else if (significance_level==0.2)
00130 s_index = 7;
00131 else SG_ERROR("Given significance level is not supported");
00132 }
00133
00134 virtual ~CDixonQTestRejectionStrategy()
00135 {
00136 }
00137
00139 virtual const char* get_name() const
00140 {
00141 return "DixonQTestRejectionStrategy";
00142 }
00143
00145 virtual bool reject(SGVector<float64_t> outputs) const
00146 {
00147 int32_t N = outputs.vlen;
00148 if (N<10 || N>100)
00149 SG_ERROR("Given number of classes is not supported.");
00150
00151 int32_t Ni = N/10 - 1;
00152
00153 SGVector<float64_t> outputs_local = outputs.clone();
00154 CMath::qsort(outputs_local.vector,N);
00155
00156 float64_t Q = 0.0;
00157 if (N==10)
00158 Q = (outputs[N-1]-outputs[N-2])/(outputs[N-1]-outputs[0]);
00159
00160 if (N>=20)
00161 Q = (outputs[N-1]-outputs[N-4])/(outputs[N-1]-outputs[2]);
00162
00163 if (Q>Q_test_statistic_values[Ni][s_index])
00164 return false;
00165
00166 return true;
00167 }
00168
00169 private:
00170
00171 int32_t s_index;
00172
00173 };
00174
00175 }
00176 #endif