|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <QObject>
|
|
|
|
|
#include <QColor>
|
|
|
|
|
#include <QVector>
|
|
|
|
|
#include <QString>
|
|
|
|
|
#include <QMap>
|
|
|
|
|
#include <QMapIterator>
|
|
|
|
|
#include <QMatrix>
|
|
|
|
|
|
|
|
|
|
#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<uint, double>& mapCoeff);
|
|
|
|
|
void setRestrain(bool bRestrain);
|
|
|
|
|
void setSourceData(VVecDouble& vSourceData);
|
|
|
|
|
void setRestrainMatrix(VVecDouble& vRestrainMatrix);
|
|
|
|
|
void setRestrainType(uint nType);
|
|
|
|
|
void setRestrainPoint(VecDouble vRestrainPoint);
|
|
|
|
|
|
|
|
|
|
QMap<uint, double>& 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<uint, double> 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;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|