在Bishop的机器学习书中,它讨论了将多项式函数曲线拟合到一组数据点的问题。
令M为多项式拟合的阶数。它指出
我们看到,随着M的增加,系数的大小通常会变大。特别是对于M = 9的多项式,通过产生较大的正值和负值,系数已经微调到数据,因此相应的多项式函数恰好与每个数据点匹配,但与数据点之间(尤其是在数据点的末端附近)匹配范围)功能显示出较大的振荡。
我不明白为什么大值意味着更紧密地拟合数据点。我认为这些值会在小数点后变得更精确,而不是为了更好地拟合。
在Bishop的机器学习书中,它讨论了将多项式函数曲线拟合到一组数据点的问题。
令M为多项式拟合的阶数。它指出
我们看到,随着M的增加,系数的大小通常会变大。特别是对于M = 9的多项式,通过产生较大的正值和负值,系数已经微调到数据,因此相应的多项式函数恰好与每个数据点匹配,但与数据点之间(尤其是在数据点的末端附近)匹配范围)功能显示出较大的振荡。
我不明白为什么大值意味着更紧密地拟合数据点。我认为这些值会在小数点后变得更精确,而不是为了更好地拟合。
Answers:
这是高阶多项式的一个众所周知的问题,称为朗格现象。数值与它相关联病态的的Vandermonde矩阵,这使得系数在计算中的数据和/或舍入的小变化非常敏感(即,模型是不能稳定地识别)。另请参阅SciComp SE上的此答案。
这个问题有很多解决方案,例如Chebyshev逼近,平滑样条和Tikhonov正则化。Tikhonov正则化是岭回归的广义化,对范数 |||进行惩罚 系数向量,其中用于平滑权重矩阵是一些导数算子。要惩罚振荡,您可以使用,其中θ Λ Λ θ = p ' ' [ X ]是在数据中求值的多项式。
编辑:用户hxd1011的答案指出,可以使用正交多项式解决某些数值不佳问题,这是一个很好的观点。但是,我要指出的是,高阶多项式的可识别性问题仍然存在。也就是说,数值病态与“无限”摄动(例如舍入)的敏感性相关,而“统计”病态与对“有限”摄动的敏感性(例如离群值;反问题是不适定的)相关。)的。
我在第二段中提到的方法与这种异常敏感度有关。您可以将这种敏感性视为违反标准线性回归模型,该模型通过使用失配隐式地假设数据为高斯模型。样条曲线和Tikhonov正则化通过在拟合之前施加平滑度来处理这种异常敏感度。Chebyshev近似通过使用应用于连续域的失配来处理此问题,即不仅仅在数据点上。尽管Chebyshev多项式是正交的(写了一定的加权内积),但我相信,如果对数据使用失配,它们仍然具有异常的敏感性。大号∞大号2
首先要检查的是作者是在谈论原始多项式还是正交多项式。
对于正交多项式。系数不会变得“更大”。
这是二阶和十五阶多项式展开的两个示例。首先,我们显示二阶展开的系数。
summary(lm(mpg~poly(wt,2),mtcars))
Call:
lm(formula = mpg ~ poly(wt, 2), data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-3.483 -1.998 -0.773 1.462 6.238
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 20.0906 0.4686 42.877 < 2e-16 ***
poly(wt, 2)1 -29.1157 2.6506 -10.985 7.52e-12 ***
poly(wt, 2)2 8.6358 2.6506 3.258 0.00286 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.651 on 29 degrees of freedom
Multiple R-squared: 0.8191, Adjusted R-squared: 0.8066
F-statistic: 65.64 on 2 and 29 DF, p-value: 1.715e-11
然后我们显示15阶。
summary(lm(mpg~poly(wt,15),mtcars))
Call:
lm(formula = mpg ~ poly(wt, 15), data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-5.3233 -0.4641 0.0072 0.6401 4.0394
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 20.0906 0.4551 44.147 < 2e-16 ***
poly(wt, 15)1 -29.1157 2.5743 -11.310 4.83e-09 ***
poly(wt, 15)2 8.6358 2.5743 3.355 0.00403 **
poly(wt, 15)3 0.2749 2.5743 0.107 0.91629
poly(wt, 15)4 -1.7891 2.5743 -0.695 0.49705
poly(wt, 15)5 1.8797 2.5743 0.730 0.47584
poly(wt, 15)6 -2.8354 2.5743 -1.101 0.28702
poly(wt, 15)7 2.5613 2.5743 0.995 0.33459
poly(wt, 15)8 1.5772 2.5743 0.613 0.54872
poly(wt, 15)9 -5.2412 2.5743 -2.036 0.05866 .
poly(wt, 15)10 -2.4959 2.5743 -0.970 0.34672
poly(wt, 15)11 2.5007 2.5743 0.971 0.34580
poly(wt, 15)12 2.4263 2.5743 0.942 0.35996
poly(wt, 15)13 -2.0134 2.5743 -0.782 0.44559
poly(wt, 15)14 3.3994 2.5743 1.320 0.20525
poly(wt, 15)15 -3.5161 2.5743 -1.366 0.19089
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.574 on 16 degrees of freedom
Multiple R-squared: 0.9058, Adjusted R-squared: 0.8176
F-statistic: 10.26 on 15 and 16 DF, p-value: 1.558e-05
注意,我们使用正交多项式,因此低阶系数与高阶结果中的相应项完全相同。例如,两个模型的截距和一阶系数分别为20.09和-29.11。
另一方面,如果使用原始扩展,则不会发生这种情况。而且我们将拥有较大且敏感的系数!在下面的示例中,我们可以看到系数在左右。
> summary(lm(mpg~poly(wt,15, raw=T),mtcars))
Call:
lm(formula = mpg ~ poly(wt, 15, raw = T), data = mtcars)
Residuals:
Min 1Q Median 3Q Max
-5.6217 -0.7544 0.0306 1.1678 5.4308
Coefficients: (3 not defined because of singularities)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.287e+05 9.991e+05 0.629 0.537
poly(wt, 15, raw = T)1 -2.713e+06 4.195e+06 -0.647 0.526
poly(wt, 15, raw = T)2 5.246e+06 7.893e+06 0.665 0.514
poly(wt, 15, raw = T)3 -6.001e+06 8.784e+06 -0.683 0.503
poly(wt, 15, raw = T)4 4.512e+06 6.427e+06 0.702 0.491
poly(wt, 15, raw = T)5 -2.340e+06 3.246e+06 -0.721 0.480
poly(wt, 15, raw = T)6 8.537e+05 1.154e+06 0.740 0.468
poly(wt, 15, raw = T)7 -2.184e+05 2.880e+05 -0.758 0.458
poly(wt, 15, raw = T)8 3.809e+04 4.910e+04 0.776 0.447
poly(wt, 15, raw = T)9 -4.212e+03 5.314e+03 -0.793 0.438
poly(wt, 15, raw = T)10 2.382e+02 2.947e+02 0.809 0.429
poly(wt, 15, raw = T)11 NA NA NA NA
poly(wt, 15, raw = T)12 -5.642e-01 6.742e-01 -0.837 0.413
poly(wt, 15, raw = T)13 NA NA NA NA
poly(wt, 15, raw = T)14 NA NA NA NA
poly(wt, 15, raw = T)15 1.259e-04 1.447e-04 0.870 0.395
Residual standard error: 2.659 on 19 degrees of freedom
Multiple R-squared: 0.8807, Adjusted R-squared: 0.8053
F-statistic: 11.68 on 12 and 19 DF, p-value: 2.362e-06
summary(lm(mpg~poly(wt,2),mtcars)); summary(lm(mpg~poly(wt,5),mtcars)); summary(lm(mpg~ wt + I(wt^2),mtcars)); summary(lm(mpg~ wt + I(wt^2) + I(wt^3) + I(wt^4) + I(wt^5),mtcars))
poly(x,2,raw=T)
summary(lm(mpg~poly(wt,15, raw=T),mtcars))
。系数系数大!
阿布舍克(Abhishek),正确的是,提高系数的精度将提高精度。
我们看到,随着M的增加,系数的大小通常会变大。特别是对于M = 9的多项式,通过产生较大的正值和负值,系数已经微调到数据,因此相应的多项式函数恰好与每个数据点匹配,但与数据点之间(尤其是在数据点的末端附近)匹配范围)功能显示出较大的振荡。
我认为幅度问题与Bishop的整体观点无关,即在有限的数据上使用复杂的模型会导致“过度拟合”。在他的示例中,使用10个数据点来估计9维多项式(即10个变量和10个未知数)。
如果我们拟合正弦波(无噪声),则拟合效果很好,因为正弦波(在固定间隔内)可以使用多项式以任意精度近似。但是,在Bishop的示例中,我们有一定数量的“噪声”,我们不应该使用。我们这样做的方法是将数据点的数量保持为模型变量(多项式系数)的数量较大,或者使用正则化。
正则化对模型施加“软”约束(例如,在岭回归中),您尝试最小化的成本函数是“拟合误差”和模型复杂度的组合:例如,在岭回归中,复杂度由系数平方和的总和来衡量。因此,这会为减少误差带来成本-只有在拟合误差的减小幅度足够大的情况下才允许增加系数[模型复杂度项的乘数指定了足够大的幅度]。因此,希望是通过选择适当的乘数,我们将不适合附加的小噪声项,因为拟合的提高不能证明系数的增加是合理的。
您问为什么大系数会改善拟合质量。本质上,原因是估计的函数(正弦+噪声)不是多项式,并且用多项式近似噪声效果所需的曲率的大变化需要大的系数。
请注意,使用正交多项式没有任何效果(我添加了0.1的偏移量,只是使正交多项式和原始多项式不在彼此的顶部)
require (penalized)
poly_order<-9
x_long<-seq(0,1, length.out = 100)
nx<-10
x<-seq(0,1, length.out = nx)
noise<- rnorm(nx, 0, 1)
noise_scale<-0.2
y<-sin(2*pi*x)+noise_scale*noise
training_data<-data.frame(x=x,y=y)
y_long<-sin(2*pi*x_long)
plot(x,y, col ='blue',ylim=c(-1.5,1.5))
lines(x_long,y_long,col='green')
polyfit_raw<-lm(y~poly(x,poly_order,raw=TRUE),data=training_data)
summary(polyfit_raw)
polyfit_raw_ridge1<-penalized(y,~poly(x,poly_order,raw=TRUE), model='linear', data=training_data, lambda2=0.0001, maxiter=10000, standardize=TRUE)
polyfit_orthog<-lm(y~poly(x,poly_order),data=training_data)
summary(polyfit_orthog)
pred_raw<-predict(polyfit_raw,data.frame(x=x_long))
pred_ortho<-predict(polyfit_orthog,data.frame(x=x_long))
pred_raw_ridge<-predict(polyfit_raw_ridge1,data=data.frame(x=x_long))[,'mu']
lines(x_long,pred_raw,col='red')
# add 0.1 offset to make visible
lines(x_long,pred_ortho+0.1,col='black')
lines(x_long,pred_raw_ridge,col='purple')
legend("bottomleft",legend=c('data sin(2 pi x) + noise','sin(2 pi x)',
'raw poly','orthog poly +0.1 offset','raw poly + ridge regression'),
fill=c('blue','green','red','black','purple'))