2020/11/22 修改
/*线性回归求斜率
*****注意数据类型
*参数 count 数据个数 数组行(列)的个数 数组的行列数目相等
*参数 dataCol_X[] 数据的列数据
*参数 dataRow_Y[] 数据的行数据
*返回值 k 斜率 范围(-∞,∞)
*本算法定义斜率为 ∞ 的情况 k = 0;
*使用注意 需要重定义数据类型
*typedef unsigned char uint8;
*typedef unsigned int uint16;
*typedef unsigned long uint32;
*/
float get_K(uint8 count , uint8 dataCol_X[] , uint8 dataRow_Y[])
{
float k = 0;//斜率
float aveCol_X = 0;//列的平均值x
float aveRow_Y = 0;//行的平均值y
uint16 sum_XY = 0;//行列的总和xy
uint16 sumRow_Y = 0;//行的总和y
uint16 sumCol_X = 0;//列的总和x
uint32 sumCol_X2 = 0;//列的总和x^2
for(uint16 i = 0 ; i < count ; i++)
{
sumCol_X += dataCol_X[i];//求列x的总和
sumRow_Y += dataRow_Y[i];//求行y的总和
sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和
sum_XY += (dataCol_X[i] * dataRow_Y[i]);//求xy的总和
}
aveCol_X = (float)sumCol_X / count;//求平均值
aveRow_Y = (float)sumRow_Y / count;
if(sumCol_X2 - aveCol_X * aveCol_X * count)
{
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
(sumCol_X2 - aveCol_X * aveCol_X * count);
}
//斜率为∞的情况 定义斜率等于0
else
k = 0;
return k;
}
上面的源码已经处理斜率为∞情况
下面的源码没有处理斜率为∞情况
/*
*****注意数据类型
*参数 count 数据个数 数组行(列)的个数 数组的行列数目相等
*参数 dataCol_X[count] 数据的列数据
*参数 dataRow_Y[count] 数据的行数据
*返回值 k 斜率
*使用注意 需要重定义数据类型
*typedef unsigned char uint8;
*typedef unsigned int uint16;
*typedef unsigned long uint32;
*/
float get_K(uint8 count , uint8 dataCol_X[count] , uint8 dataRow_Y[count])
{
float k = 0;//斜率
float aveCol_X = 0;//列的平均值x
float aveRow_Y = 0;//行的平均值y
uint16 sum_XY = 0;//行列的总和xy
uint16 sumRow_Y = 0;//行的总和y
uint16 sumCol_X = 0;//列的总和x
uint32 sumCol_X2 = 0;//列的总和x^2
for(uint16 i = 0 ; i < count ; i++)
{
sumCol_X += dataCol_X[i];//求列x的总和
sumRow_Y += dataRow_Y[i];//求行y的总和
sumCol_X2 += dataCol_X[i] * dataCol_X[i];//求x^2的总和
sum_XY += (dataCol_X[i] * dataRow_Y[i]);//求xy的总和
}
aveCol_X = 1.0 * sumCol_X / count;//求平均值
aveRow_Y = 1.0 * sumRow_Y / count;
k = (sum_XY - aveCol_X * aveRow_Y * count) / //根据公式求斜率
(sumCol_X2 - aveCol_X * aveCol_X * count);
return k;
}