初出茅庐的小李第72篇博客之用c语言最小二乘法求线性回归方程y=kx+b

最小二乘法

其实我对这个计算方法的理解还处于数学公式的阶段
初出茅庐的小李第72篇博客之用c语言最小二乘法求线性回归方程y=kx+b_第1张图片
这里的b^其实就是 Y= Kx +b 的K
这里的a^其实就是 Y = K
x +b 的b

数学习惯我就换了一下字母

这里有原理介绍

https://blog.csdn.net/MarsJohn/article/details/54911788

程序实现

https://blog.csdn.net/weixin_34259559/article/details/92063089?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161943598616780255230342%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=161943598616780255230342&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-92063089.pc_search_result_no_baidu_js&utm_term=%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95%E6%B1%82%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92%E6%96%B9%E7%A8%8Bc%E8%AF%AD%E8%A8%80&spm=1018.2226.3001.4187
参考代码连接在此


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210426192916742.png)

#include 
#include 
 
int main()
{
    //float x[6]={0.0,1.0,2.0,3.0,4.0,5.0};
    //float y[6]={1.1,1.9,3.1,3.9,4.4,4.9};
    /*float x[6]={0.0,1.0,2.0,3.0,4.0,5.0};
    float y[6]={0.0,1.0,2.0,3.0,4.0,5.0};*/
    float x[6]={0.0,1.0,2.0,3.0,4.0,5.0};
    float y[6]={1.0,1.0,1.0,1.0,1.0,1.0};
 
    float a,b,mxy,xx,yy,x2,x22;
    int i;
 
    a=b=mxy=xx=yy=x2=x22=0.0;
 
    for(i=0;i<6;i++)
    {
        mxy=6.0*x[i]*y[i]+mxy;
        xx=1.0*x[i]+xx;
        yy=1.0*y[i]+yy;
        x2=1.0*x[i]*x[i]*6.0+x2;
        x22=1.0*x[i]+x22;
    }
 
    b=1.0*(mxy-xx*yy)/(x2-x22*x22);
    a=1.0*yy/6.0-b*xx/6.0;
 
    printf("Y=%0.2fx+%0.2f\n",b,a);
    
    system("pause");
    return 0;
}

这里有好几处地方乘以6刚开始我没有看明白  后来明白了这是作者把公式做了一个变换

自己修改后的代码

#include 
#include 
#define  DATA_PAIR  6
int main()
{
	float X[6]={0};
	float Y[6]={0};
	
	float b,k,Sum_XY,XX1_N,YY1_N,X_2;
	int i ;
	b = k = Sum_XY = XX1_N = YY1_N=X_2=0.0;
	float x = 0.0,y = 0.0; 
	for( i= 0;i<DATA_PAIR;i++)
	{
		printf("输入第%d数据坐标中间以,隔开:(x,y)",i+1);
		scanf("%f,%f",&X[i],&Y[i]);
	}
	for(i=0;i<6;i++)
	{
		Sum_XY   = 6.0*X[i]*Y[i]+Sum_XY;         //n*xi*yi;
		XX1_N    = 1.0*X[i] + XX1_N;             //x1+x2+...+xn;
		YY1_N    = 1.0*Y[i] + YY1_N;             //y1+y2+...+yn;
		X_2      = 6.0*X[i]*X[i]*1.0 + X_2;      //6*(x1)^2+(x2)^2+...+(xn)^2;
	}
	k=1.0*(Sum_XY-XX1_N*YY1_N)/(X_2-XX1_N*XX1_N);
	b=1.0*YY1_N/6.0-k*XX1_N/6.0;
	
	printf("Y=(%0.2f)*x+(%0.2f)\n",k,b);

	system("pause");
    return 0;
}

调试代码结果

乘以6.0是为了把除法尽量变成乘法 平均数本质也是(X1+x2+…+Xn)/n得到的
XiYi 可以借助for循环跑一边就可以计算出来
初出茅庐的小李第72篇博客之用c语言最小二乘法求线性回归方程y=kx+b_第2张图片

你可能感兴趣的:(笔记,算法,C语言,最小二乘法,线性回归)