MotorControlModuleSDFM_TMS3.../Projects/EFC_Communication/UMLibrary/algorithm/LinearRegression.hh
2024-06-07 11:12:56 +03:00

114 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!\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_ */