算法积累NO1.最小二乘法C实现

        最小二乘估计法,又称最小平方法,是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘估计法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差平方和为最小。

 

一、C实现最小二乘法

计量经济学研究的直接目的是确定总体回归函数Yi=B1+B2Xi+ui,然而能够得到的只是来自总体的若干样本的观测值,要用样本信息建立的样本回归函数尽可能“接近”地去估计总体回归函数。为此,可以以从不同的角度去确定建立样本回归函数的准则,也就有了估计回归模型参数的多种方法。

最小二乘估计法用来确定函数y(x) = b1x + b0 中b1和b0的估计值。

y(x)是n个点(x0,y0) , ... (Xn-1 , Yn-1)的最佳拟合线。

b1 = (n * sigma(Xi * Yi) - singma(Xi)*singma(Yi) ) / (n*singma(pow(Xi)) - pow((singma(Xi))) ;

b0 = (sigma(Yi) - b1 * singma(Xi)) / n ; 

将值b0和b1求出后可代入y(x) = b1 + b0 求出相应的值。

接下来写一个例子:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define NR(x) sizeof(x)/sizeof(x[0])
//最小二乘法实现 
void lsqe(const double *x, const double *y, int n, double *b1, double *b0) 
{
	int  i;
	double  sumx,sumy,sumx2,sumxy;
	sumx = 0.0;
	sumy = 0.0;
	sumx2 = 0.0;
	sumxy = 0.0;
	//计算N次 
	for (i = 0; i < n; i++) {
	  //将横坐标方向的x值进行累加 
      sumx = sumx + x[i];
      //将纵坐标方向的y值进行累加 
  	  sumy = sumy + y[i];
  	  sumx2 = sumx2 + pow(x[i], 2.0);
 	  sumxy = sumxy + (x[i] * y[i]);
	}
	//根据公式求解b1和b0的值 
	*b1 = (sumxy - ((sumx * sumy)/(double)n)) / (sumx2-(pow(sumx,2.0)/(double)n));
	*b0 = (sumy - ((*b1) * sumx)) / (double)n;
 
	return;
}
 
int main(void)
{
	double x[] = {1.1 , 1.2 , 1.3 , 1.4 , 1.5 ,1.6} ; 
	double y[] = {4.1 , 4.2 , 4.3 , 4.4 , 4.5 , 4.6} ; 
	double b0 , b1 ;
	lsqe(x,y,NR(x),&b0,&b1);  
	printf("%lf,%lf\n",b0,b1);
    return 0 ;
}

注:

1.pow(x,y);//其作用是计算x的y次方。

2.singma,应该是sigma,相当于数学符号Σ。
原文:https://blog.csdn.net/morixinguan/article/details/51774394 

 

二、最小二乘法的Matlab实现

① 一次函数线性拟合使用polyfit(x,y,1)

②多项式函数线性拟合使用 polyfit(x,y,n),n为次数

拟合曲线

x=[0.5,1.0,1.5,2.0,2.5,3.0],

y=[1.75,2.45,3.81,4.80,7.00,8.60]。

解:MATLAB程序如下:

x=[0.5,1.0,1.5,2.0,2.5,3.0];
y=[1.75,2.45,3.81,4.80,7.00,8.60];
p=polyfit(x,y,2)
x1=0.5:0.5:3.0;
y1=polyval(p,x1);
plot(x,y,'*r',x1,y1,'-b')

计算结果为:
p =0.5614 0.8287 1.1560
即所得多项式为y=0.5614x^2+0.8287x+1.15560

非线性函数使用

lsqcurvefit(fun,x0,x,y)
a=nlinfit(x,y,fun,b0)

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值