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