#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;
}
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: 进行预测
}