最小二乘法求解线性回归模型

最小二乘法求解线性回归模型

  • 题目描述
  • 计算公式
  • 测试用主函数及其它
  • 输入
  • 输出
  • 样例输入
  • 样例输出
  • 杂谈
  • 代码

时间限制: 1 Sec 内存限制: 128 MB

题目描述

假设有一组观测数据(X,Y)=(Xi , Yi) ,i=1,2,3…m,(m<20),初步判断Y和X之间存在线性关系,如下图中左图所示。则X和Y之间的线性回归模型可表示为:y=wx+b,如果求得模型参数w和b,即可确定其数学模型。在此,基于均方误差最小化的“最小二乘法”确定其最佳模型参数,求解模型参数w和b的公式如下图中右图所示:

计算公式

最小二乘法求解线性回归模型_第1张图片

最小二乘法求解线性回归模型_第2张图片

请编写程序实现这一需求,其中主函数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;
    /*注释被吃掉了*/
}

你可能感兴趣的:(农专のOJ,c语言)