本文用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
下载码是啥?如何下载=》点击查看