NeuroNetworksBook/Include/realization/lossfunction.mqh
super.admin 4a9222852c convert
2025-05-30 16:12:34 +02:00

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;
}
};
//+------------------------------------------------------------------+