当前位置: 首页 > news >正文

线性回归计算斜率原理及C++实现

线性回归基本概要:

        线性回归方程是统计学中用于描述两个变量之间线性关系的一种数学模型。在这种模型中,一个变量(通常称为因变量)被假定为与另一个变量(称为自变量)存在线性关系。线性回归方程的一般形式为y = mx + b,其中y是因变量,x是自变量,m是斜率,b是截距。斜率m和截距b的值通过数据点的拟合来确定,以使得方程能够尽可能地准确描述数据点之间的关系。

        斜率m在线性回归方程中扮演着至关重要的角色。它表示了自变量x每增加一个单位时,因变量y平均增加(或减少)的量。斜率的正负和大小都提供了关于两个变量之间关系的重要信息。

        如果斜率m为正,说明自变量x和因变量y之间存在正相关关系,即x增加时,y也增加。如果斜率m为负,则说明存在负相关关系,即x增加时,y减少。斜率的大小则反映了这种关系的强度。


最小二乘原理介绍

        最小二乘法是一种用于拟合线性回归方程的方法。它的核心思想是最小化因变量的观测值与方程预测值之间的误差平方和。通过这种方法,我们可以找到一条直线,使得所有数据点到这条直线的垂直距离(即误差)的平方和最小。

        最小二乘法是一种优化方法,它通过迭代计算来不断调整斜率m和截距b的值,直到找到使误差平方和最小的最优解。这种方法在统计学中得到了广泛的应用,因为它能够提供一种客观、准确的方式来拟合线性回归方程。


使用最小二乘法求解线性回归方程斜率

使用最小二乘法求解线性回归方程斜率的过程可以分为以下几个步骤:

  1. 计算自变量x和因变量y的平均值,分别记为x̄和ȳ。
  2. 计算每个数据点与平均值的偏差,即(xi - x̄)和(yi - ȳ)。
  3. 计算偏差的乘积之和,即Σ[(xi - x̄)(yi - ȳ)]。
  4. 计算自变量x的偏差平方和,即Σ[(xi - x̄)²]。
  5. 将步骤3的结果除以步骤4的结果,得到斜率m的值。

斜率的计算公式及推导

        斜率的计算公式可以根据最小二乘法的原理进行推导。根据前面的步骤,我们可以得到斜率m的两种计算公式:

  1. (m)=(nΣxy-ΣxΣy)/(nΣx²-(Σx)²),其中n为样本数量,Σxy为样本点x与y的乘积之和,Σx为样本点x的和,Σy为样本点y的和,Σx²为样本点x的平方和。
  2. k = Σ[(xi - x̄)(yi - ȳ)] / Σ[(xi - x̄)²],其中xi和yi分别是第i个数据点的自变量和因变量值,x̄和ȳ分别是自变量和因变量的平均值,n是数据点的数量。

        这两种公式在本质上是等价的,只是表示方式略有不同。它们都是基于最小二乘法的原理推导出来的,用于计算线性回归方程的斜率。

C++实现案例

要基于C++计算五个采样数据的斜率,可以使用线性回归的方法。线性回归可以用来找到一组数据点中最佳的直线拟合。对于两个变量的情况(即一个自变量和一个因变量),线性回归可以通过最小化误差平方和(即最小二乘法)来求解。

以下是使用C++实现这一功能的步骤和代码示例:

步骤

  1. 定义数据结构:存储输入的采样数据。

  2. 计算平均值:计算x和y的平均值。

  3. 计算斜率:使用线性回归公式计算斜率(m),即 m = Σ[(xi - x̄)(yi - ȳ)] / Σ[(xi - x̄)²]

  4. 计算截距:使用斜率和平均值计算截距(b),即 b = ȳ - mx̄

#include <iostream>
#include <vector>
#include <numeric> // for std::accumulate
 
// 结构体用于存储x和y的值
struct DataPoint {
    double x;
    double y;
};
 
// 函数用于计算线性回归的斜率(b)和截距(a)
void linearRegression(const std::vector<DataPoint>& data, double& slope, double& intercept) {
    int n = data.size();
    double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
    double meanX = 0, meanY = 0;
 
    // 计算x和y的总和以及x和y的乘积的和,还有x的平方的和
    for (const auto& point : data) {
        sumX += point.x;
        sumY += point.y;
        sumXY += point.x * point.y;
        sumXX += point.x * point.x;
    }
 
    // 计算x和y的平均值
    meanX = sumX / n;
    meanY = sumY / n;
 
    // 计算斜率b和截距a
    slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
    intercept = (meanY - slope * meanX);
}
 
int main() {
    // 示例数据点
    std::vector<DataPoint> data = { {1, 2}, {2, 3}, {3, 5}, {4, 7}, {5, 11} };
    double slope, intercept;
 
    // 计算线性回归的斜率和截距
    linearRegression(data, slope, intercept);
 
    // 输出结果
    std::cout << "Slope (b): " << slope << std::endl;
    std::cout << "Intercept (a): " << intercept << std::endl;
    std::cout << "Linear regression equation: y = " << slope << "x + " << intercept << std::endl;
 
    return 0;
}

基于队列采集近五次样本,基于这五次采集样本计算其斜率,并判断其数据是否呈快速衰减趋势:

       //数据采集
        void addDataPoint(double pressure) {
        std::lock_guard<std::mutex> lock(dataMutex);
        if (pressureData.size() >= windowSize) {
            pressureData.pop_front();
        }
        pressureData.push_back(pressure);
    }


        //斜率计算
        double sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
        for (size_t i = 0; i < pressureData.size(); ++i) {
            sumX += i;
            sumY += pressureData[i];
            sumXY += i * pressureData[i];
            sumXX += i * i;
        }

        double slope = (pressureData.size() * sumXY - sumX * sumY) /
                      (pressureData.size() * sumXX - sumX * sumX);
        
        return slope < -0.5;
    }

    std::deque<double> pressureData;
    size_t windowSize;
    double thresholdFactor;
    std::mutex dataMutex;

相关文章:

  • OOM异常排除
  • 【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)
  • IBM服务器刀箱Blade安装Hyper-V Server 2019 操作系统
  • 嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc
  • 布隆过滤器(简单介绍)
  • idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448
  • 如何保持 mysql 和 redis 中数据的一致性?PegaDB 给出答案
  • FastExcel + Java:打造高效灵活的Excel数据导入导出解决方案
  • 【科技革命】颠覆性力量与社会伦理的再平衡
  • OpenCV机器学习(2)提升算法类cv::ml::Boost
  • 2024美团春招硬件开发笔试真题及答案解析
  • 基于云计算的分布式文件存储系统设计与实现
  • 24、深度学习-自学之路-卷积神经网络
  • 【OpenCV】双目相机计算深度图和点云
  • 归并排序 和 七大算法的总结图
  • 【php】php json_encode($arr) 和 json_encode($arr, 320) 有什么区别?
  • DeepSeek 指导手册(入门到精通)
  • C++从入门到实战(三)缺省参数与函数重载
  • Navicat导入海量Excel数据到数据库(简易介绍)
  • Spring 项目接入 DeepSeek,分享两种超简单的方式!
  • 光明日报社副总编辑薄洁萍调任求是杂志社副总编辑
  • 国际金价下跌,中概股多数上涨,穆迪下调美国主权信用评级
  • 工人日报:应对“职场肥胖”,健康与减重同受关注
  • 首次公布!我国空间站内发现微生物新物种
  • 长三角体育节回归“上海时间”,首次发布赛事旅游推荐线路
  • 七猫征文大赛颁出112万奖金,非遗题材作品斩获金奖