114 lines
6.6 KiB
C++
114 lines
6.6 KiB
C++
/*!\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_ */
|