C++如何实现简单的线性回归算法_C++基础机器学习算法代码实现【数据】

2次阅读

应使用 std::vector 存储数据,避免裸数组导致的越界、长度不一致和内存泄漏;需校验 x.size() == y.size(),处理空向量防除零;用 double 而非 Float 提升精度;单次遍历累加 sum_x、sum_y、sum_xy、sum_xx;分母为 0 时须判断;训练与预测应分离,返回 (m, b) 并封装预测函数;手动实现 R²、MSE 等指标,注意平方用 x*x、防除零及预处理缺失值。

C++如何实现简单的线性回归算法_C++基础机器学习算法代码实现【数据】

std::vector 存数据,别手写数组

线性回归最基础的输入是两组等长数值:xy。用 std::vector 而不是裸数组,能避免越界、长度不一致、内存泄漏等问题。尤其当数据来自文件或用户输入时,size() 可直接校验一致性:

  • 读入后立刻检查 x.size() == y.size(),不等就提前返回或抛异常
  • 空向量必须处理,否则除零(比如计算均值时 sum / vec.size()
  • 避免用 float——梯度、残差累加容易失精度,double 更稳妥

公式推导要落地到变量名,别照抄数学符号

斜率 m 和截距 b 的闭式解(最小二乘)是:

m = (n·Σxy − Σx·Σy) / (n·Σx² − (Σx)²) b = (Σy − m·Σx) / n

实际编码时,把 ΣxΣxy 等全部拆成独立变量,而不是在一行里嵌套求和:

  • double sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0; 显式声明
  • 单次遍历完成所有累加,别为每个 Σ 单独写一遍循环——效率低且易错
  • 分母为 0 时(即所有 x 值相同),必须判断并处理,否则 nan 或崩溃

预测函数要分离,别和训练混在一起

训练(拟合参数)和预测(给新 xy)是两个阶段。封装成独立函数更清晰、可测、可复用:

立即学习C++免费学习笔记(深入)”;

  • 训练返回 std::pair 表示 (m, b),或定义简单结构体
  • 预测函数只接收 mb 和单个 x,返回 y = m * x + b,不依赖原始数据
  • 如果后续要支持批量预测,再重载一个接受 const std::vector& x_new 的版本

没有 scikit-learn 就得自己管误差和边界

c++ 没有现成的 fit()score(),R²、MSE 这些得手动算。但更重要的是几个隐形坑:

  • std::pow(x, 2)x * x 慢且可能引入浮点误差,平方一律用乘法
  • 计算 R² 时,若所有 y 相同,总离差平方和为 0,会导致除零——需单独判断
  • 输入 x 极大(如 1e6)时,sum_xx 可能溢出 double,但日常小数据集不用过早优化

真正麻烦的是缺失值和异常点——C++ 标准库不帮你过滤,得在预处理阶段明确决定:跳过、报错,还是用中位数填充。

text=ZqhQzanResources