2022西北农林科技大学信息工程学院阶段一E

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

题目描述

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

 

    请编写程序实现这一需求,其中主函数int main(void)已编写完成,需编写如下两个函数完成相应功能:

      1)  为数组的每个元素赋值,要求其函数原型:

     void input(double da[], int n);

    2)  根据输入一组观测值,求解最佳模型参数wb(保留2位小数,当wb绝对值小于1e-3时,则wb取0.0),要求其函数原型为: 

     void LeastSquare(double x[], double y[], int n, double *w, double *b)


     可采用如下main(void)函数进行测试(只供参考,请勿提交):


#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#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;
}

10

输入

观测值的数量和一组观测值X和Y,格式:
观测值数n
X1 X2 X3 ......
Y1 Y2 Y3 ......

输出

参数wb,中间用空格分割,小数点后保留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

看完整代码:

#include<stdio.h>
#include <stdlib.h>
#include <math.h>

#define N 20

int i;
double up,down,Sum;


void input(double da[],int n){
    for(i=1;i<=n;i++)
        scanf("%lf",&da[i]);
}
void LeastSquare(double x[], double y[], int n, double *w, double *b){
    double x_av=0.00;
    double sum=0.00;
    for(i=1;i<=n;i++)
        sum+=x[i];
        x_av=sum/n;
    for(i=1;i<=n;i++)
        up+=y[i]*(x[i]-x_av);
    double X=0.00;
    for(i=1;i<=n;i++)
        X+=x[i]*x[i];
    down=X-n*x_av*x_av;
    *w=up/down;
    for(i=1;i<=n;i++)
        Sum+=y[i]-*w*x[i];
       *b=Sum/n;
    if((*w >0.0 && *w - 0.0 < 1e-3) || (*w < 0.0 && 0.0 - *w < 1e-3)) *w = 0.0;
    if((*b >0.0 && *b - 0.0 < 1e-3) || (*b < 0.0 && 0.0 - *b < 1e-3)) *b = 0.0;
}
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;
}

本题思维量不大;有点像高中的回归直线求参数,主要在算对与看懂图片转化为代码;

由于在最后一题,题干又有点长,同学们可能产生畏难情绪,我也不例外,所以考场心态尤为重要,耐得住性子把题读下去,发现考场上做不出来的下了考场就都能做出来,平时要多练,考场心态才能平稳,遇到大部分正确却有找不出原因的错误,一定记着把题多读几遍,因为有的临界判例没有考虑完整;

几个注意问题:

1.for循环中为分号;

2.double型输入输出用“%lf”;

3.指针在定义是为eg:*w

   在输入时为&w(取址);

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

511511511

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值