Por que existem grandes coeficientes para polinômios de ordem superior

13

No livro de Bishop sobre aprendizado de máquina, ele discute o problema de ajustar uma função polinomial a um conjunto de pontos de dados.

Seja M a ordem do polinômio ajustado. Ele afirma que

Vemos que, à medida que M aumenta, a magnitude dos coeficientes geralmente aumenta. Em particular para o polinômio M = 9, os coeficientes foram ajustados com os dados, desenvolvendo grandes valores positivos e negativos, de modo que a função polinomial correspondente corresponda exatamente a cada um dos pontos de dados, mas entre os pontos de dados (principalmente perto dos fins do faixa) a função exibe grandes oscilações.

Não entendo por que valores grandes implicam um ajuste mais próximo dos pontos de dados. Eu pensaria que os valores se tornariam mais precisos após o decimal para um melhor ajuste.

Abhishek Bhatia
fonte
o livro considera y=sin(2πx)+ϵ x em 10 pontos igualmente espaçados em onde ϵ é gaussiano com média zero e variância 'pequena' (considerando a possibilidade de ajustar o polinômio 9 dimensional com 10 pontos ...[0 0,1]ϵ
seanv507

Respostas:

18

Esse é um problema conhecido com polinômios de alta ordem, conhecido como fenômeno de Runge . Numericamente, está associado ao mau condicionamento da matriz de Vandermonde , que torna os coeficientes muito sensíveis a pequenas variações nos dados e / ou arredondamentos nos cálculos (ou seja, o modelo não é identificável de maneira estável ). Veja também esta resposta no SciComp SE.

Existem muitas soluções para esse problema, por exemplo , aproximação de Chebyshev , splines de suavização e regularização de Tikhonov . A regularização de Tikhonov é uma generalização da regressão de crista , penalizando uma norma do vetor de coeficiente θ , onde para suavizar a matriz de pesos Λ é algum operador derivado. Para penalizar as oscilações, você pode usar Λ θ = p [ x ] , onde p [ x ]||Λθ]||θΛΛθ=p[x]p[x] é o polinômio avaliado nos dados.

EDIT: A resposta por notas utilizador hxd1011 que algumas das numéricos problemas mal-condicionado podem ser resolvidos usando polinômios ortogonais, o que é um ponto bom. Eu observaria, no entanto, que os problemas de identificação com polinômios de alta ordem ainda permanecem. Ou seja, o mau condicionamento numérico está associado à sensibilidade a perturbações "infinitesimais" (por exemplo, arredondamento), enquanto o mau condicionamento "estatístico" diz respeito à sensibilidade a perturbações "finitas" (por exemplo, valores extremos; o problema inverso está mal colocado ).

Os métodos mencionados no meu segundo parágrafo dizem respeito a essa sensibilidade externa . Você pode pensar nessa sensibilidade como uma violação do modelo de regressão linear padrão, que ao usar um desajuste de pressupõe implicitamente que os dados são gaussianos. A regularização de splines e Tikhonov lida com essa sensibilidade externa, impondo uma suavidade antes do ajuste. A aproximação de Chebyshev lida com isso usando umL2 desajuste aplicadasobre o domínio contínuo, isto é, não apenas nos pontos de dados. Embora os polinômios de Chebyshev sejam ortogonais (com base em um determinado produto interno ponderado), acredito que, se usados ​​com umdesajuste de L 2 sobre os dados,ainda assimLL2 tem sensibilidade externa.

GeoMatt22
fonte
@ hxd1011 isso é verdade, e dei o exemplo de polinômios de Chebyshev. Os polinômios ortogonais sempre resolverão o problema na prática, se houver discrepâncias e o desajuste dos dados ainda for ? Eu acho que o fenômeno Runge seria ainda causa problemas de confiabilidade nos coeficientes neste caso (ou seja, para finitos / grandes perturbações sobre os dados, contra infinitesimal de arredondamento.)eu2
GeoMatt22
1
+1. Agradável no comentário . Para quem quer saber de onde isso vem, estudar como os splines de suavização funcionam é algo que abre os olhos. p
Matthew Drury
1
Onde posso aprender mais sobre esse negócio de "mau condicionamento da matriz vandermonde"?
Matthew Drury
@MatthewDrury Eu geralmente também faço a abordagem empírica sugerida pelo hxd1011. No entanto, após sua consulta, um rápido Google revelou um artigo recente que também pode ser interessante: Quão ruins são as matrizes de Vandermonde? (VY Pan, 2015) . (Por exemplo, ele aborda por matrizes DFT são Vandermonde mas não mal condicionado.)
GeoMatt22
Obrigado @ GeoMatt22. Desculpe fazer o Google para mim, perguntei, pois pensei que você poderia ter algumas fontes favoritas pessoais.
Matthew Drury
8

