Original_NNB/MQL5/Include/NeuroNetworksBook/realization/lossfunction.mqh

121 lines
9.6 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:15:14 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| lossfunction.mqh |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| >4:;NG05< 181;8>B5:8 |
//+------------------------------------------------------------------+
#include "defines.mqh"
#include "bufferdouble.mqh"
//+------------------------------------------------------------------+
//| Class CLossFunction |
//| 07=0G5=85: ;0AA @01>BK A DC=:F8O<8 ?>B5@L |
//+------------------------------------------------------------------+
class CLossFunction : public CObject
{
protected:
ENUM_LOSS_FUNCTION eFunction;
virtual double MAD(CArrayDouble *calculated, CArrayDouble *target);
virtual double MSE(CArrayDouble *calculated, CArrayDouble *target);
virtual double LogLoss(CArrayDouble *calculated, CArrayDouble *target);
public:
CLossFunction(void);
~CLossFunction(void) {};
//---
void LossFunction(ENUM_LOSS_FUNCTION function) { eFunction = function; }
ENUM_LOSS_FUNCTION LossFunction(void) { return(eFunction); }
//---
virtual double CaclFunction(CArrayDouble *calculated, CArrayDouble *target);
};
//+------------------------------------------------------------------+
//| >=AB@C:B>@ |
//+------------------------------------------------------------------+
CLossFunction::CLossFunction(void) : eFunction(ENUM_LOSS_LogLoss)
{}
//+------------------------------------------------------------------+
//| 8A?5BG5@A:89 <5B>4 >?@545;5=8O 7=0G5=8O DC=:F88 ?>B5@L |
//+------------------------------------------------------------------+
double CLossFunction::CaclFunction(CArrayDouble *calculated, CArrayDouble *target)
{
double result = DBL_MAX;
//---
switch(eFunction)
{
case ENUM_LOSS_MAD:
result = MAD(calculated, target);
break;
case ENUM_LOSS_MSE:
result = MSE(calculated, target);
break;
case ENUM_LOSS_LogLoss:
result = LogLoss(calculated, target);
break;
default:
break;
}
//---
return result;
}
//+------------------------------------------------------------------+
//| 5B>4 >?@545;5=8O 01A>;NB=>3> A@54=53> >B:;>=5=8O |
//+------------------------------------------------------------------+
double CLossFunction::MAD(CArrayDouble *calculated, CArrayDouble *target)
{
double result = DBL_MAX;
//---
if(CheckPointer(calculated) == POINTER_INVALID || CheckPointer(target) == POINTER_INVALID ||
calculated.Total() > target.Total())
return result;
//---
result = 0;
int total = calculated.Total();
for(int i = 0; i < total; i++)
result += MathAbs(calculated.At(i) - target.At(i));
result /= total;
//---
return result;
}
//+------------------------------------------------------------------+
//| 5B>4 >?@545;5=8O A@54=5:204@0B8G5A:>3> >B:;>=5=8O |
//+------------------------------------------------------------------+
double CLossFunction::MSE(CArrayDouble *calculated, CArrayDouble *target)
{
double result = DBL_MAX;
//---
if(CheckPointer(calculated) == POINTER_INVALID || CheckPointer(target) == POINTER_INVALID ||
calculated.Total() > target.Total())
return result;
//---
result = 0;
int total = calculated.Total();
for(int i = 0; i < total; i++)
result += MathPow(calculated.At(i) - target.At(i), 2);
result /= total;
//---
return result;
}
//+------------------------------------------------------------------+
//| @>AA-M=B@>?8O |
//+------------------------------------------------------------------+
double CLossFunction::LogLoss(CArrayDouble *calculated, CArrayDouble *target)
{
double result = DBL_MAX;
//---
if(CheckPointer(calculated) == POINTER_INVALID || CheckPointer(target) == POINTER_INVALID ||
calculated.Total() > target.Total())
return result;
//---
result = 0;
int total = target.Total();
for(int i = 0; i < total; i++)
result -= target.At(i) * MathLog(calculated.At(i));
//---
return result;
}
//+------------------------------------------------------------------+