最小二乘法用于直线的拟合及程序实现

       最小二乘法是一种优化算法,最小二乘法名字的缘由有两个:一是要将误差最小化,二是将误差最小化的方法是使误差的平方和最小化。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合,所拟合的曲线可以是线性拟合与非线性拟合。

一元线性回归模型

最小二乘法用于直线的拟合及程序实现_第1张图片

一元线性回归模型, 假设n组观察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。对于这n个点要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。 选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。有以下三个标准可以选择:
        (1)用“残差和最小”确定直线位置是一个途径。但很快发现计算“残差和”存在相互抵消的问题。
        (2)用“残差绝对值和最小”确定直线位置也是一个途径。但绝对值的计算比较麻烦。
        (3)最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。

        最小二乘法用于直线的拟合及程序实现_第2张图片

最小二乘法用于直线的拟合及程序实现_第3张图片

c语言代码实现公式:

#include     
#include     
#include     
#include     
using namespace std;

int main()
{

double x[] = { 1, 2, 3, 4, 5, 6 };
double y[] = { 3, 5.5, 6.8, 8.8, 11, 12 };
	valarray data_x(x, 6);
	valarray data_y(y, 6);

	float A = 0.0;
	float B = 0.0;
	float C = 0.0;
	float D = 0.0;
	A = (data_x*data_x).sum();  
	B = data_x.sum();          
	C = (data_x*data_y).sum();   
	D = data_y.sum();
	float tmp = A*data_x.size() - B*B;
	float k, b;
	k = (C*data_x.size() - B*D) / tmp;//β1
	b = (A*D - C*B) / tmp;//β0
	cout << "y=" << k << "x+" << b << endl;
	return 0;
}

解释:

注:valarray类似vector,也是一个模板类,主要用来对一系列元素进行高速的数字计算,与vector的主要区别:
1、valarray定义了一组在两个相同长度和相同类型的valarray类对象之间的数字计算;
2、通过重载operater[ ],可以返回valarray的相关信息(valarray其中某个元素的引用、特定下标的值或者其某个子集)。
valarray类构造函数:
valarray( );
 explicit valarray(size_t   Count);
 valarray( const Type & _Val,    size_t  Count);
 valarray( const Type* _Ptr,   size_t  Count);
 valarray( const slice_array& _SliceArray);
 valarray( const gslice_array& _GsliceArray);
 valarray( const mask_array& _MaskArray);
 valarray( const indirect_array& _IndArray);

valarray 类用法:
1. apply 将 valarray 数组的每一个值都用 apply 所接受到的函数进行计算
2. cshift 将 valarray 数组的数据进行循环移动,参数为正者左移,为负就右移
3. max 返回 valarray 数组的最大值
4. min 返回 valarray 数组的最小值
5. resize 重新设置 valarray 数组大小,并对其进行初始化
6. shift 将 valarray 数组移动,参数为正者左移,为负者右移,移动后由 0 填充剩余位
7. size 得到数组的大小
8. sum 数组求和

你可能感兴趣的:(数学)