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


结束语

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

相关文章
|
8月前
|
机器学习/深度学习 算法 前端开发
别再用均值填充了!MICE算法教你正确处理缺失数据
MICE是一种基于迭代链式方程的缺失值插补方法,通过构建后验分布并生成多个完整数据集,有效量化不确定性。相比简单填补,MICE利用变量间复杂关系,提升插补准确性,适用于多变量关联、缺失率高的场景。本文结合PMM与线性回归,详解其机制并对比效果,验证其在统计推断中的优势。
1801 11
别再用均值填充了!MICE算法教你正确处理缺失数据
|
10月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
211 1
|
9月前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
533 1
|
9月前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
632 0
|
11月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
1685 0
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
253 2
|
数据采集 机器学习/深度学习 算法
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
别急着上算法,咱先把数据整明白:大数据分析的5个基本步骤,你都搞对了吗?
923 4
|
9月前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
212 3
|
8月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
322 0
|
9月前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
211 1

热门文章

最新文章