线性回归计算polyline

线性回归方程用于描述两个变量之间的线性关系。最常见的线性回归模型是简单线性回归,它用于描述一个自变量 𝑥和一个因变量 𝑦 之间的关系。其方程形式为:

在这里插入图片描述

其中:
• β0 是截距(intercept),表示当 x=0时,y 的值。
• β1 是斜率(slope),表示 x 每增加一个单位,y 的变化量。

线性回归方程的推导

1. 计算回归系数:

斜率 (β1 ) 和截距 (β0) 的计算公式如下:

在这里插入图片描述

其中:
在这里插入图片描述

2. 最小二乘法:

线性回归通常使用最小二乘法来确定最佳拟合直线,该方法最小化观测值与回归线预测值之间的平方差之和。

3. 使用 C++ 计算线性回归方程

假设你有一组 𝑥 和 𝑦数据点,你可以使用以下 C++ 代码来计算线性回归方程的斜率和截距,并使用SFML(自行安装)并绘制回归曲线:

#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>

// 定义数据点结构
struct Point {
    float x;
    float y;
};

// 计算线性回归的斜率和截距
void linearRegression(const std::vector<Point>& points, float& slope, float& intercept) {
    size_t n = points.size();
    float sum_x = 0;
    float sum_y = 0;
    float sum_xy = 0;
    float sum_xx = 0;

    for (const auto& point : points) {
        sum_x += point.x;
        sum_y += point.y;
        sum_xy += point.x * point.y;
        sum_xx += point.x * point.x;
    }

    float denominator = (n * sum_xx) - (sum_x * sum_x);
    if (denominator != 0) {
        slope = ((n * sum_xy) - (sum_x * sum_y)) / denominator;
        intercept = ((sum_y * sum_xx) - (sum_x * sum_xy)) / denominator;
    } else {
        std::cerr << "Error: Denominator is zero." << std::endl;
        slope = 0;
        intercept = 0;
    }
}

int main() {
    // 示例数据
    std::vector<Point> points = {
        {100, 100},
        {200, 200},
        {300, 150},
        {400, 300}
    };

    // 计算回归线
    float slope, intercept;
    linearRegression(points, slope, intercept);

    // 创建窗口
    sf::RenderWindow window(sf::VideoMode(800, 600), "Linear Regression Example");

    // 绘制数据点
    sf::CircleShape pointShape(5);
    pointShape.setFillColor(sf::Color::Red);

    // 绘制数据点折线图
    sf::VertexArray dataLine(sf::LineStrip, points.size());
    for (size_t i = 0; i < points.size(); ++i) {
        pointShape.setPosition(points[i].x, 600 - points[i].y); // 反转Y轴方向
        window.draw(pointShape);

        // 折线图
        dataLine[i].position = sf::Vector2f(points[i].x, 600 - points[i].y);
        dataLine[i].color = sf::Color::Blue;
    }

    // 计算回归直线的两个点
    sf::VertexArray regressionLine(sf::LineStrip, 2);

    // 选择回归直线的显示范围
    float x_min = 0;
    float x_max = 800;

    // 计算回归直线的 Y 值
    float y_min = slope * x_min + intercept;
    float y_max = slope * x_max + intercept;

    regressionLine[0].position = sf::Vector2f(x_min, 600 - y_min);
    regressionLine[1].position = sf::Vector2f(x_max, 600 - y_max);
    regressionLine[0].color = sf::Color::Green;
    regressionLine[1].color = sf::Color::Green;

    // 主循环
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear(sf::Color::White);
        window.draw(dataLine);
        window.draw(regressionLine);
        window.display();
    }

    return 0;
}

解释

1、计算线性回归方程:
  • 使用 linearRegression 函数计算斜率和截距。
2、创建 SFML 窗口:
  • sf::RenderWindow 用于创建窗口。
3、绘制数据点:
  • 使用 sf::CircleShape 绘制数据点,设置填充颜色为红色。
4、绘制回归线:
  • 使用 sf::VertexArray 创建一个折线图,将数据点绘制为绿色线条。
  • 这里假设你要绘制的是回归直线,而不是折线图(PolyLine)。
5、主循环:
  • 处理窗口事件,绘制图形并更新显示。

注意事项

  • 坐标系:SFML 的默认坐标系原点在窗口的左上角,Y 轴向下增长。为了适应常见的数学坐标系,代码中反转了 Y 轴方向。
  • 回归线绘制:在上面的代码中,回归线的计算假设数据点在给定范围内。如果需要在更大范围内绘制回归线,可以调整 X 轴范围和相应的 Y 轴计算。

通过这些步骤,你可以得到最佳拟合直线的方程,从而描述数据点之间的线性关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王成长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值