本文用C#语言实现一元线性回归和多元线性回归。结合“winform双缓冲绘制坐标轴图像”https://www.luweidong.cn/details/89 实现绘制曲线图,效果直观。
一、什么是一元线性回归
举个例子,我准备买房,从网上得到了一组关于房子面积和价格的数据,如下图所示
广州天河富豪村的房屋面积和价格
面积 | 价格 |
150 | 10400 |
130 | 13200 |
140 | 12200 |
120 | 11200 |
数据有了,现在我想知道这些房屋的面积和价格的关系,以便于通过面积就可以预测价格。
先列一个数学模型,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
下载码是啥?如何下载=》点击查看