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