散点图之一元线性回归分析

Yes Whitenan.....*_*...nan 是单位的美女同事。。。
关于Excel 里边的XY散点图。用到的数学和C++或者C的方法。

 

-----------------------------------------------------------------------------

 

文章中用到的数学表示方法。为什么就不说了,有些特殊符号写不出来,或者显示有问题。只好用文字描述加一些符号了。。


XOY 表示的就是高等数学里边常见的XY轴成90°的直角坐标系。好像专业的说法是笛卡尔坐标系。
Y  表示的是样本点的Y值。
Y' 表示的是回归方程的概念,就是通过X点带入回归方程得到的Y值。
(Yi)' | (i = 1, 2, ....., n ) 表示的是由样本点的回归值的通用表达式。
        其中样本点的取值范围是从1到n
SUM((Ei)^2 )| ( i = 1, 2, ....., n ), SUM( )表示的是对括号里边的式子求和。
(Ei)^2 表示的是求平方的概念。
Y" 和 X" 表示的是样本点的Y平均值,X平均值,注意的是有的文章用Y,X表示平均值。
A / B 表示的是除的表达式。

 

--------------------------------------------------------------------------------

 

P.S 一元线性回归方程(统计概念)与函数的直线方程(函数概念,直线上点的x,y坐标满足的一元线性方程关系)
是不是多了一个回归的概念。因为在函数概念的直线方程。如果确定x,y中的任何一个值都有一个对应的值,但是在
一元线性回归方程概念,只能说确定的x,y中的一个值,通过这个方程由一个函数值,这个函数值由多大的概率是该
数值,这个数值是一个范围概念。

 

Excel的XY散点图,应用的数学原理是一元线性回归分析的方法。
一元线性回归分析是处理两个变量之间关系的最简单的模型。研究的对象是两个变量之间的线性相关关系。把变量X和变量Y分别映射到直角坐标系XOY的点(xi,yi)上得到的图像就是XY散点图。
该图表现的形式是数据点基本落在一条直线附近。显示出变量X,变量Y基本呈现出线性关系。但是由于并非所有点都完全落在一条直线上。因此X,Y的关系没有完全确切到可以唯一的由一个X值确定一个Y值的函数关系。

 

研究X与Y的关系,称作线性拟合,Y' = aX + b (Fun-1-1).注意为了区别常见意义的直线方程,Y后边多了一个'号,区别Y = aX + b。在Y' = aX + b 中,a与b是待定系数,成为回归系数。理论上将Y' = aX + b 有无穷多组解。

回归分析的目的是找出最佳的线性拟合。
从几何的意义讲,就是这几个点到该回归线的距离最近。
如果把用回归方程Y' = aX + b计算得到的 (Yi)'(i = 1, 2, ....., n ),其中n在统计中成为样本数。就是有多少个点
去拟合这个回归直线。得到的(Yi)'值和实际测得的实验值之间有偏差,成该偏差为残值。记为Ei( i = 1, 2, ....., n ).这样就可以用残差平方和来度量测量值与回归直线的接近或偏差程度。残差平方和定义为:Q(a,b) = SUM((Ei)^2)| ( i = 1, 2, ....., n ), 公式中SUM是求和的意思, ^2表示的是平方的意思,

文字描述为,求所有Ei的平方和。
由于Ei = Yi - (Yi)';其中(Yi)' = bXi + a。

实际常用的就是最小二乘法。最小二乘法就是选取a和b使Q(a,b)最小。由于Q(a,b)是a,b的二次函数则总存在最小值。

根据微分中求极值的方法。对Q(a,b)取最小值应满足。偏微分Q / 偏微分a = 0 AND 偏微分Q / 偏微分b = 0.
求该方程的一组解,
a = Y" + bX"
b = Lxy / Lxx.
其中  Y" 是样本点的平均值,X" 是样本点的平均值。
      Lxy成为xy的协方差之和,Lxx成为x的平方差之和。
可以看出回归直线过点(Y", X") 和点(0, a).
从力学观点看,点(Y", X") 是N个样本的重心位置。

