最小二乘法的C语言实现

最小二乘法化简后的公式如下图所示

这里有详解和公式推导过程 https://zhuanlan.zhihu.com/p/590886127

最小二乘法化简后的公式结果

C代码

/*  y=kx+b
*   double x[] 				X点位数组
*   double y[]				Y点位数组
*   double *slope         	斜率 k
*   double *intercept    	截距 b
*
*/
void leastSquare(int n, double x[], double y[], double *slope, double *intercept)
{
	//sumX  	X[i]数组数据求和 
	//sumY	 	Y[i]数组数据求和 
	//sumXY 	X[i]*Y[i]数组数据求和
	//sumXX		X[i]*X[i]数组数据求和
    double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
    
    // 计算各项和
    for (int i = 0; i < n; i++)
    {
        sumX += x[i];
        sumY += y[i];
        sumXY += x[i] * y[i];
        sumXX += x[i] * x[i];
    }
    
    // 计算斜率和截距
    double sumX_average = sumX / n;		//X数组数据求和后的平均值
    double sumY_average = sumY / n;		//Y数组数据求和后的平均值
    double numerator = sumXY - n * sumX_average* sumY_average;	//上图分子	
    double denominator = sumXX - n * sumX_average* sumX_average;//上图分母
    *slope = numerator / denominator;				//斜率
    *intercept = meanY - (*slope) * meanX;			//截距
}
得到的公式就是“ Y = *slope X + *intercept”


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值