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