求回归方程

#define NUM 14

int main()
{
    int n = 14;
    //回归分析
    int temperature[] = { 29,28,34,31,25,29,32,31,24,33,25,31,26,30 };
    int sales[] = { 77,62,93,84,59,64,80,75,58,91,51,73,65,84 };
    //step1:画散点图,根据图形推测出可能方程
    Mat scatter(100, 100, CV_8UC1, Scalar(255, 255, 255));
    for (int i = 0; i < n; i++)
    {
        scatter.at<uchar>(temperature[i], sales[i]) = 0;
    }
    imshow("scatter", scatter);
    waitKey(0);
    //step2:用最小二乘法求方程
    float averageT,averageS;
    int sum1 =0,sum2=0;
    for (int i = 0; i < n; i++)
    {
        sum1 += temperature[i];
        sum2 += sales[i];
    }
    averageT = float(sum1) / n;
    averageS = float(sum2) / n;

    float Sxx=0, Syy=0, Sxy=0;
    for (int i = 0; i < n; i++)
    {
        Sxx += (temperature[i] - averageT)*(temperature[i] - averageT);    //x的离差平方和
        Syy += (sales[i] - averageS)*(sales[i] - averageS);                //y的离差平方和
        Sxy += (temperature[i] - averageT)*(sales[i] - averageS);         //x和y的离差积和
    }
    
    //根据公式推导,可得出 a = Sxy/Sxx , b = averageS - averageT*a;
    //公式推导步骤:求残差平方和Se,可用最小二乘法,即y的观测值-y的实际值的平方和最小。Se满足最小的话,可对Se关于a和b求微分,使其为0,得到两个方程,并整理,即可求出回归方程。
    //定义:y的观测值,即提供的y的值;y的实际值即通过方程式求出的y值
    //推导过程中可发现,对b求导后方程式,即过点(x平均值,y平均值)的直线方程 y平均值 = a*x平均值 - b;
    float a = 0, b = 0;   //suppose line equation y = ax + b;
    a = Sxy / Sxx;
    b = averageS - averageT*a;

    //step3:确认回归方程的精度:回归方程的精度就是用来表示点和回归方程拟合程度的指标
    //计算公式 R = y观测值和y实际值的离差积和/sqrt(y观测值的离差平方和*y实际值的离差平方和)
    float Syhaty = 0, averageHaty, Shatyhaty = 0;
    float Haty[NUM],Hatysum = 0;
    for (int i = 0; i < NUM; i++)
    {
        Haty[i] = a * temperature[i];//Haty = a*x+b;
        Hatysum += Haty[i];
    }
    averageHaty = Hatysum / NUM;

    for (int i = 0; i < n; i++)
    {
        Syhaty += (sales[i] - averageS)*(Haty[i] - averageHaty);    //y观测值和y实际值的离差积和()
        Shatyhaty += (Haty[i] - averageHaty)*(Haty[i] - averageHaty);                //y实际值的离差平方和
    }

    float Relatedcoefficient = Syhaty / sqrt(Syy*Shatyhaty);
    Relatedcoefficient *= Relatedcoefficient;   //重相关系数用R*R表示,R*R越接近1,代表回归方程的精度越高  //判定系数 = R*R = a*Sxy/Syy = 1 - Se/Syy;

   //step4:进行回归系数的检验

   //step5: 总体回归Ax+B的估计

   //step6: 进行预测

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值