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

114 lines
4.7 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_ */