首先发本贴主要是因为当时遇到这个问题时,在网上没有找到太多的技术资料,所以在解决本问题之后,决定发个贴子记录一下。
先说说问题本身,现在分别有两类数据为X和Y,X和Y里面有十组数据,现在需要通过Y=-aln(X)+b这个公式计算出a,b的值,这是一个线性回归方程的解决方法,先贴一下解答本方程的数学公式。
https://img-blog.csdnimg.cn/20200424100653362.jpg 这是公式图片路径。
有了数学公式之后就好办了,我们用代码去实现这个公式的算法即可,直接贴代码。`
/// <summary>
/// 线性回归分析
/// </summary>
/// <param name="models">models</param>
/// <param name="spt">返回结果</param>
public static void LinearRegression(List<AssessmentModel> models, out double a, out double b)
{
//models集合中包含十组数据,每组数据中包含两个属性,分别为Xvalue,Yvalue,数据值放在这里可以做个参考
//Xvalue:0.454545,0.545455,0.090909,0.181818,0.818182,0.909091,0.636364,0.272727,0.363636,0.727273
//Yvalue:0.607455,0.60206,0.944483,0.812913,0.447158,0.431364,0.542825,0.716003,0.612784,0.532754
a = 0; b = 0;
try
{
double x_ = 0, y_ = 0, lnx_y = 0, lnx_pow = 0, lnx = 0, an = 0, bn = 0;//x_是计算x的平均值,y_是计算y的平均值,lnx_y是计算log(x)*y,lnx_pow是计算log(x)次方,这里计算的是2次方,lnx是计算log(x);an,bn是a,b的完整数据体系
foreach (var item in models)
{
x_ += item.Xvalue;
y_ += item.Yvalue;
lnx += Math.Log(d: item.Xvalue);
lnx_y += Math.Log(d: item.Xvalue) * item.Yvalue;
lnx_pow += Math.Pow(x: Math.Log(item.Xvalue), 2);
}
x_ /= models.Count;//计算x_平均值
y_ /= models.Count;//计算y_平均值
lnx /= models.Count;//计算lnx平均值
an = Math.Abs((lnx_y - (10 * lnx * y_)) / (lnx_pow - (models.Count * Math.Pow(lnx, 2))));//此处为计算a的值
a = Convert.ToDouble(value: (Math.Truncate(an * 100) / 100).ToString("0.00"));//按照客户要求将a结果保留两位小数,非四舍五入
bn = y_ - (an * lnx);//此处计算b的值,其实当a的值计算出来后,b的值显而易见,直接将x,y,a的值带入公式计算即可,需要注意的是,这里计算时,a的值为原值,即未经过保留小数位的值,否则值有偏差
b = Convert.ToDouble(value: (Math.Truncate(bn * 1000) / 1000).ToString("0.000"));//按照客户要求将b结果保留三位小数,非四舍五入
}
catch (Exception)
{
throw;
}
}`
这个方法中我传的是一个List集合,但是我把测试的数据值也放进来了,方便大家看的更清楚,以上就是整个的解决方案,非常感谢我的好朋友为我提供这个数据公式,bug满满的一天又要开始了。
使用C#解线性回归方程
最新推荐文章于 2024-01-12 15:15:23 发布