Escolar Documentos
Profissional Documentos
Cultura Documentos
Departamento de Estatística
Universidade Federal de Minas Gerais
Outubro 2018
Contents
1 Introdução 5
1.1 Nelder-Mead . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.1 O que é o algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.2 Simplex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.1.3 Funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.1.4 Critério de parada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.1.5 Falha do método . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.6 Reinicialização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.1.7 Vantagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.1.8 Desvantagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2 Algoritmo 13
3 Aplicação 15
3.1 Caso univariado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2 Caso multivariado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.2.1 Função Sombreiro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2.2 Normal Bivariada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 Exercício 23
Bibliography 25
3
1
Introdução
1.1 Nelder-Mead
Proposto por John Nelder e Roger Mead em 1965, é um método numérico comumente usado para
encontrar o mínimo ou o máximo de uma função objetiva em um espaço multidimensional. É aplicado em
problemas de otimização não-linear para os quais as derivadas não podem ser encontradas.
Por utilizar o conceito de simplex, também é conhecido como método amoeba ou downhill simplex e
cada iteração é baseada em um simplex de k+1 vértices ordenados pelo valor da função. É um método
de busca direta, pois depende somente das classificações de uma coleção de avaliações da função em
possíveis soluções, enquanto tenta encontrar um ponto superior para a próxima iteração.
A eficiência do método baseia-se na capacidade de adaptar bem as curvaturas das funções. Entretanto
a geometria do problema pode ser moldada em tal ponto que pode não ocorrer a convergência à pontos
estacionários.
1.1.2 Simplex
5
1.1.3 Funcionamento
A t-ésima iteração do algoritmo de Nelder-Mead se inicia com um conjunto de pontos, os quais representam
possíveis soluções, isto é, aproximações do valor máximo da função. Esses pontos definem os vértices
do simplex no qual o esforço de busca é focado. Uma iteração do algoritmo tem como objetivo mudar a
forma e o tamanho do simplex através da identificação de um candidato para substituir o pior ponto do
conjunto.
Quando x é p-dimensional, p+1 pontos distintos (x1 , ..., xp+1 ) definem um simplex p-dimensional.
Os vértices do simplex podem ser classificados do melhor para o pior de acordo com a classificação de
g(x1 ),...,g(xp+1 )
Figure 1.2: Simplex sobreposto aos contornos de uma função objetiva g para p = 2. O vértice best está
próximo ao ponto ótimo de g. A melhor face do triângulo é o lado contendo c, o centroide.
Para encontrar o valor máximo da função, seja xbest o vértice com com o mair valor da função objetiva
e xworst o pior. Denote o segundo pior vértice do simplex como xbad É possível definir a melhor face
como aquela oposta ao vértice xworst . A melhor face é, portanto, o hiperplano que contém os outros
pontos e seu centróide é a média de todos os outros vértice, ou seja,
p+1
" ! #
1 X
c= xi − xworst
p
i=1
Após identificar o pior, o segundo pior e o melhor vértice, o objetivo será substituir o pior vértice
por um melhor. O algoritmo requer que o novo ponto esteja no raio que se estende de xworst até c,
sendo, portanto, chamado de busca direta. Nesse caso, o novo vértice será movido em direção a melhores
alternativas, que se distanciem do vértice classificado como o pior. Além disso, essa substituição irá
alterar a forma e o tamanho do simplex.
É importante observar que embora a busca direta possa ser promissora, a qualidade do novo vértice
também dependerá da distância desse ponto e do xworst , sendo que essa distância modifica o tamanho do
simplex.
A localização do novo vértice escolhido é baseada no vértice de reflexão xr definido como
xr = c + αr (c − xworst ) .
A reflexão requer αr > 0 e geralmente adota-se αr = 1. Embora xr não seja o novo vértice, seu valor
juntamente com c e xworst são utilizados para determinar o novo ponto.
6
De forma geral o algoritmo funciona da seguinte forma, considerando primeiramente a situação em
que g(xr ) excede g(xbad ). Se g(xr ) não excede o valor da função objetiva de xbest , então xr é aceito
como o novo vértice e xworst é descartado. O conjunto de vértices atualizados definem um novo simplex
e uma nova iteração do algoritmo começa. No entanto, se g(xr ) > g(xbest ), então o vértice refletido é
melhor que o melhor vértice atual, então a busca por uma melhora ainda maior será realizada em direção
a g(xr ), o que leva a uma tentativa de expansão. Finalmente, se g(xr ) é pior que g(xbad ), então uma
tentativa de mitigar esse resultado desfavorável é através da contração de g(xr ).
Uma expansão ocorre quando g(xr ) excede g(xbest ). Um ponto de expansão xe é então definido
como
xe = c + αe (xr − c) ,
onde αe > max(1, αr ) e geralmente adota-se αe = 2. Então xe é o ponto ao longo do vetor de busca
direta além de xr . Se g(xe ) excede g(xr ) então a expansão foi bem sucedida e g(xe ) é aceito como o
novo vértice, xworst é descartado e inicia-se uma nova iteração. Se g(xe ) não excede g(xr ), então xr é o
novo vértice, xworst é descartado e inicia-se uma nova iteração.
Até então foram avaliados casos, em que xr ou xe são melhores que xbad , o segundo pior vértice.
Quando g(xr ) não é maior que g(xbad ) uma busca adicional é neessária, pois xr , pode ser um vértice pior,
embora tenha substituído xworst . a estratégia de contração é identificar um vértice final em algum lugar
ao longo da direção de busca entre xworst e xr . Quando esse vértice está entre c e xr , a transformação é
chamada contração externa, caso contrário é chamada contração interna.
A contração externa ocorre quando g(xbad ) ≥ g(xr ) > g(xworst ). O vértice obtido por uma contração
externa é definido como
x0 = c + αc (xr − c)
onde 0 < αc < 1 e adota-se αc = 12 . Se g(x0 ) ≥ g(xr ) então o vértice de contração externa é pelo menos
tão bom quanto o vértice obtido pela reflexão, então x0 é escolhido para substituir xworst . Caso contrário,
tem-se a situação em que xr poderia ser o pior vértice depois de ter substituído xworst . Nesse caso, ao
invés de realizar essa substituição sem sentido, uma transformação de retração é executada conforme será
descrito posteriormente.
Uma contração interna é realizada quando g(xr ) ≤ g(xworst ), ou seja, quando xr é pior que todos os
vértices do simplex. Nesse caso, um ponto de contração interna é definido como
xi = c + αc (xworst − c)
7
Então se g(xi ) ≥ g(xworst ), xi é escolhido para substituir xworst . caso contrário, nenhuma substitu-
ição razoável para xworst é identificada.
Quando tudo mais falhar, o simplex é submetido a uma transformação de encolhimento. Nesse caso,
todos os vértices com exceção do melhor são encolhidos em direção do xbest através da transformação do
j-ésimo vértice xj para xsj de acordo com a seguinte expressão
onde j = 1, ..., p + 1.
Essa transformação irá focar o simplex próximo ao vértice com maior valor da função objetiva. Na
prática o encolhimento acontece raramente e requer que 0 < αs < 1 e adota-se α = 12 .
Figure 1.4: Maximização de uma complicada função bivariada por meio do algoritmo de Nelder-Mead.
Para verificar a mudança na localização dos vértices, observar a mudança do melhor vértice, xbest ,
não é uma boa escolha, já que ele pode permanecer inalterado por vários passos até que um outro ponto
seja encontrado para substituí-lo.
Uma opção mais efetiva para monitorar a convergência é observar o volume do simples, ao invés de
qualquer ponto em particular.
8
1.1.5 Falha do método
A falha do método é ilustrada na Figura 1.5, na qual ocorre um colapso do simplex.
Considerando a seguinte função objetiva, para p = 2 e x = (x1 , x2 );
(
−360|x1 |2 − x2 − x22 , x1 ≤ 0
g(x1 , x2 ) =
−6x21 − x2 − x22 , cc
Para os chutes iniciais (0,0),(1,1) e (0.84,-0.59), as iterações produzem simplex para os quais os
melhores vértices nunca mudam, apesar de estarem longe de qualquer extremo. Ainda assim a área do
simplex converge para zero, como observado na Figura 1.5. Nesse caso, a busca direta se torna ortogonal
a g0 de modo que a melhoria em sucessivas iterações convergem para zero.
1.1.6 Reinicialização
Quando verifica-se a estagnação do algoritmo, uma reinicialização com um simplex diferente pode ser
a solução para o problema, colocando o algoritmo em um diferente e possivelmente numa trajetória
mais produtiva. Alternativamente, a reinicialização orientada é projetada com o objetivo de remodelar o
simplex visando a convergência. Definindo como p x p uma matriz de direções do simplex como:
p+1
1 X (t)
g −(t) = g(xi )
p+1
i=1
9
a média dos valores da função objetiva dos vértices S (t) na iteração t. Define-se um crescimento
suficiente na qualidade do simplex da iteração t para t + 1, quando
(t+1) (t)
x1 = x1 + βj ej
para j = 2, ..., p+1, onde ej é o vetor unitário p ao longo dos eixos coordenados e βj orienta e dimensiona
os passos da seguinte forma:
n o n o
(t)) (t))
(
−d(t) sinal D(Sj−1 , sinal D(Sj−1 6= 0
βj =
0, cc
(t)
onde D(Sj−1 , para j = 2, ..., p + 1 representa a componente correspondente do gradiente S (t) e o fator
escalar d(t) é o comprimento mínimo orientado
(t) (t)
d(t) = min||x1 − xj ||.
A justificativa para a reinicialização orientada é que um novo gradiente do simplex no ponto xbest
deve apontar em uma direção que se aproxima do verdadeiro gradiente da função objetivo, uma vez que o
simplex seja pequeno o suficiente e desde que o gradiente do simplex esteja no octante correto.
1.1.7 Vantagens
• O método possui uma abordagem robusta, no sentido de que pode ser usado para encontrar o ponto
ótimo de uma vasta gama de funções;
10
1.1.8 Desvantagens
Como desvantagens da utilização deste método, destacam-se:
• Em alguns casos, o algoritmo pode convergir para pontos que não são de máximo nem mínimo;
11
2
Algoritmo
1. Inicialização
Para t = 1:
(t) (t)
• Escolha os vértices iniciais x1 , . . . xp+1 ;
• Escolha os valores dos α’s tais que:
αr > 0,
αe > max(1, αr ),
αc ∈ (0, 1),
αs ∈ (0, 1).
2. Ordenação
Ordene os vértices de acordo com seu valor avaliado na função de interesse e nomeie:
(t)
• xbest : maior valor de g(x);
(t)
• xbad : segundo menor valor de g(x);
(t)
• xworst : menor valor de g(x).
3. Orientação (direção)
Calcule:
p+1
" ! #
1 X (t) (t)
c(t) = xi − xworst
p
i=1
4. Reflexão
(t) (t)
Calcule xr = c(t) + αr (c(t) − xworst ).
(t) (t) (t)
Compare g(xr ) com g(xbest ) e g(xbad )
(t) (t) (t) (t)
• Se g(xbest ) ≥ g(xr ) > g(xbad ): aceite xr como novo vértice para iteração t + 1 e descarte
(t)
xworst . Vá para o passo de parada (8).
13
(t) (t)
• Se g(xr ) > g(xbest ): vá para o passo de expansão (5).
• Caso contrário: vá para o passo de contração (6).
5. Expansão
(t) (t)
Calcule xe = c(t) + αe (xr − c(t) ).
(t) (t)
Compare g(xe ) com g(xbest ).
(t) (t) (t) (t)
• Se g(xe ) > g(xr ): aceite xe como novo vértice para iteração t + 1 e descarte xworst . Vá
para o passo de parada (8).
(t) (t)
• Caso contrário: aceite xr como novo vértice para iteração t + 1 e descarte xworst . Vá para o
passo de parada (8).
6. Contração
(t) (t) (t)
Compare g(xe ) com g(xbad ) e g(xworst ).
(t) (t) (t)
• Se g(xbad ) ≥ g(xr ) > g(xworst ): Contração Externa.
(t) (t)
i Calcule xo = c(t) + αc (xr − c(t) ).
(t) (t) (t) (t)
ii Se g(xo ) ≥ g(xr ): aceite xo como novo vértice para iteração t + 1 e descarte xworst .
Vá para o passo de parada (8).
iii Caso contrário vá para o passo de encolhimento (7).
(t) (t)
• Se g(xworst ) ≥ g(xr ): Contração Interna.
(t) (t)
i Calcule xi = c(t) + αc (xworst − c(t) ).
(t) (t) (t)
ii Se g(xi ) > g(xworst ): aceite xi como novo vértice para iteração t + 1 e descarte
(t)
xworst . Vá para o passo de parada (8).
iii Caso contrário vá para o passo de encolhimento (7).
7. Encolhimento
(t) (t) (t) (t) (t) (t)
Para todo j = 1, . . . p + 1 tal que xj 6= xbest calcule xsj = xbest + αs (xj − xbest ).
(t)
Forme um novo simplex com os vértices xbest e os p novos vértices para iteração t + 1. Vá para o
passo de parada (8).
8. Parada
Verifique o critério de convergência. Se ele não foi atingido, incremente t para t + 1 e retorne ao
(t)
passo de ordenação (2). Caso contrário, xbest ) é dado como o valor que aproxima o maximizador
de g
14
3
Aplicação
Neste topico são apresentadas aplicações da maximização de funções por meio do algoritmo Nelder-Mead
para o caso de uma função univariada e multivariada. Os códigos foram desenvolvidos em R.
|g(xbest ) − g(xworst )| ≤
|xbest − xworst | ≤
15
area = 0
while(1==1){
#2) Sort x = c(-1,2,4)
#stopping_step_flag = 0
expansion_step_flag = 0
contraction_step_flag = 0
shrinking_step_flag = 0
x_best = x[which.max(g(x))]
x_bad = x[-c(which.max(g(x)),which.min(g(x)))]
x_worst = x[which.min(g(x))]
#3) Orient
c = (1/3)*(x_best+x_bad - x_worst)
#4) Reflect
x_r = c + alpha_r*(c-x_worst)
if((g(x_best)>=g(x_r))&(g(x_r)>g(x_bad))){
x[which.min(g(x))] = x_r
#stopping_step_flag = 1
}else if(g(x_r)>g(x_best)){
expansion_step_flag = 1
}else{
contraction_step_flag = 1
}
#5) Expansion
if(expansion_step_flag == 1){
x_e = c + alpha_e*(x_r - c)
if(g(x_e)>g(x_r)){
x[which.min(g(x))] = x_e
#stopping_step_flag = 1
}else{
x[which.min(g(x))] = x_r
#stopping_step_flag = 1
}
}
#6) Contraction
if(contraction_step_flag == 1){
#a) Outer Contraction
16
if((g(x_bad)>=g(x_r))&(g(x_r)>g(x_worst))){
x_o = c + alpha_c*(x_r-c)
if(g(x_o)>=g(x_r)){
x[which.min(g(x))] = x_o
#stopping_step_flag = 1
}else{
shrinking_step_flag = 1
}
}
#b) Inner Contraction
if(g(x_worst)>=g(x_r)){
x_i = c + alpha_c*(x_worst-c)
if(g(x_i)>g(x_worst)){
x[which.min(g(x))] = x_i
#stopping_step_flag = 1
}else{
shrinking_step_flag = 1
}
}
}
#7) Shrinking
if(shrinking_step_flag == 1){
x_sb = x_best + alpha_s*(x_bad-x_best)
x_sw = x_best + alpha_s*(x_worst-x_best)
x = c(x_best, x_sb, x_sw)
}
#8) Stopping
safe_count = safe_count+1
area = abs(x[1]*(g(x[2])-g(x[3]))
+ x[2]*(g(x[3])-g(x[1]))
+ x[3]*(g(x[1])-g(x[2])) )/2
if((area <= epsilon)
& (abs(g(x_best)-g(x_worst))<epsilon)
& (abs(max(x)-min(x))<epsilon)){ #Check convergence criteria
return(x_best)
}
if(safe_count>=100){
print("Convergence not achieved")
return(NULL)
17
}
}
}
grid = seq(0,8,0.01)
plot(grid,func(grid),type="l")
inits = sample(grid,3)
#inits = c(0.1,1,0.5)
max = nelder.mead(inits, func)
paste("max = ",round(max,2)," f(max) = ", round(func(max),2))
optim(4,func,method = "Nelder-Mead")
Figure 3.1: Resultado da maximização de uma Γ(4, 2) por meio do algoritmo Nelder-Mead.
18
vetor pontos iniciais de x, sob os quais o algoritmo encontrará um simplex adequado, e a função a ser
maximizada/minimizada, que deve ser escrita na forma de vetor, e.g. x = [x1 , x2 , . . . , xn ].
Como essa função possui pontos de máximo local, de acordo com os valores iniciais escolhidos um
valor distinto para o ponto de máximo pode ser encontrado pela função optim.
Abaixo é apresentado o código em R para maximização da função.
require(scatterplot3d)
19
#max = optim(c(-5,-5), fn, method = "Nelder-Mead",control=list(fnscale=-1))
#max = optim(c(-10,10), fn, method = "Nelder-Mead",control=list(fnscale=-1))
max$par
max$value
Figure 3.3: par:(−2, 2) Figure 3.4: par:(−10, 10) Figure 3.5: par:(−5, −5)
Figure 3.6: Valores de máximo (triângulo vermelho) para diferentes escolhas de pontos iniciais (par).
z = outer(x, y, fmvn)
20
z[is.na(z)] = 1
#Plot using scatterplot 3d
X = expand.grid(x,y)
x = X[,1]
y = X[,2]
z = c(z)
scatterplot3d(x,y,z,color="lightblue",pch=21,main="3-D Scatter Plot")
Figure 3.7: Resultado da maximização de uma Normal bivariada por meio do algoritmo Nelder-Mead,
utilizando função optim do R. Máximo marcado por triângulo vermelho.
21
4
Exercício
Utilize o método de Nelder-Mead para maximizar uma função multivariada de sua escolha, preferencial-
mente multimodal, diferente das já apresentadas neste relatório, e faça um plot com os resultados, para
valores iniciais distintos. Comente os resultados.
Sugestão: utilizar a função optim do R e o pacote scatterplot3d, da forma como foram apresentados
neste relatório.
23
Bibliography
[1] Givens, G. H., Hoeting, J. A. (2013). Computational Statistics. 2 ed. Wiley, 45-52.
25