为何N-1阶多项式回归无法过拟合正弦曲线?
多项式回归过拟合的问题疑惑
我尝试使用多项式回归对正弦曲线进行过拟合。根据我的理解,当拥有N个数据样本且多项式阶数为N-1时,曲线应穿过所有数据点,但在我的示例中并未实现。
我的代码如下:
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures import numpy as np import matplotlib.pyplot as plt N = 50 deg = 49 X = np.linspace(0, 2 * np.pi, N).reshape(-1, 1) X = np.sort(X, axis=0) y = np.sin(X) + np.random.randn(N, 1) * 0.2 poly_features = PolynomialFeatures(degree=deg, include_bias=False) X_poly = poly_features.fit_transform(X) reg = LinearRegression() reg.fit(X_poly, y) y_vals = reg.predict(X_poly) plt.scatter(X, y) plt.plot(X, y_vals, color='r') plt.show()
代码运行结果:
请问我存在哪些误解?
问题解析
- 对完美拟合的前提理解有误:只有在数据无噪声且特征矩阵满秩的理想情况下,N-1阶多项式才能严格穿过所有样本点。你给y添加了随机噪声,虽然理论上存在能拟合所有带噪声点的多项式,但实际受数值计算限制无法实现。
- 高次多项式的数值病态问题:49阶多项式生成的特征矩阵是范德蒙德矩阵,这类矩阵的特征值差距极大(低次项特征值极小,高次项特征值指数级膨胀),属于典型的病态矩阵。
LinearRegression采用的最小二乘法在求解病态矩阵时,浮点数的精度误差会被大幅放大,导致无法计算出能完美拟合所有点的系数。 - 验证方法:如果去掉y的噪声项(改为
y = np.sin(X)),重新运行代码会发现模型确实能完美穿过所有样本点,这也验证了噪声+数值稳定性才是问题的核心。
内容的提问来源于stack exchange,提问作者zaig
相关产品推荐
相关产品推荐

