#pragma once #include #include #include #include #include #include #include #include "iAlgRegress_global.h" #include "zxAlgMatrix.h" // 拟合算法 class I_ALGREGRESS_EXPORT zxAlgRegress { public: zxAlgRegress(); virtual ~zxAlgRegress(); // 组织表达式 virtual QString getExpStr() = 0; public: // 过滤掉无效数据。 virtual bool setFiltering() = 0; virtual bool cal() = 0; // 将参数约束、数据源等转换为线性回归方程可以处理的形式。 virtual bool setTransformation() = 0; // 将线性回归方程计算完成的参数反向变换成当前回归类型的参数。 virtual bool setReciprocalTransformation() = 0; // 根据回归线进行计算 virtual double getValue(VecDouble& vMatrixX) = 0; double getValue(double d) { VecDouble vMatrixX; vMatrixX.push_back(d); return getValue(vMatrixX); } public: void setCoeff(QMap& mapCoeff); void setRestrain(bool bRestrain); void setSourceData(VVecDouble& vSourceData); void setRestrainMatrix(VVecDouble& vRestrainMatrix); void setRestrainType(uint nType); void setRestrainPoint(VecDouble vRestrainPoint); QMap& getCoeff(); bool isRestrain(); VVecDouble getSourceData(); VVecDouble getRestrainMatrix(); double getDeterCoff(); uint getValidDataNum(); uint getDataNum(); protected: double m_dDeterCoff; // 决定系数R2 bool m_bModeLimit; // 是否为约束回归 uint m_nDataNum; // 数据个数 uint m_nValidDataNum; // 有效数据个数 uint m_nTypeLimit;// 约束类型,0:定点;1:定参数;2:矩阵约束。 // 所有项的系数。map<参数编号, 对应项系数> // 线性下 0:乘积项系数 1:常数项系数 // 指数下 0:乘积项系数 1:指数项系数 // 对数下 0:乘积项系数 1:常数项系数 // 乘幂下 0:乘积项系数 1:指数项系数 // 特殊回归模型的参数编号见具体的类。 QMap m_mapCoeff; // 约束点。第一个为Y0,再依次为X10、X20、X30... VecDouble m_vRestrainPoint; // 源数据。 // 外部的vector的每一项,指的是一组观察变量。 // 内部的每一个vector指的是每一组观察变量的每一个子项: Yi、Xi1、Xi2、Xi3...... VVecDouble m_vSourceData; // 约束矩阵 // 假定回归方程的待求参数向量为 C 。C的排序为:由低次向高次参数。 // C受矩阵约束: AC = b 。 A的排序与C相同。 // A 为 k * p 矩阵,并且秩为 k , C 为 p * 1 矩阵,b 为 k * 1 矩阵,即C、b为列向量。 // 外部的vector的每一项,指的是一组约束条件,即约束方程组中的一个方程。 // 内部的vector的每一项,指的是一组约束条件中的每一个参数。 // 内部的vector的排序方式为 : bi 、Ai1、Ai2、Ai3...... VVecDouble m_vRestrainMatrix; };