Sage二次回归得到错误拟合结果是否因输入数值量级过大?
问题核心原因分析
最主要诱因是输入数值量级过大导致的数值稳定性故障
你提供的x、y观测值位数均达到数十位,二次回归求解时需要计算x的平方项,量级会进一步飙升到上百位,此时最小二乘求解用到的正规方程矩阵条件数会远超双精度浮点运算的处理上限,数值计算过程中出现严重的截断误差,最终返回完全偏离真实值的拟合结果。其他可排查的潜在问题
- 检查
data变量格式是否符合要求:Sage的find_fit要求输入为二元组列表,每个元组按(x观测值, y观测值)的顺序排列,如果存在维度错序、数值类型异常的情况,也会返回异常拟合结果。 - 检查数据是否存在极端异常值:少量和整体趋势完全偏离的异常点,也会大幅拉动二次拟合的结果偏离预期。
可行解决方案
优先对数据做归一化处理后再拟合,拟合完成后把系数还原到原尺度即可,参考代码如下:
var('a,b,c') model(x) = a*x^2 + b*x + c # 提取原始数据的取值范围做归一化 x_list = [p[0] for p in data] y_list = [p[1] for p in data] x_min, x_max = min(x_list), max(x_list) y_min, y_max = min(y_list), max(y_list) # 把x、y都缩放到[0,1]区间,消除量级差异 norm_data = [ ((x - x_min)/(x_max - x_min), (y - y_min)/(y_max - y_min)) for x, y in data ] # 拟合归一化后的数据 norm_fit = find_fit(norm_data, model) # 后续自行根据缩放规则把a、b、c还原为原始尺度的系数即可
如果你的数据精度超过双精度浮点的上限,可以开启Sage的任意精度计算模式,指定更高的运算精度后再执行拟合逻辑。
内容的提问来源于stack exchange,提问作者Voldemort's Wrath
相关产品推荐
相关产品推荐

