使用polyfit拟合7次多项式时出现Polynomial is badly conditioned警告的原因咨询
关于polyfit拟合7次多项式出现警告的原因及解决办法
先还原下你的操作场景:
你的输入数据是:
x = [0 5 10 15 20 25 30 35].'; y = [72.3 73.6 75.1 77.0 77.6 77.9 79.2 80.4].';
执行拟合代码:
pg7 = polyfit(x,y,7);
随后收到警告:
Warning: Polynomial is badly conditioned. Add points with distinct X values, reduce the degree of the polynomial, or try centering and scaling as described in HELP POLYFIT.
警告产生的原因
这个警告本质是多项式拟合的数值病态问题,具体来说有两个核心因素:
- 数据点数量与多项式次数匹配度过高:你用8个数据点去拟合7次多项式,刚好是“完全插值”的情况——7次多项式理论上可以精准穿过所有8个点,但这种拟合的系数矩阵条件数极大。简单讲就是,x的微小波动会导致多项式系数出现巨幅变化,拟合结果的稳定性极差,泛化能力几乎为零,稍微换个x值预测y就会偏差到离谱。
- 高次项数值量级悬殊:你的x范围是0到35,计算x7的时候数值会达到非常大的量级(比如357已经是约6.4e10),而低次项(比如x^0就是1)的数值量级和高次项差了好几个数量级,这种差异会让计算过程中的舍入误差被急剧放大,进一步加剧了数值计算的不稳定性。
可行的解决办法
- 降低多项式次数(最推荐):高次多项式很容易出现过拟合,反而失去了拟合的实际意义。你可以先尝试2次、3次这类低次多项式,看看拟合效果是否能满足需求。示例代码:
pg2 = polyfit(x,y,2); % 拟合2次多项式 - 补充更多数据点:如果业务场景确实需要高次拟合,那就得增加更多不同x值对应的y数据,让数据点数量远大于多项式次数,这样能有效降低系数矩阵的条件数,提升计算稳定性。
- 对数据进行中心化/标准化处理:polyfit自带了处理参数,你可以通过
'centered'或'scaled'选项对x数据做转换,把x调整为均值为0、标准差为1的标准化数据,缩小不同次项的数值量级差异,改善病态性。注意用polyval预测时要带上返回的mu参数来还原数据,示例:[pg7,~,mu] = polyfit(x,y,7,'scaled'); y_pred = polyval(pg7,x,mu); % 基于标准化参数做预测
内容的提问来源于stack exchange,提问作者user9823615
相关产品推荐
相关产品推荐

