MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/algorithm/LinearRegression.hh

114 lines
6.6 KiB
C++
Raw Normal View History

2024-06-07 11:12:56 +03:00
/*!\file
* \brief Файл содержит модуль линейной регрессии.
*/
/*
* LinearRegression.h
*
* Created on: 23 нояб. 2016 г.
* Author: titov
*/
#ifndef SOURCE_ALGORITHM_LINEARREGRESSION_H_
#define SOURCE_ALGORITHM_LINEARREGRESSION_H_
#include "../math/math_inc.hh"
#include <memory_resource>
namespace algorithm {
//todo refactoring for using stdlib;
class LinearRegression {
private:
float * * data; //!<Выборка данных для расчета гипотезы. Сначала наборы, затем признаки: data[row][col].
float * Theta; //!<Массив коэффициентов гипотезы.
float * TempTheta; //!<Массив коэффициентов гипотезы на текущей итерации.
float * result; //!<Истинное значение.
unsigned int colData; //!<Количество признаков в каждой выборке.
unsigned int rowData; //!<Количество наборов данных в обучающей выборке.
unsigned int colIndex; //!<Индекс текущего признака.
unsigned int rowIndex; //!<Индекс текущего набора данных.
float alfa; //!<Скорость обучения.
unsigned int numCalculation; //!<Количество итераций для обучения.
bool startCalculation; //!<Признак начала обучения.
LinearRegression & operator=(const algorithm::LinearRegression&) = delete;
LinearRegression(LinearRegression &) = delete;
std::pmr::memory_resource * memory;
protected:
/*!\brief Функция осуществляет расчет ошибки между гипотезой и истиными данными.
* \param[in] hp - Рассчитаное значение гипотезы.
* \param[in] res - Истинные данные.
* \return Ошибка между гипотезой и истиными данными.
* Функция может отличаться для особых случаев. */
virtual float errorCalc(float hp, float res) const = 0;
/*!\brief Функция осуществляет один шаг обучения.
* Функция может отличаться для особых случаев. */
virtual bool update();
public:
/*!\brief Конструктор. Выделение памяти, инициализация переменных.
* \param[in] rowData - Количество наборов данных.
* \param[in] colData - Количество признаков в каждой выборке. */
LinearRegression( unsigned int rowData, unsigned int colData, std::pmr::memory_resource * );
virtual ~LinearRegression();
/*!\brief Функция инициализации параметров обучения.
* \param[in] initAlfa - Начальная скорость обучения.
* \param[in] initTheta - Массив начальных значений коэффицентов гипотезы.
* \param[in] numCalc - Количество итераций для обучения.
* Функцию необходимо вызвать перед началом расчетов. */
bool init(float initAlfa, float * initTheta, unsigned int numCalc);
/*!\brief Функция добавления данных в обучающую выборку.
* \param[in] data - Выборка набора признаков.
* \param[in] result - Истинное значение.
* \return Признак завершения сбора данных.
*
* Функция добавляет данные в массив до тех пор пока массив не будет полон.
* Функция возвращает false пока добавляет данные, и true когда массив полон и данные не добавлены. */
bool addData(float * data, float result);
/*!\brief Функция возвращает признак завершения сбора данных.
* \return Признак завершения сбора данных.
* Функция возвращает true когда массив полон. */
bool isFull() const { return rowIndex == rowData; }
/*!\brief Функция запускает расчет данных.
* \return Признак успешного запуска расчетов.
* Функция возвращает true по фронту запуска расчета. */
bool startCalc() { if(!startCalculation) { startCalculation = true; return true; } else { return false; }};
/*!\brief Функция останавливает расчет данных.
* \return Признак успешной остановки расчетов.
* Функция возвращает true по фронту остановки расчета. */
bool stopCalc() { if(startCalculation) { startCalculation = false; return true; } else { return false; }};
/*!\brief Функция проверяет завершен ли расчет данных.
* \return Признак завершения расчетов.
* Функция возвращает true когда расчет завершен. */
bool isFinish() const { return (numCalculation == 0); }
/*!\brief Функция осуществляет расчет данных. Процесс.
* \return Признак завершения расчетов.
* Функция возвращает true когда производится расчет.
* Возможно функция имеет внутри множество расчетов поэтому запускать ее следует только в основном цикле. */
bool calculation();
/*!\brief Функция возращает полученные коэффициенты гипотезы по номеру.
* \param[in] idTheta - идентификационный номер коэффициента гипотезы.
* \return Значение коэффициента гипотезы. */
float getTheta(unsigned int idTheta) const;
float getError() const;
};
/*!\Класс реализует алгоритм машинного обучения линейной регрессией, при этом данные находятся на окружности длинной 2 пи.
*
*/
class LinearRegressionCirc : public LinearRegression {
public:
LinearRegressionCirc(unsigned int rowData, unsigned int colData, std::pmr::memory_resource * mem ) : LinearRegression(rowData, colData, mem) {};
protected:
virtual float errorCalc(float hp, float res) const override;
};
}
#endif /* SOURCE_ALGORITHM_LINEARREGRESSION_H_ */