C# | 线性回归算法的实现,只需采集少量数据点,即可拟合整个数据集

简介: 什么是线性回归呢?简单来说,线性回归是一种用于建立两个变量之间线性关系的统计方法。在我们的软件开发中,线性回归可以应用于数据分析、预测和优化等领域。什么情况下会用到线性回归呢?线性回归可以用于探索数据之间的关系,可以用于预测未来的趋势。通过少量的数据点就能得到一个可以代表整个数据集的模型。换句话说,只需要采集少量的数据点,就可以拟合出整个数据集。

image.png

C#线性回归算法的实现

@[toc]

前言

  1. 什么是线性回归呢?
    简单来说,线性回归是一种用于建立两个变量之间线性关系的统计方法。在我们的软件开发中,线性回归可以应用于数据分析、预测和优化等领域。

  2. 什么情况下会用到线性回归呢?
    线性回归可以用于探索数据之间的关系,可以用于预测未来的趋势。通过少量的数据点就能得到一个可以代表整个数据集的模型。换句话说,只需要采集少量的数据点,就可以拟合出整个数据集。

示例代码

现在让我们来看一下示例代码:

    /// <summary>
    /// 线性回归类,用于计算一组二维坐标点的线性回归方程(y = kx + b)
    /// </summary>
    public class LinearRegression
    {
   
   
        /// <summary>
        /// 直线斜率
        /// </summary>
        public double Slope {
   
    get; }

        /// <summary>
        /// 直线截距
        /// </summary>
        public double Intercept {
   
    get; }

        /// <summary>
        /// 构造线性回归对象
        /// </summary>
        /// <param name="data">一组坐标点</param>
        /// <exception cref="ArgumentException">当数据为空或数据点个数少于2个时抛出异常</exception>
        public LinearRegression(PointF[] data)
        {
   
   
            if (data == null || data.Length < 2)
            {
   
   
                throw new ArgumentException("Data can not be null or the number of data points must be at least 2.");
            }

            double sumX = 0;
            double sumY = 0;
            double sumXY = 0;
            double sumX2 = 0;
            int n = data.Length;

            foreach (PointF point in data)
            {
   
   
                sumX += point.X;
                sumY += point.Y;
                sumXY += point.X * point.Y;
                sumX2 += point.X * point.X;
            }

            double avgX = sumX / n;
            double avgY = sumY / n;

            Slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
            Intercept = avgY - Slope * avgX;
        }

        /// <summary>
        /// 根据 x 坐标计算对应的 y 坐标
        /// </summary>
        /// <param name="x">x 坐标</param>
        /// <returns>y 坐标</returns>
        public double GetY(double x)
        {
   
   
            return Slope * x + Intercept;
        }

        /// <summary>
        /// 根据 y 坐标计算对应的 x 坐标
        /// </summary>
        /// <param name="y">y 坐标</param>
        /// <returns>x 坐标</returns>
        public double GetX(double y)
        {
   
   
            return (y - Intercept) / Slope;
        }
    }

我们定义了一个名为LinearRegression的类。这个类有两个公共属性,分别代表线性回归的斜率截距。我们还定义了一个构造函数,它接受一个PointF类型的数组作为输入,用于计算斜率和截距。

此外还定义了两个方法,分别用于根据x坐标计算对应的y坐标根据y坐标计算对应的x坐标

实现思路

线性回归算法的思路是这样的:

  1. 对于输入的数据点数组,我们首先计算出它们的平均值。
  2. 计算每个数据点与平均值的差值,并将这些差值乘以对应的x和y坐标。
  3. 我们将这些乘积相加并除以对应的坐标的平方和,即可得到斜率。
  4. 通过平均值和斜率的计算结果得出截距。

下面,让我们来看一下重要的代码段:

double sumX = 0;
double sumY = 0;
double sumXY = 0;
double sumX2 = 0;
int n = data.Length;

foreach (PointF point in data)
{
   
   
    sumX += point.X;
    sumY += point.Y;
    sumXY += point.X * point.Y;
    sumX2 += point.X * point.X;
}

