//相对平均提高标准 double RelativeMeanImprovementCriterion::GetValue(const OptimizerState& state, std::ostream& message) { double retVal = numeric_limits<double>::infinity(); //如果已经记录了5个以上损失值了 if (prevVals.size() > 5) { //取队首的值 double prevVal = prevVals.front(); //如果已经有10个值了,就把队首的值删掉 if (prevVals.size() == 10) prevVals.pop_front(); //用队首的值减去最新的值,除以队列的长度,得到队列的平均提高 double averageImprovement = (prevVal - state.GetValue()) / prevVals.size(); //用队列的平均提高除以当前值得到提高相对于当前值的比例 double relAvgImpr = averageImprovement / fabs(state.GetValue()); message << setprecision(4) << scientific << right; message << " (" << setw(10) << relAvgImpr << ") " << flush; //将提高比例保存到retVal中 retVal = relAvgImpr; } else { message << " (wait for five iters) " << flush; } //将当前迭代的损失添加到损失列表尾部 prevVals.push_back(state.GetValue()); //返回提高的比例 return retVal; }
double RelativeMeanImprovementCriterion::GetValue(const OptimizerState& state, std::ostream& message) { double retVal = numeric_limits<double>::infinity(); if (prevVals.size() > 5) { double prevVal = prevVals.front(); if (prevVals.size() == 10) prevVals.pop_front(); double averageImprovement = (prevVal - state.GetValue()) / prevVals.size(); double relAvgImpr = averageImprovement / fabs(state.GetValue()); message << setprecision(4) << scientific << right; message << " (" << setw(10) << relAvgImpr << ") " << flush; retVal = relAvgImpr; } else { message << " (wait for five iters) " << flush; } prevVals.push_back(state.GetValue()); return retVal; }