线性回归计算斜率原理及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̄

cpp 复制代码
#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;
}

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

cpp 复制代码
       //数据采集
        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;
相关推荐
库玛西26 分钟前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle1 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
qeen871 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
lucas_AI2 小时前
1.2B 小模型赢过 235B 大模型:NaviDC-OCR 把文档解析卷明白了
人工智能·深度学习·算法
Augustzero2 小时前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ2 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶2 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_02 小时前
C++正则表达式
开发语言·c++·正则表达式
民乐团扒谱机3 小时前
【微实验】倒谱算法(Cepstrum)深度解析:原理、数学推导与代码实现
人工智能·算法·语音识别
Nil2084 小时前
leetcode 189轮转数组
数据结构·算法·leetcode