double avgX = sumX / n;
double avgY = sumY / n;

Slope = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX * sumX);
Intercept = avgY - Slope * avgX;

通过foreach循环遍历每一个数据点,并计算出所有需要的变量。接着,我们计算出斜率和截距,并将其分别赋值给类的属性。最后,我们就可以使用GetY和GetX方法来计算任意坐标对应的值了。

测试结果

编写测试代码如下:

    [TestClass]
    public class LinearRegressionTests
    {
   
   
        [TestMethod]
        public void TestLinearRegression()
        {
   
   
            // 构造测试数据
            PointF[] data = new PointF[5]
            {
   
   
                new PointF(1, 1),
                new PointF(2, 3),
                new PointF(3, 5),
                new PointF(4, 7),
                new PointF(5, 9)
            };

            // 构造线性回归对象
            LinearRegression lr = new LinearRegression(data);

            // 验证直线斜率和截距是否正确
            Assert.AreEqual(2, lr.Slope, 0.0001);
            Assert.AreEqual(-1, lr.Intercept, 0.0001);

            // 验证 GetY 方法是否正确计算 y 值
            Assert.AreEqual(1, lr.GetY(1), 0.0001);
            Assert.AreEqual(3, lr.GetY(2), 0.0001);
            Assert.AreEqual(5, lr.GetY(3), 0.0001);
            Assert.AreEqual(7, lr.GetY(4), 0.0001);
            Assert.AreEqual(9, lr.GetY(5), 0.0001);

            // 验证 GetX 方法是否正确计算 x 值
            Assert.AreEqual(1, lr.GetX(1), 0.0001);
            Assert.AreEqual(2, lr.GetX(3), 0.0001);
            Assert.AreEqual(3, lr.GetX(5), 0.0001);
            Assert.AreEqual(4, lr.GetX(7), 0.0001);
            Assert.AreEqual(5, lr.GetX(9), 0.0001);
        }
    }

测试结果:
image.png


结束语

通过本章的代码可以轻松实现线性回归算法。如果您觉得本文对您有所帮助,请不要吝啬您的点赞和评论,提供宝贵的反馈和建议,让更多的读者受益。

相关文章
|
6月前
|
机器学习/深度学习 算法 前端开发
别再用均值填充了!MICE算法教你正确处理缺失数据
MICE是一种基于迭代链式方程的缺失值插补方法,通过构建后验分布并生成多个完整数据集,有效量化不确定性。相比简单填补,MICE利用变量间复杂关系,提升插补准确性,适用于多变量关联、缺失率高的场景。本文结合PMM与线性回归,详解其机制并对比效果,验证其在统计推断中的优势。
1542 11
别再用均值填充了!MICE算法教你正确处理缺失数据
|
6月前
|
存储 监控 算法
电脑监控管理中的 C# 哈希表进程资源索引算法
哈希表凭借O(1)查询效率、动态增删性能及低内存开销,适配电脑监控系统对进程资源数据的实时索引需求。通过定制哈希函数与链地址法冲突解决,实现高效进程状态追踪与异常预警。
286 10
|
8月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
179 1
|
7月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
448 1
|
7月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
548 0
|
9月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
1432 0
|
10月前
|
存储 运维 监控
基于 C# 语言的 Dijkstra 算法在局域网内监控软件件中的优化与实现研究
本文针对局域网监控系统中传统Dijkstra算法的性能瓶颈,提出了一种基于优先队列和邻接表优化的改进方案。通过重构数据结构与计算流程,将时间复杂度从O(V²)降至O((V+E)logV),显著提升大规模网络环境下的计算效率与资源利用率。实验表明,优化后算法在包含1000节点、5000链路的网络中,计算时间缩短37.2%,内存占用减少21.5%。该算法适用于网络拓扑发现、异常流量检测、故障定位及负载均衡优化等场景,为智能化局域网监控提供了有效支持。
258 5
|
6月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
300 4
|
7月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
190 3
|
6月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
267 0