最近发现线性回归算法真是个好东西,通过它可以来分析过去一段数据的变化趋势、斜率,本贴分享亲测可用代码块,供需要的小伙伴参考。
1、C语言模块代码:
/******************************************************************************
*函数功能:线性回归算法求得斜率
*入口参数:x:存放自变量x的n个值的数组首地址.
*入口参数:y:存放与自变量x的n个值对应的随机变量观测值的数组首地址.
*入口参数:n:观测点数.
*出口参数:a:长度为2的数组,其中a[0]存放回归系数b, a[1]存放回归系数a.
*出口参数:dt:长度为6的数组,dt[0]为偏差平方和, dt[1]为平均标准偏差, dt[2]为回归平方和,
dt[3]为最大偏差, dt[4]为最小偏差, dt[5]为偏差平均值.
*说 明:斜率越趋近于0越平稳,大于0说明斜率向高走,小于0说明斜率向低走
******************************************************************************/
void GetCoefficient(double *x, double *y, int n, double *a, double *dt)
{
int i;
double xx, yy, e, f, q, u, p, umax, umin, s;
xx = 0.0; yy = 0.0;
for (i = 0; i <= n - 1; i++)
{
xx = xx + x[i] / n;
yy = yy + y[i] / n;
}
e = 0.0; f = 0.0;
for (i = 0; i <= n - 1; i++)
{
q = x[i] - xx; e = e + q * q;
f = f + q * (y[i] - yy);
}
a[1] = f / e; a[0] = yy - a[1] * xx;
q = u = p = 0.0;
umax = 0.0; umin = 1.0e+30;
for (i = 0; i <= n - 1; i++)
{
s = a[1] * x[i] + a[0];
q = q + (y[i] - s) * (y[i] - s);
p = p + (s - yy) * (s - yy);
e = fabs(y[i] - s);
if (e > umax) umax = e;
if (e < umin) umin = e;
u = u + e / n;
}
dt[1] = sqrt(q / n);
dt[0] = q; dt[2] = p;
dt[3] = umax; dt[4] = umin; dt[5] = u;
}
2、调用示例:
//调用前,y数组旧数据先往y[0]方向挪动,然后装载新数据到y数组末尾
GetCoefficient(x , y , n , a , dt );//线性回归算法求得斜率
//5个入口参数在上面有解释,执行完该函数后,得出斜率值存放在a[1],6位小数精度
注意:y是你要观察的数据数组,x是时间轴可填入1,2,3,4,5,6…一段连续的数(可能这样解释不太恰当,仅供小白理解),n是数据的个数。
3、补充知识:
- 什么是线性回归?
线性回归是利用最小二乘法,对一个或者多个自变量和因变量之间的关系进行建模的一种回归分析。
了解更多请参考下面链接或自行百度。
图1-欧氏距离加和公式:
(其中y(i)表示的是实际值,y^(i)表示的是预测值)
简单来讲就是计算找出每个点与预测直线的最短距离。
图2-对n个数据算出的拟合曲线