线性回归方程用于描述两个变量之间的线性关系。最常见的线性回归模型是简单线性回归,它用于描述一个自变量 𝑥和一个因变量 𝑦 之间的关系。其方程形式为:
其中:
• β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 轴计算。
通过这些步骤,你可以得到最佳拟合直线的方程,从而描述数据点之间的线性关系。