绘制线性回归和多元线性回归

 本文用C#语言实现一元线性回归和多元线性回归。结合“winform双缓冲绘制坐标轴图像”https://www.luweidong.cn/details/89 实现绘制曲线图,效果直观。

  一、什么是一元线性回归

  举个例子,我准备买房,从网上得到了一组关于房子面积和价格的数据,如下图所示

  广州天河富豪村的房屋面积和价格

面积

价格

15010400
13013200
14012200
12011200

  数据有了,现在我想知道这些房屋的面积和价格的关系,以便于通过面积就可以预测价格。

  先列一个数学模型,y=ax+b。其中y表示价格,x表示面积。

  具体的数学原理在大学高数中有所阐述。

  

使用到的方法叫做:最小二乘估计。

我整理后,关键代码如下:

        #region 线形回归方程y=ax+b;
        /// <summary>
        /// 线形回归方程y=ax+b;
        /// </summary>
        /// <param name="pointFs"></param>
        /// <param name="a"></param>
        /// <param name="b"></param>
        private void regression(List<PointF> pointFs, ref float a, ref float b)
        {
            int n = pointFs.Count;
            float A = 0F;
            float B = 0f;
            float C = 0f;
            float D = 0f;
            foreach (var point in pointFs)
            {
                A += point.X;
                B += point.X * point.X;
                C += point.Y;
                D += point.X * point.Y;
            }
            a = (n * D - A * C) / (n * B - A * A);
            b = (A * D - B * C) / (A * A - n * B);
        }
        #endregion

绘制后图像如下:

二、多元线性回归

关键代码如下:

    /// <summary>
        /// 多元线性回归
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <param name="powerSum"></param>
        /// <returns></returns>
        private double[] regressionMore(double[] x,double[] y,int powerSum)
        {
            //一维数组转二维数组
            double[,] X = new double[x.Length,powerSum+1];
            for (int i = 0; i < x.Length; i++)
            {
                for (int j = 0; j < powerSum+1; j++)
                {
                    X[i,j] = Math.Pow(x[i],j);
                }
            }
            //一维数组转二维数组
            double[,] Y = new double[y.Length,1];
            for (int i = 0; i < y.Length; i++)
            {
                Y[i,0] = y[i];
            }
            var matrixX = DenseMatrix.OfArray(X);
            var matrixY = DenseMatrix.OfArray(Y);
            var matrixX_T = matrixX.Transpose();//XT、矩阵转置
            var matrixXTX = matrixX_T * matrixX;//XTX、矩阵相乘
            var matrixXTX_1 = matrixXTX.Inverse();//逆矩阵
            var result = matrixXTX_1 * matrixX_T * matrixY;//求系数
            return result.ToColumnMajorArray();
        }

顺便画了sigmod函数:

例子已上传,下载例子后,记得要安装数学计算库:MathNet.Numerics

下载码:FC8C86C1F5

下载码是啥?如何下载=》点击查看

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值