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

用 std::vector 存数据,别手写数组
线性回归最基础的输入是两组等长数值:x 和 y。用 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或崩溃
预测函数要分离,别和训练混在一起
训练(拟合参数)和预测(给新 x 算 y)是两个阶段。封装成独立函数更清晰、可测、可复用:
立即学习“C++免费学习笔记(深入)”;
- 训练返回
std::pair表示(m, b),或定义简单结构体 - 预测函数只接收
m、b和单个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++ 标准库不帮你过滤,得在预处理阶段明确决定:跳过、报错,还是用中位数填充。