A primeira coisa que você deseja verificar é se o autor está falando sobre polinômios brutos vs. polinômios ortogonais .

Para polinômios ortogonais. o coeficiente não está ficando "maior".

Aqui estão dois exemplos de expansão polinomial de 2ª e 15ª ordem. Primeiro, mostramos o coeficiente para a expansão de 2ª ordem.

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

Então nós mostramos a 15ª ordem.

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

Note que estamos usando polinômios ortogonais ; portanto, o coeficiente da ordem inferior é exatamente o mesmo que os termos correspondentes nos resultados da ordem superior. Por exemplo, a interceptação e o coeficiente para a primeira ordem são 20,09 e -29,11 para ambos os modelos.

106

> 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
Haitao Du
fonte
Eu não estou certo a sintaxe está correta, mas por que você não contrastar os resultados de v matéria-ortogonal com algo ao longo das linhassummary(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))
Antoni Parellada
@AntoniParellada boa sugestão, vou revisar. BTW, podemos facilmente fazer a expansão bruta por #poly(x,2,raw=T)
Haitao Du
Bom truque ... Acho que você pode ficar com 15 e fazer summary(lm(mpg~poly(wt,15, raw=T),mtcars)). Efeito maciço nos coeficientes!
Antoni Parellada
Um comentário na minha resposta por @ seanv507 me deixou curioso sobre o seguinte. Se você usa polinômios ortogonais e deseja reduzir a sensibilidade a valores extremos, a regressão padrão da crista é suficiente? Ou os polinômios mais oscilatórios e de ordem superior ainda exigem pesos - ordem? (Acho que o último, como por exemplo, um DFT matriz é ortogonal, mas downweighting altas frequências ainda seriam necessárias tive experiência (desagradável) com este caso particular.!)
GeoMatt22
3

Abhishek, você está certo de que melhorar a precisão dos coeficientes aumentará a precisão.

Vemos que, à medida que M aumenta, a magnitude dos coeficientes geralmente aumenta. Em particular para o polinômio M = 9, os coeficientes foram sintonizados com os dados por meio do desenvolvimento de grandes valores positivos e negativos, de modo que a função polinomial correspondente corresponda exatamente a cada um dos pontos de dados, mas entre os pontos de dados (principalmente próximo ao final do faixa) a função exibe grandes oscilações.

Eu acho que a questão da magnitude é bastante irrelevante para o argumento geral de Bishop - que o uso de um modelo complicado com dados limitados leva a um "ajuste excessivo". No exemplo dele, 10 pontos de dados são usados ​​para estimar um polinômio de 9 dimensões (ou seja, 10 variáveis ​​e 10 incógnitas).

Se ajustarmos uma onda senoidal (sem ruído), o ajuste funcionará perfeitamente, pois as ondas senoidais [em um intervalo fixo] podem ser aproximadas com precisão arbitrária usando polinômios. No entanto, no exemplo de Bishop, temos uma certa quantidade de "ruído" que não devemos caber. A maneira como fazemos isso é mantendo o número de pontos de dados em relação ao número de variáveis ​​do modelo (coeficientes polinomiais) grandes ou usando a regularização. Ajuste polinomial de 9ª ordem a 10 pontos dat em (0,1)

A regularização impõe restrições "suaves" ao modelo (por exemplo, na regressão de crista), a função de custo que você tenta minimizar é uma combinação de "erro de ajuste" e complexidade do modelo: por exemplo, na regressão de crista, a complexidade é medida pela soma dos coeficientes quadrados. efeito, isso impõe um custo na redução de erros - o aumento dos coeficientes só será permitido se houver uma redução grande o suficiente no erro de ajuste [quão grande é o tamanho suficiente é especificado por um multiplicador no termo de complexidade do modelo]. Portanto, a esperança é que, escolhendo o multiplicador apropriado, não nos ajustemos a termos adicionais de ruído pequeno, uma vez que a melhoria no ajuste não justifica o aumento dos coeficientes.

Você perguntou por que coeficientes grandes melhoram a qualidade do ajuste. Essencialmente, o motivo é que a função estimada (sin + ruído) não é um polinômio, e as grandes alterações na curvatura necessárias para aproximar o efeito do ruído com polinômios exigem grandes coeficientes.

Observe que o uso de polinômios ortogonais não tem efeito (adicionei um deslocamento de 0,1 apenas para que os polinômios ortogonais e brutos não fiquem em cima um do outro)

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'))
seanv507
fonte