使用C#解线性回归方程

    首先发本贴主要是因为当时遇到这个问题时,在网上没有找到太多的技术资料,所以在解决本问题之后,决定发个贴子记录一下。
   先说说问题本身,现在分别有两类数据为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满满的一天又要开始了。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值