假设有一组观测数据(X,Y)=(Xi , Yi) ,i=1,2,3…m,(m<20),初步判断Y和X之间存在线性关系,如下图中左图所示。则X和Y之间的线性回归模型可表示为:y=wx+b,如果求得模型参数w和b,即可确定其数学模型。在此,基于均方误差最小化的“最小二乘法”确定其最佳模型参数,求解模型参数w和b的公式如下图中右图所示:
请编写程序实现这一需求,其中主函数int main(void)已编写完成,需编写如下两个函数完成相应功能:
1) 为数组的每个元素赋值,要求其函数原型:
void input(double da[], int n);
2) 根据输入一组观测值,求解最佳模型参数w和b(保留2位小数,当w和b绝对值小于1e-3时,则w和b取0.0),要求其函数原型为:
void LeastSquare(double x[], double y[], int n, double *w, double *b);
可采用如下main(void)函数进行测试(只供参考,请勿提交):
#include
#include
#include
#define N 20
void LeastSquare(double x[], double y[], int num, double *w, double *b);
void input(double dv[], int n);
int main() {
double x[N], y[N];
double w=0.0, b=0.0;
int n;
scanf("%d",&n);
input(x,n);
input(y,n);
LeastSquare(x,y,n,&w,&b);
printf("%.2lf %.2lf\n", w, b);
return 0;
}
观测值的数量和一组观测值X和Y,格式:
观测值数n
X1 X2 X3 …
Y1 Y2 Y3 …
参数w和b,中间用空格分割,小数点后保留2位小数
10
5.34 2.48 8.83 3.26 1.47 4.61 6.22 6.54 5.43 8.29
10.5 6.84 15.5 8.93 6.25 11.0 11.3 12.0 9.71 13.60
1.15 4.51
考试水题之梦回高中但小蒟蒻照着公式打也能错
void input (double dv[],int n) {
int i;
for (i=0;i<n;i++) {
scanf("%lf",dv+i);
}
}
void LeastSquare(double x[],double y[],int num,double *w,double *b) {
int i,j;
double sumx=0,temw1=0,temw2=0,temw=0,av_x=0,temb1=0,temb=0;
for (i=0;i<num;i++) sumx+=x[i];
av_x=sumx/num;
for (i=0;i<num;i++) {
temw1+=y[i]*(x[i] - av_x);
temw2+=x[i]*x[i];
}
temw=temw1/(temw2-num*av_x*av_x);
for (i=0;i<num;i++) {
temb1+=y[i] - temw * x[i];
}
temb=temb1/num;
double abstemb=temb>0?temb:-temb,abstemw=temw>0?temw:-temw;
if(abstemw<1e-3) temw=0;
if(abstemb<1e-3) temb=0;
*w=temw;
*b=temb;
/*注释被吃掉了*/
}