用线性回归拟合直线

#代码如下

//vDataX x点的坐标
//vDataY y点的坐标
//srcStart 要计算的x点
//outStart  输出的对应Y值
bool CalcLineFit(double srcStart, std::vector<double> vDataX,std::vector<double> vDataY
	, double& outStart)
{
	double s_x_ag = 0, e_x_ag = 0;
	double s_x = 0, e_x = 0;
	double s_y_ag = 0, e_y_ag = 0;
	double s_y = 0, e_y = 0;
	double s_a = 0, s_b = 0, e_a = 0, e_b = 0;
	if (vDataX.size() == 0 || vDataY.size()==0 || vDataX.size() != vDataY.size())
		return false;
	for (int i = 0; i < vDataX.size(); i++)
	{
		s_x_ag += vDataX[i];
		s_y_ag += vDataY[i];
	}
	
	s_x_ag /= (double)vDataX.size();
	s_y_ag /= (double)vDataY.size();	
	
	for (int i = 0; i < vDataX.size(); i++)
	{
		s_x += (double)pow(vDataX[i] - s_x_ag,2);
		s_y += (vDataX[i] - s_x_ag) * (vDataY[i] - s_y_ag);
	}
	
	s_b = s_y / (double)s_x;
	//e_b = e_y / e_x;
	s_a = s_y_ag - s_b * s_x_ag;
	//e_a = e_y_ag - e_b * e_x_ag;
	outStart = s_b * srcStart + s_a;
	//outEnd = e_b * srcEnd + e_a;
	return true;
}
void main()
{
	std::vector<double> frameids = { 15.1, 23.6, 50.9 };
	std::vector<double> positions = { 3.4, 19.8, 65.7 };
	double out_s;
	CalcTDICutPicPos(40, frameids, positions, out_s);
}

推导过程

在数据的统计分析中,数据之间即变量x与Y之间的相关性研究非常重要,通过在直角坐标系中做散点图的方式我们会发现很多统计数据近似一条直线,它们之间或者 正相关或者 负相关。虽然这些数据是离散的,不是连续的,我们无法得到一个确定的描述这种相关性的函数方程,但既然在直角坐标系中数据分布接近一条直线,那么我们就可以通过画直线的方式得到一个近似的描述这种关系的直线方程。当然,从前面的描述中不难看出,所有数据都分布在一条直线附近,因此这样的直线可以画出很多条,而我们希望找出其中的一条,能够最好地反映变量之间的关系。换言之,我们要找出一条直线,使这条直线“最贴近”已知的数据点,设此直线方程为:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值