124 lines
12 KiB
MQL5
124 lines
12 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| lossfunction.mqh |
|
|
//| Copyright 2021, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2021, MetaQuotes Ltd."
|
|
#property link "https://www.mql5.com"
|
|
//+------------------------------------------------------------------+
|
|
//| Подключаем библиотеки |
|
|
//+------------------------------------------------------------------+
|
|
#include "defines.mqh"
|
|
#include "bufferdouble.mqh"
|
|
//+------------------------------------------------------------------+
|
|
//| Class CLossFunction |
|
|
//| Назначение: Базовый класс для работы с функциями потерь |
|
|
//+------------------------------------------------------------------+
|
|
class CLossFunction : public CObject
|
|
{
|
|
protected:
|
|
//--- защищённый конструктор не позволит создавать объект CLossFunction, от данного класса можно только наследоваться
|
|
CLossFunction(void) { }
|
|
CLossFunction(const CLossFunction &loss)=delete; // копирование запрещено
|
|
public:
|
|
virtual ENUM_LOSS_FUNCTION LossFunction(void) const=0;
|
|
virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target)=0;
|
|
//+------------------------------------------------------------------+
|
|
//| Вспомогательная функция для проверки параметров в Calculate |
|
|
//+------------------------------------------------------------------+
|
|
bool CheckParameters(const CBufferDouble *calculated,const CBufferDouble *target) const
|
|
{
|
|
return(calculated && target && calculated.Rows()==target.Rows() && calculated.Cols()==target.Cols());
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Mean squared error (MSE) |
|
|
//+------------------------------------------------------------------+
|
|
class CLoss_MSE final : public CLossFunction
|
|
{
|
|
public:
|
|
//+------------------------------------------------------------------+
|
|
//| Получение типа функции |
|
|
//+------------------------------------------------------------------+
|
|
virtual ENUM_LOSS_FUNCTION LossFunction(void) const override
|
|
{
|
|
return LOSS_MSE;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Расчёт ошибки |
|
|
//+------------------------------------------------------------------+
|
|
virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target) override
|
|
{
|
|
//--- проверим параметры
|
|
if(!CheckParameters(calculated,target))
|
|
return DBL_MAX;
|
|
//---
|
|
MATRIX m = calculated.m_mMatrix - target.m_mMatrix;
|
|
m = m * m;
|
|
//---
|
|
return m.Sum() / (m.Rows()*m.Cols());
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CLoss_MAD final : public CLossFunction
|
|
{
|
|
public:
|
|
//+------------------------------------------------------------------+
|
|
//| Получение типа функции |
|
|
//+------------------------------------------------------------------+
|
|
virtual ENUM_LOSS_FUNCTION LossFunction(void) const override
|
|
{
|
|
return LOSS_MAE;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Расчёт ошибки |
|
|
//+------------------------------------------------------------------+
|
|
virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target) override
|
|
{
|
|
//--- проверим параметры
|
|
if(!CheckParameters(calculated,target))
|
|
return DBL_MAX;
|
|
//---
|
|
MATRIX m=calculated.m_mMatrix - target.m_mMatrix;
|
|
|
|
for(ulong r=0; r<m.Rows(); r++)
|
|
for(ulong c=0; c<m.Cols(); c++)
|
|
m[r, c] = MathAbs(m[r, c]);
|
|
//---
|
|
return m.Sum() / (m.Rows() * m.Cols());
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| |
|
|
//+------------------------------------------------------------------+
|
|
class CLoss_BCE final : public CLossFunction
|
|
{
|
|
public:
|
|
//+------------------------------------------------------------------+
|
|
//| Получение типа функции |
|
|
//+------------------------------------------------------------------+
|
|
virtual ENUM_LOSS_FUNCTION LossFunction(void) const override
|
|
{
|
|
return LOSS_BCE;
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Расчёт ошибки |
|
|
//+------------------------------------------------------------------+
|
|
virtual double Calculate(const CBufferDouble *calculated,const CBufferDouble *target) override
|
|
{
|
|
//--- проверим параметры
|
|
if(!CheckParameters(calculated,target))
|
|
return DBL_MAX;
|
|
//---
|
|
double result = 0;
|
|
|
|
for(ulong r = 0; r < calculated.m_mMatrix.Rows(); r++)
|
|
for(ulong c = 0; c < calculated.m_mMatrix.Cols(); c++)
|
|
result -= target.m_mMatrix[r, c] * MathLog(calculated.m_mMatrix[r, c]);
|
|
//---
|
|
return result;
|
|
}
|
|
};
|
|
//+------------------------------------------------------------------+
|