其中,Lxy = SUM((Xi-X") * (Yi-Y"))| ( i = 1, 2, ....., n ),
      文字描述为,求所有样本点的{ Xi和X"(Xi的平均值)差值 } 乘积 { Yi和Y"(Yi的平均值)差值 }的和
Lxx = SUM( (Xi-X")^2 )
      文字描述为,求所有样本点的{ Xi和X"(Xi的平均值)差值 } 的平方和。

其中有个指标描述这个线性回归方程的好坏,R^2 .所谓的相关系数吧。这个数值越接近1越好,说明这些点都在这个直线附近。当这个值为1的时候就是完整的一条直线了,100%的概率了吧。

其中在Excel中b 是用SUM( (Xi-X") * ((Yi-Y") ) / SUM( (Xi-X")^2 )的公式求出。
a = Y" + bX"。

// y = ax + b; n 是样本点空间.....
// b = L-xy / L-xx
// a = sumall( y ) / n + b * sumall( x ) / n;

 
 dConcent[0] = 5.0;
 dConcent[1] = 10.0;
 dConcent[2] = 20.0;
 dConcent[3] = 40.0;
 
 dAmps[0] = 3.73;
 dAmps[1] = 10.708;
 dAmps[2] = 10.468;
 dAmps[3] = 19.101;
 
 // Get the sum x & sum x * x
 // x is Concent.....
 double dSumConcent = 0.0;
 double dSumConcentSquart = 0.0;

 for ( int i = 0; i < 4; i++ )
 {
  dSumConcent += dConcent[i];
  dSumConcentSquart += pow( dConcent[i], 2 );
 }//_FOR

 // Get the sum y & sum y * y
 // y is the Apms........
 double dSumAmps = 0.0;
 double dSumAmpsSquart = 0.0;
 double dSumDoubleC = 0.0;

 for ( int i = 0; i < 4; i++ )
 {
  dSumAmps += dAmps[i];
  dSumAmpsSquart += pow( dAmps[i], 2 );
 
  // Sum x * y
  dSumDoubleC += dConcent[i] * dAmps[i];
 }//_FOR

 double dAverageAmps =  dSumAmps / 4.0;
 double dAverageConcent = dSumConcent / 4.0;
 
 double dVarBUp = 0.0;
 double dVarBDown = 0.0;
 double dVarB = 0.0;
 for ( int i = 0; i < 4; i++ )
 {
  dVarBUp += ((dConcent[i] - dAverageConcent) * (dAmps[i] - dAverageAmps));
  dVarBDown += pow( (dConcent[i] - dAverageConcent), 2 );
 }//_FOR
 dVarB = dVarBUp / dVarBDown;

 double dVarA = dAverageAmps - dVarB * dAverageConcent;
 
 
 double dRelPow2 = pow( dVarBUp, 2 );
 double dXXPow2 = 0.0;
 double dYYPow2 = 0.0;
 for ( int i = 0; i < 4; i++ )
 {
  dXXPow2 += pow( (dConcent[i] - dAverageConcent), 2 );
  dYYPow2 += pow( (dAmps[i] - dAverageAmps), 2 );
 
 }//_FOR
 dXXPow2 *= dYYPow2;
 dRelPow2 /= dXXPow2;

 

a = dVarA;

b = dVarB;

R = dRelPow2;

 

以上程序在XP-sp3 + VS2005 C++下通过和Excel的结果一样。

 

BTY:显示的时候可以通过吧浮点数转换成字符串的形式,通CString::Format()
 转换成相应的小数点后几位,但是实际计算的时候还是用原来的数值比较精确。

 

还有就是当时实验的时候用的是5个样本点,等找了一个4个样本点。本来想通用5个样本点的代码,直接把最后一个X,Y写成X=0.0, Y=0.0。本来从数学的概念上说,不会对结果产生影响,但是实际确实影响到了结果。。有兴趣的可以看一下。

 


版权声明:本文为sealplusplus原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>