线性回归计算斜率原理及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;
相关推荐
invincible_Tang几秒前
贪心算法(题7)货仓选址
算法·贪心算法
点点滴滴的记录38 分钟前
场景设计:设计一个分布式限流器,采用令牌桶算法,漏桶算法、滑动窗口算法实现
分布式·算法
獨枭1 小时前
在 MFC 应用中集成 WebView2
c++·mfc
清泓y2 小时前
UE5--浅析委托原理(Delegate)
c++·ue5·ue4
RangoLei_Lzs2 小时前
C++性能优化—AI润色版
开发语言·c++·性能优化
egoist20233 小时前
【C++】命名空间
开发语言·c++·命名空间
敲上瘾3 小时前
DFS+回溯+剪枝(深度优先搜索)——搜索算法
数据结构·c++·算法·回归·深度优先·剪枝·回归算法
獨枭4 小时前
MFC 应用最小化到系统托盘
c++·mfc
机器学习之心4 小时前
哪吒闹海!SCI算法+分解组合+四模型原创对比首发!SGMD-FATA-Transformer-LSTM多变量时序预测
算法·lstm·transformer·sci算法·分解组合·四模型原创对比首发
平生不喜凡桃李4 小时前
C++ list介绍
c++·windows·list