Apresentação do PowerPoint - azevedolab.netcalc,i) o método Ridge tende a reduzir o número de...
Transcript of Apresentação do PowerPoint - azevedolab.netcalc,i) o método Ridge tende a reduzir o número de...
1 azevedolab.net
2
Vimos anteriormente a análise dos conjuntos treino e teste.
Índice do Dado do
Conjunto Treino
Diâmetro da Pizza (cm) Número de Coberturas Preço (R$)
1 15,0 2 24,50
2 20,0 1 31,50
3 25,0 0 45,50
4 35,0 2 61,25
5 45,0 0 63,00
SciKit-Learn (Regressão Linear Múltipla)
www.python.org
Índice do Dado do
Conjunto Teste
Diâmetro da Pizza (cm) Número de
Coberturas
Preço (R$)
1 20,0 2 38,50
2 22,5 0 29,75
3 27,5 2 52,50
4 40,0 2 63,00
5 30,0 0 38,50
Aplicamos os métodos de regressão linear múltipla que podiam ser acessados a partir
de métodos de biblioteca scikit-learn. Vamos ver a função usada no pizza4.py.
3
Regressão Linear Múltipla
4
O resultado é repetido abaixo para futura referência. Com destaque para os valores de R2 e o preço previsto
para uma pizza de 40 cm.
Veja que houve uma melhora no modelo, o R2 foi de 0,66 para 0,77.
SciKit-Learn (Regressão Linear Simples) (pizza3.py)
www.python.org
Type CSV file name => pizza3.csv
Type CSV file name => pizza4.csv
Best fit linear regression model: 2
1.415 x + 1.385 x + 4.156
R-squared: 0.7702
Predicted price for 40 cm pizza: 63.51
Índice do Dado
do Conjunto
Teste
Diâmetro da Pizza
(cm)
Número de
Coberturas
Preço (R$)
1 20,0 2 38,50
2 22,5 0 29,75
3 27,5 2 52,50
4 40,0 2 63,00
5 30,0 0 38,50
De uma forma geral, podemos mudar o método de regressão variando a chamada do
método, após linear_model., como destacado abaixo.
5
Regressão Linear Múltipla
Temos que tomar um cuidado adicional com o acesso aos pesos obtidos pelo método
de regressão (model.coef_) e com o formato do array y_in, que podem variar.
6
Regressão Linear Múltipla
Modificamos o código da função multiple_linear_regression() alternado as linhas
indicadas abaixo. O nome programa chama-se pizza5.py. Usaremos o método Lasso.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
7
Regressão Linear Múltipla
Vejam que o acesso aos pesos se faz de forma distinta daquele do método de
regressão linear múltipla do programa pizza4.py.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
8
Regressão Linear Múltipla
Relembrando-se que o método Lasso adiciona a somatória dos coeficientes (ωj), como
mostrado na equação do RSS abaixo, ou seja, além de minimizar a diferença entre o
experimental e o previsto (yi – ycalc,i) o método Lasso tende a reduzir o número de
coeficientes (ωj).
O N da primeira somatória refere-se ao número de pontos no conjunto treino. O P na
segunda somatória é o número de variáveis explanatórias.
Tal redução do peso de alguns coeficientes tem como objetivo gerar um modelo de
regressão com um número menor de variáveis explanatórias, com a esperança de
eliminarmos variáveis que tenham pouca importância para o modelo final (equação de
regressão). Convém destacar, que tal abordagem pode gerar modelos com
coeficientes de correlação (R2) menores, mas podem ser vantajosos do ponto de vista
de extrair dos dados somente variáveis explanatórias representativas. O coeficiente λ1
pode ser otimizado para gerar o menor RSS possível, nesta situação temos o método
LassoCV.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
9
Regressão Linear Múltipla
N
i
P
j
jicalci yyRSS1 1
1
2
,
Ao rodarmos o programa pizza5.py para os dados dos arquivos pizza3.csv e
pizza4.csv temos uma redução do número de variáveis explanatórias. Vemos uma
piora com relação ao R2 de 0,77 obtido com o método LinearRegression.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
10
Regressão Linear Múltipla
N
i
P
j
jicalci yyRSS1 1
1
2
,
Vejamos a função multiple_linear_regression() alternado as linhas indicadas abaixo,
agora mudando para o método Ridge. O nome programa chama-se pizza6.py.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
11
Regressão Linear Múltipla
O método Ridge adiciona a somatória dos coeficientes (ωj2) à equação do RSS, como
mostrado abaixo, ou seja, além de minimizar a diferença entre o experimental e o
previsto (yi – ycalc,i) o método Ridge tende a reduzir o número de coeficientes (ωj),
como destacado para o método Lasso.
O N da primeira somatória refere-se ao número de pontos no conjunto treino. O P na
segunda somatória é o número de variáveis explanatórias.
O coeficiente λ2 pode ser otimizado para gerar o menor RSS possível, nesta situação
temos o método RidgeCV.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
12
Regressão Linear Múltipla
P
j
j
N
i
icalci yyRSS1
22
1
2
,
Na aplicação do método Ridge ao conjunto de dados das pizzas (pizza3.csv e
pizza4.csv) não há redução do número de variáveis explanatórias, como observado na
aplicação do método Lasso ao mesmo conjunto de dados. Por outro lado, há uma
melhora no valor de R2, quando comparado com o método Lasso.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
13
Regressão Linear Múltipla
Vejamos a função multiple_linear_regression() alternado as linhas indicadas abaixo,
agora mudando para o método ElasticNet. O nome programa chama-se pizza7.py.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
14
Regressão Linear Múltipla
Relembrando-se que o método ElasticNet adiciona a somatória dos coeficientes (ωj), e
dos coeficientes ao quadrado (ωj2), como mostrado na equação do RSS.
O N da primeira somatória refere-se ao número de pontos no conjunto treino. O P na
segunda e terceira somatórias referem-se ao número de variáveis explanatórias.
Os coeficientes λ1 e λ2 podem ser otimizados para gerar o menor RSS possível, nesta
situação temos o método ElasticNetCV.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
15
Regressão Linear Múltipla
P
j
j
N
i
P
j
jicalci yyRSS1
22
1 1
1
2
,
Relembrando-se que o método ElasticNet adiciona a somatória dos coeficientes e dos
coeficientes ao quadrado, como mostrado na equação do RSS.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
16
Regressão Linear Múltipla
Outro método disponível na biblioteca scikit-learn é o gradiente descendente
estocástico (Stochastic Gradient Descent) (SGD). Este método usa o gradiente
conjugado como método de otimização. De forma resumida, o pesos (ωj) são
otimizados num processo iterativo, que leva em conta a soma do gradiente da função
RSS original, como indicado abaixo.
O termo α é chamado taxa de aprendizado. O valor default da biblioteca scikit-learn é
alpha = 0.0001.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
17
Regressão Linear Múltipla
N
i
jiicalcijj xyy1
,, )(
Na multiple_linear_regression() alternamos as linhas indicadas abaixo, agora
mudando para o método SGDRegressor(). O nome programa chama-se pizza8.py.
18
Regressão Linear Múltipla
def multiple_linear_regression(x_in,y_in,x_test,y_test):
"""Function to generate a linear regression model for two explanatory variable
and their response variable. This function uses
sklearn.linear_model.SGDRegressor()"""
# Import library
from sklearn import linear_model
import numpy as np
y = []
for line in y_in:
y.append(line[0])
# Create and fit the model
model = linear_model.SGDRegressor(n_iter=1e7, power_t = 0.1, warm_start = True)
model.fit(x_in, y)
# Get Linear Model
alpha1 = model.coef_[0]
alpha2 = model.coef_[1]
const = float(model.intercept_)
z = np.array([alpha1,alpha2,const])
p = np.poly1d(z)
r_square = model.score(x_test, y_test)
print("\nBest fit linear regression model: ",p)
print('R-squared: %.4f' % r_square)
Veja que definimos como argumentos do método SGDRegressor() o número de
iterações(n_iter), um fator de escala adicional (power_t) e o warm_start que define que
soluções da chamada anterior do método são usadas como valores iniciais.
19
Regressão Linear Múltipla
def multiple_linear_regression(x_in,y_in,x_test,y_test):
"""Function to generate a linear regression model for two explanatory variable
and their response variable. This function uses
sklearn.linear_model.SGDRegressor()"""
# Import library
from sklearn import linear_model
import numpy as np
y = []
for line in y_in:
y.append(line[0])
# Create and fit the model
model = linear_model.SGDRegressor(n_iter=1e7, power_t = 0.1, warm_start = True)
model.fit(x_in, y)
# Get Linear Model
alpha1 = model.coef_[0]
alpha2 = model.coef_[1]
const = float(model.intercept_)
z = np.array([alpha1,alpha2,const])
p = np.poly1d(z)
r_square = model.score(x_test, y_test)
print("\nBest fit linear regression model: ",p)
print('R-squared: %.4f' % r_square)
Com o SGDRegressor() temos os resultados mostrados abaixo. Como dependemos
dos valores iniciais, os resultados podem ser distintos. Mas abaixo obtivemos o melhor
resultado de todos tentados para o conjunto de dados pizza.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
20
Regressão Linear Múltipla
Quando o neurônio passa para o estado
de potencial de ação, temos um aumento
do potencial de membrana, além do
potencial limiar. Tal aumento leva o
neurônio a uma situação onde há influxo
de Sódio, entram em ação dois outros
canais transmembranares, os canais de
Sódio e Potássio, ambos dependentes do
potencial elétrico da membrana. Aqui cabe
uma pequena observação. Na linguagem
física não usamos o termo “voltagem” para
indicar potencial elétrico, contudo, a
grande maioria dos textos de fisiologia em
português, quando referem-se aos canais
citados, usam a denominação
“dependentes de voltagem”. No presente
texto usaremos os termos “canais
dependentes de voltagem”, para
mantermos os termos usados na área de
fisiologia.
Fases indicadas no gráfico acima
1 Potencial de repouso
2 Despolarização
3 Repolarização Potencial de ação
4 Hiperpolarização
Pote
ncia
l de m
em
bra
na (
mV
) Tempo(ms)
1
2 3
4
Corrente elétrica
de estímulo
21
Fases do Potencial de Ação
As etapas canônicas do potencial de ação
ocorrem devido à ação coordenada dos
canais de Sódio e Potássio dependentes
de voltagem. A abertura do canal de Sódio
dependente de voltagem (despolarização),
o fechamento do canal de Sódio e abertura
do canal de Potássio (repolarização e
hiperpolarização), conforme vemos no
gráfico ao lado. A linha roxa indica o
estímulo que é dado para o início do
potencial de ação, veja que o estímulo não
está em escala com o potencial indicado
pela linha vermelha. O eixo horizontal é o
eixo do tempo (em ms), e o eixo vertical o
eixo do potencial de membrana (em mV).
A linha vermelha indica a variação do
potencial de membrana, durante as
diferentes etapas do potencial de ação. O
neurônio é considerado inicialmente em
potencial de repouso.
Fases indicadas no gráfico acima
1 Potencial de repouso
2 Despolarização
3 Repolarização Potencial de ação
4 Hiperpolarização
Pote
ncia
l de m
em
bra
na (
mV
) Tempo(ms)
1
2 3
4
Corrente elétrica
de estímulo
22
Fases do Potencial de Ação
Membrana
plasmática
No repouso
(Er = -75mV)
Portão m fechado
Portão h aberto
Após a despolarização
(Er= 50 mV)
Portão m aberto
Portão h aberto
5 ms depois da
despolarização
(Er= -50 mV)
Portão m aberto
Portão h fechado
A)
B)
C)
O canal de Sódio é um tipo especializado
de canal iônico dependente de voltagem
(potencial elétrico). Sua abertura está
condicionada ao aumento do potencial de
membrana. Quando temos um potencial
de membrana, acima de um valor limite de
potencial (potencial limiar), o canal abre-
se, permitindo o influxo de íons de Sódio
na célula. O canal permanece aberto por
aproximadamente 1 milisegundo (1 ms).
Tempo suficiente para elevar o potencial
de membrana para dezenas mV positivos.
O canal de Sódio possui dois portões
distintos, portões m (de ativação) e h (de
inativação). O portão h fecha-se após a
despolarização e permanece fechado, não
permitindo o início de um novo potencial
de ação (período refratário).
Imagem disponível em:<
http://www.blackwellpublishing.com/matthews/figures.html >
Acesso em: 26 de agosto de 2015. 23
Canais Iônicos
Os canais de Potássio abrem-se
imediatamente após a
despolarização, o que permite a
saída de carga positiva da célula, na
forma de íons de Potássio. O canal
de Potássio fica aberto durante a fase
de repolarização, onde o potencial de
membrana será trazido a valores
negativos, chegando a ficar mais
negativo que o potencial de repouso,
durante a fase seguinte, chamada de
fase de hiperpolarização.
Membrana
plasmática
No repouso
(Er= -75mV)
Canal de
Potássio fechado
Após a despolarização
(Er = 50 mV)
Canal de
Potássio fechado
5 ms depois da
despolarização
(Er= -50 mV)
Canal de Potássio aberto
A)
B)
C)
24
Imagem disponível em:<
http://www.blackwellpublishing.com/matthews/figures.html >
Acesso em: 26 de agosto de 2015.
Canais Iônicos
Descrição passo a passo do potencial de ação
A) Os canais de Sódio e Potássio estão
fechados (potencial de repouso).
B) O aumento do potencial na membrana leva
o canal de Sódio, que é dependente de
voltagem (potencial elétrico), a abrir-se. O que
permite o rápido influxo de Sódio na célula,
aumentando de forma significativa o potencial
de membrana. Esta fase é chamada
despolarização (ou fase ascendente).
C) Aproximadamente 1 ms depois, os canais
de Sódio fecham-se e os canais de Potássio,
dependentes de voltagem (potencial elétrico),
abrem-se. Permitindo a saída do excesso de
carga positiva da célula. Esta fase é a de
repolarização (ou fase descendente).
D) A saída de grande quantidade de íons de
K+, leva a célula a atingir um potencial de
membrana abaixo do potencial de repouso,
esta fase é chamada de hiperpolarização.
Membrana
plasmática
Canal Na+ Canal K+
25
Imagem disponível em:<
http://www.blackwellpublishing.com/matthews/figures.html >
Acesso em: 26 de agosto de 2015.
Canais Iônicos
A presença do portão de inativação
(portão h) no canal de Sódio dependente
de voltagem garante a propagação
unidirecional do potencial de ação. A
entrada de íons de Sódio, decorrente da
abertura do canal de Sódio dependente
de voltagem, leva a uma difusão de íons
de Sódio nos dois sentidos no axônio. Tal
presença de íons de Sódio levaria à
reabertura dos canais de Sódio, caso não
tivessem o portão de inativação (portão
h). Tal portal permanece fechado por
alguns milisegundos, caracterizando o
período refratário do neurônio. Durante
este período a elevação do potencial de
membrana, além do potencial limiar, não
causa disparo de novo potencial de ação.
Dendritos
Corpo celular
Núcleo
Axônio
Terminais axonais
Direção do
impulso
Cone de implantação
Potencial de ação
26
Canais Iônicos
Um potencial de ação é uma súbita
variação no potencial de membrana, que
dura poucos milisegundos (ms). Lembre-
se, 1 ms = 10-3 s, ou seja, a milésima
parte do segundo. Tal perturbação é
conduzida ao longo do axônio. Num
neurônio de vertebrado, o potencial de
ação apresenta uma ação saltatória e
unidirecional, ou seja, sai do corpo do
neurônio e desloca-se ao longo do axônio
até o terminal axonal. A amplitude do
potencial de ação é a mesma, não
havendo queda de potencial ao longo do
axônio, como indicado por medidas de
potencial elétricos em pontos distintos do
axônio durante o potencial de ação
(mostrado no slide seguinte).
Dendritos
Corpo celular
Núcleo
Axônio
Terminais axonais
Direção do
impulso
Cone de implantação
Potencial de ação
27
Propagação do Potencial de Ação
O modelo de Hodgkin-Huxley foi proposto em 1952 para modelar o potencial de ação
do axônio de sépia. Os dados sobre a corrente iônica foram obtidos a partir do uso da
técnica de “voltage clamp”. Nesta técnica, o potencial elétrico da célula é mantido
constante, independente das concentrações iônicas. Na situação abaixo as correntes
iônicas são medidas. O diagrama esquemático abaixo ilustra a técnica. Um sistema de
retroalimentação permite que o potencial seja mantido num valor de referência, onde
toda vez que o potencial de membrana desvia-se um pouco do valor ajustado, uma
tensão adicional, fornecida pela fonte de tensão, leva o potencial de membrana de
volta ao valor ajustado.
Axônio
Amperímetro
Eletrodo
extracelular
Eletrodo
intracelular
Amplificador do potencial
de membrana
Fonte de tensão
Amplificador de
retroalimentação
28
Modelo de Hodgkin-Huxley
O modelo de Hodgkin-Huxley usa o conceito de condutância (g), para elaborar uma
equação diferencial que mostra o potencial de membrana em função do tempo E(t).
Não é objetivo do presente curso detalhar a dedução de tal modelo, iremos somente
ilustrar a equação, destacando as principais características. Quando analisamos o
neurônio em repouso, vimos que o mesmo tinha um comportamento elétrico similar a
um circuito resistivo-capacitivo (circuito RC) simples, ilustrado abaixo.
R
Circuito RC
+++++
- - - - -
E
I
Q
d
+Q
-Q
Po
ten
cia
l d
e m
em
bra
na
Tempo(ms
)
Potencial de repouso
Potencial limiar
0
29
Modelo de Hodgkin-Huxley
Na figura ao lado, temos o circuito elétrico
equivalente da membrana celular durante
o potencial de ação, chamado de modelo
de Hodgkin-Huxley. No circuito temos 3
tipos de correntes iônicas, a corrente do
Sódio (INa), a corrente do Potássio (IK) e
uma terceira corrente chamada em inglês
de “leak current” (IL), que é composta
principalmente de íons de cloro. A
principal contribuição do modelo Hodgkin-
Huxley, foi a introdução das condutâncias
na análise do comportamento elétrico do
axônio. A condutância (g) é o inverso
da resistência elétrica (R), conforme a
equação abaixo:
A unidade de condutância é o Siemens (1
S = 1/Ohm).
gNa gK gL
ENa EK EL
Cm
IC
INa IK IL
I
IÍon
Circuito elétrico equivalente a membrana celular, segundo
o modelo de Hodgkin-Huxley.
Meio extracelular
Meio intracelular
30
Modelo de Hodgkin-Huxley
Ao incluirmos as condutâncias (g), temos
a possibilidade de modelar o potencial de
ação, considerando o circuito equivalente
ao lado. Temos as condutâncias para
Sódio (gNa), Potássio (gK) e uma terceira
para o termo “leak” (gL), ou seja,
vazamento de íons. A corrente total (I) é a
soma da corrente iônica (Iíon) e a corrente
capacitiva (IC), como segue:
I = IC + Iíon .
A corrente iônica total (Iion) é dada pela
soma de todas as correntes devido a cada
canal (INa e IK) e a terceira corrente (IL) é
constante e minoritária. Assim temos,
Iion = INa + IK + IL
gNa gK gL
ENa EK EL
Cm
IC
INa IK IL
I
IÍon
Circuito elétrico equivalente a membrana celular, segundo
o modelo de Hodgkin-Huxley.
Meio extracelular
Meio intracelular
31
Modelo de Hodgkin-Huxley
Vemos no circuito equivalente a presença
de 3 fontes de potencial, nominalmente
Ena , EK e EL, relativas ao Sódio, Potássio
e vazamento (leak). Tais potenciais
podem ser determinados a partir da
equação de Nernst, vista anteriormente.
Assim, temos as seguintes equações para
as correntes que formam a corrente
iônica,
INa = gNa (V - ENa ) ,
Ik = gk (V - Ek )
e
Il = gL (V - EL )
onde V é o potencial da membrana.
Veja no circuito, que as condutâncias do
Sódio (gNa) e do Potássio (gK) são
variáveis e a condutância de vazamento é
constante.
gNa gK gL
ENa EK EL
Cm
IC
INa IK IL
I
IÍon
Circuito elétrico equivalente a membrana celular, segundo
o modelo de Hodgkin-Huxley.
Meio extracelular
Meio intracelular
32
Modelo de Hodgkin-Huxley
Usando o circuito equivalente, vemos que na fase de despolarização temos a
condutância do Na+ alta, o que permitirá entrada de íons de Na+ na célula, elevando a
corrente INa e o potencial de membrana (V). Na fase repolarização, teremos aumento
condutância do K+, o que levará K+ para o meio extracelular e diminuirá potencial de
membrana.
1
2 3
4
Gráfico do potencial contra o tempo (linha vermelha),
gerado pelo HHSim (http://www.cs.cmu.edu/~dst/HHsim/).
gNa gK gL
ENa EK EL
Cm
IC
INa IK IL
I
IÍon
Meio extracelular
Meio intracelular
33
Modelo de Hodgkin-Huxley
O modelo de Hodgkin-Huxley é um
modelo computacional, sendo
considerado o primeiro modelo da
abordagem de biologia de sistemas. Tal
modelo descreve a resposta do axônio de
sépia a diferentes estímulos elétricos.
Temos a implementação do modelo
computacional de Hodgkin-Huxley
(modelo HH) em diversos programas.
Apresentaremos aqui um que foi
implementado na linguagem MatLab,
chamado HHSim que está disponível no
site http://www.cs.cmu.edu/~dst/HHsim/ .
Esse simulador do potencial de ação
possibilita testarmos diferentes tipos de
estímulos elétricos aplicados ao axônio,
bem como o efeito de moléculas que
interagem com os canais iônicos. Axônio pré-sináptico da sépia, colorido em rosa para
destaque.
Disponível em: http://dels-old.nas.edu/USNC-IBRO-
USCRC/resources_methods_squid.shtml
Acesso em: 28 de novembro de 2016.
Diagrama esquemático de uma seção do axônio de sépia.
34
Modelo de Hodgkin-Huxley
O diagrama esquemático abaixo ilustra o arranjo experimental, simulado no HHSim.
Temos o cilindro representando uma seção do axônio da sépia, onde foram inseridos
2 eletrodos. Temos o eletrodo 1 responsável pelo estímulo, que será medido em
unidades de corrente elétrica, nA (nanoAmpére, 10-9 A).
Eletrodo 1
Gerador de corrente elétrica (estímulo)
Seção do axônio de sépia. 35
Modelo de Hodgkin-Huxley
Temos um segundo eletrodo (eletrodo 2), inserido após o eletrodo 1. O
posicionamento de eletrodo 2 indica que ele está mais próximo do terminal axonal que
o eletrodo 1. Assim, o estímulo gerado no eletrodo 1 pode propagar-se ao longo do
axônio e ser registrado no eletrodo 2. O eletrodo 2 está ligado a um voltímetro, que
registra o potencial de membrana em mV em função do tempo (eixo horizontal).
Eletrodo 1
Eletrodo 2
Gerador de corrente elétrica (estímulo) Voltímetro (eixo vertical em mV)
Seção do axônio de sépia. 36
Modelo de Hodgkin-Huxley
Na situação ilustrada abaixo, temos que o voltímetro mostra a evolução temporal do
potencial de membrana, num período de 20 ms, suficiente para vermos todas as fases
do potencial de ação (despolarização, repolarização e hiperpolarização).
Eletrodo 1
Eletrodo 2
Gerador de corrente elétrica (estímulo) Voltímetro (eixo vertical em mV)
Seção do axônio de sépia. 37
Modelo de Hodgkin-Huxley
Vamos usar o HHSim para destacar as características do potencial de ação. Na figura
abaixo temos a situação de potencial de repouso. A linha vermelha indica o potencial
da membrana (em repouso), a linha roxa indica o estímulo aplicado, a linha amarela a
condutância do Na+ e a verde a condutância do K+ .
Gráfico do potencial contra o tempo
(linha vermelha), gerado pelo HHSim
(http://www.cs.cmu.edu/~dst/HHsim/).
Acesso em: 28 de novembro de 2016.
38
Modelo de Hodgkin-Huxley
Aplicamos um estímulo, linha roxa, temos que o potencial de membrana atinge uma
valor acima do potencial limiar (linha vermelha). Em tal situação, abrem-se os canais
de Na+ dependentes de voltagem. Cofirmarmos a situação, verificando a condutância
do Na+ (linha amarela), que começa a subir, indicado o influxo de Na+. O eixo
horizontal é o do tempo. Todo evento está registrado em pouco mais de 20 ms.
39
Modelo de Hodgkin-Huxley
Gráfico do potencial contra o tempo
(linha vermelha), gerado pelo HHSim
(http://www.cs.cmu.edu/~dst/HHsim/).
Acesso em: 28 de novembro de 2016.
Comparando-se as condutâncias, vemos que a condutância do Na+ (linha amarela)
atinge o valor máximo, antes da a condutância do K+ (linha amarela). Isto deve-se ao
fato do canal de Na+ dependente de voltagem abrir-se antes do canal de K+
dependente de voltagem.
40
Modelo de Hodgkin-Huxley
Gráfico do potencial contra o tempo
(linha vermelha), gerado pelo HHSim
(http://www.cs.cmu.edu/~dst/HHsim/).
Acesso em: 28 de novembro de 2016.
Depois de poucos milisegundos, ambos canais estão fechados, como vemos com as
condutâncias retornando para o valor zero. Depois de mais alguns milisegundos, o
potencial de membrana (linha vermelha) retorna ao valor de repouso.
41
Modelo de Hodgkin-Huxley
Gráfico do potencial contra o tempo
(linha vermelha), gerado pelo HHSim
(http://www.cs.cmu.edu/~dst/HHsim/).
Acesso em: 28 de novembro de 2016.
Vimos que precisamos de um um estímulo acima do potencial limiar para termos um
potencial de ação. Não precisamos realizar uma simulação computacional do
processo complexo que envolve a abertura de canais iônicos ao longo do axônio para
termos um aproximação computacional do funcionamento do neurônio. A abordagem
computacional chamada rede neural usa uma visão simplificada do neurônio, onde a
inspiração biológica restringe-se a acharmos uma função matemática que dispara, ou
seja, assume valor 1 para um dado conjunto de entradas. Usando uma definição mais
formal, temos que uma rede neural é um sistema computacional composto por um
certo número de elementos altamente conectados que processam informação por
meio de sua resposta dinâmica a um conjunto externo de entradas.
"...a computing system made up of a number of simple, highly interconnected processing elements, which process information by their
dynamic state response to external inputs.
In "Neural Network Primer: Part I" by Maureen Caudill, AI Expert, Feb. 1989
42
Redes Neurais
De uma forma geral as redes neurais são organizadas em camadas, onde temos uma
camada de entrada, algumas camadas intermediárias e uma cada de saída. As
camadas são compostas de nós interconectados que apresentam uma função de
ativação. Padrões são apresentados à rede neural na camada de entrada, que se
conecta às camadas “escondidas” onde o processamento ocorre por meio de pesos
atribuídos às conexões. Por último, as camadas escondidas se conectam a camada
de saída onde a resposta é mostrada. Abaixo temos um diagrama esquemático de
uma rede neural típica.
Fonte da imagem: http://pages.cs.wisc.edu/~bolo/shipyard/neural/local.html.
Acesso em: 27 de novembro de 2016.
43
Redes Neurais
A maioria das redes neurais apresenta alguma regra de aprendizado, que otimiza os
pesos das conexões, usando-se o padrão de entrada como modelo. Podemos pensar
que estamos ensinando figuras geométricas ao um aluno de ensino fundamental, onde
vamos mostrando exemplos de figuras e definido seus nomes e características. As
redes neurais “aprendem” por exemplo, como fazem as redes neurais biológicas.
Fonte da imagem: http://pages.cs.wisc.edu/~bolo/shipyard/neural/local.html.
Acesso em: 27 de novembro de 2016.
44
Redes Neurais
Muitas das redes neurais usadas hoje em dia têm sua fundamentação teórica baseada
na regra delta. Sendo que a regra delta é normalmente usada pelas redes neurais
chamadas de redes neurais de retropropagação (backpropagational neural networks).
A retropropagação refere-se a propagação para trás do erro.
Fonte da imagem: http://pages.cs.wisc.edu/~bolo/shipyard/neural/local.html.
Acesso em: 27 de novembro de 2016.
45
Redes Neurais
Na regra delta, quando uma rede neural com retropropagação do erro é inicialmente
apresentada com um padrão de entrada, esta faz um chute inicial com valores
aleatórios para os pesos. Em seguida é feito o cálculo da diferença entre o valor
esperado e aquele obtido usando-se pesos aleatórios e um ajuste aos pesos é
aplicado. O diagrama esquemático abaixo ilustra a ideia principal do processo para um
neurônio isolado.
Fonte da imagem: http://pages.cs.wisc.edu/~bolo/shipyard/neural/local.html.
Acesso em: 27 de novembro de 2016.
46
Redes Neurais
Resumindo, podemos ter uma simulação da rede neural mais simples que existe, que
é uma rede com um neurônio, onde este processa as entradas e “aprende” a partir do
padrão. Este processo de aprendizado é traduzido na otimização dos pesos que são
treinados a partir do conjunto treino. Abaixo temos o pseudo código para esta rede
neural.
47
Redes Neurais
Para o algoritmo anterior usaremos como padrão de aprendizado uma tabela verdade
com as seguintes entradas e saídas. Depois de treinada, nossa rede neural será
submetida a nova situação mostrada abaixo.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
48
Redes Neurais
A equação para o treinamento do neurônio é baseada na função sigmóide, mostrada
abaixo.
Se usarmos o inMathematica001.py para gerarmos o gráfico da função acima com o
comando Plot[1/(1+Exp[-]),{x,-6,6}] teremos o gráfico abaixo.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
49
Redes Neurais
Na equação abaixo o x foi substituído pelo peso que leva em conta o peso de cada
entrada, como mostrado abaixo.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
50
Redes Neurais
Como os pesos inicialmente recebem valores aleatórios, temos que corrigir os pesos
de forma iterativa, no nosso exemplo usaremos a seguinte equação:
Onde o error é a diferença entre o valor previsto e o inserido como entrada no
conjunto treino. O SigmoidCurveGradient é a derivada da função sigmoide, de forma
que num processo iterativo espera-se que os novos pesos levem a uma previsão
previsão próxima à real.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
51
Redes Neurais
Como os pesos são inicialmente recebem valores aleatórios, temos que corrigir os
pesos de forma iterativa, no nosso exemplo usaremos a seguinte equação:
Onde o error é a diferença entre o valor previsto e o inserido como entrada no
conjunto treino. A variável output traz o valor da saída na iteração anterior, com os
pesos antigos.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
52
Redes Neurais
Vejamos o código da nossa rede neural. Começaremos com a função main().
Inicialmente chamamos a função gen_training_set() que gera o nosso conjunto treino,
ou seja, o padrão que será usado para treinar a rede neural. Na função seguinte
(show_training_set()) é mostrado o conjunto treino na tela. em seguida fazemos a
simulação da rede neural com a função neuron001() que retorna um array com os
pesos devidamente otimizados para nosso conjunto treino. Por último a função
show_prediction() faz a previsão para o array [1,0,0] como entrada.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
53
Redes Neurais
A função gen_training_set() gera os arrays para as entradas e saídas do conjunto
treino. Ambos arrays são retornados para onde a função foi evocada.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
54
Redes Neurais
A função show_training_set() simplesmente é um print dos arrays gerados como
conjunto treino.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
55
Redes Neurais
A função neuron01() implementa a rede neural. Inicialmente estabelecemos uma
semente aleatória. Esta etapa é importante pois em problemas masi complexos
podemos ter resultados distintos com semenetes aleatórias distintas, assim é
importante registramos com qual semente aleatória estamos trabalhando.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
56
Redes Neurais
Em seguida geramos um array aleatório com três números que serão os pesos
iniciais. O loop em destaque faz a atualização do array peso (weight) em cada iteração
do loop. No loop é calculada a função sigmoidal com os pesos iniciais e o resultado
atribuído à variável output. O método np.dot() faz o produto escalar entre os elementos
do array transposto (.T) com o array (t_out - output)*output(1-output). Que é a
implementação da equação vista anteriormente para o ajuste do peso.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
57
Redes Neurais
Por último a função show_prediction() mostra previsão para o array considerado. A
função faz uso dos pesos otimizados para o conjunto treino obtidos na função
neuron01() e usa a função sigmoidal para o cálculo do resultado.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
58
Redes Neurais
Abaixo temos o resultado da simulação.
Fonte da imagem: https://medium.com/technology-invention-and-more/how-to-build-a-simple-neural-network-in-9-lines-of-python-
code-cc8f23647ca1#.m56adhcdw
Acesso em: 27 de novembro de 2016.
59
Redes Neurais
|
sex 11/11, 10:54
60
Um aspecto interessante que une a biologia e a computação de uma forma sinergética é o uso de algoritmos
biologicamente inspirados. A principal ideia dos algoritmos bio-inspirados é usar a natureza como fonte de
inspiração para propor novos algoritmos. Entre os algoritmos bio-inspirados de maior sucesso, temos os
algoritmos evolucionários, onde as ideais da evolução são usadas como inspiração para propormos novos
algoritmos.
Algoritmos Bio-inspirados
As ideias da evolução têm sido usadas em
otimização de soluções de problemas
específicos. A otimização é um método
computacional (algoritmo), que procura
achar as condições ótimas para um dado
problema. Para evitar uma abordagem mais
matemática, vamos ilustrar a otimização
com um exemplo, chamado problema do
caixeiro viajante (travelling salesman
problem). Neste problema temos um
vendedor (caixeiro viajante), que tem que
passar por diversas cidades, digamos 4
cidades. O objetivo do problema é achar o
menor caminho possível, que leva o
caixeiro viajante a passar pelas quatro
cidades, sem repetir nenhuma cidade.
Sabemos as distâncias entre todos os pares
de cidades, dAB por exemplo, assim a
solução ótima (otimizada) é aquela que
leva a um menor percurso total. Este é o
típico problema de otimização.
C
D
A
B dAC
dAD
dAB
dBD
dBC
dCD
61
Otimização
Apresentaremos alguns conceitos da
evolução, usados como inspiração para os
algoritmos evolucionários.
Vamos considerar um ambiente que pode
sustentar só um número restrito de
indivíduos (joaninhas nas figuras aqui), a
natureza seleciona aquelas joaninhas que
lutam pelos os recursos limitados de forma
mais eficiente, em outras palavras, a
seleção natural dos indivíduos mais
adaptados da população (as joaninhas
mais adaptadas). Outro conceito básico da
teoria de Darwin, é a variação do fenótipo
entre indivíduos da população. Traços do
fenótipo são aqueles aspectos físicos e de
comportamento de um indivíduo, que estão
relacionados com sua reação ao ambiente,
por exemplo, a cor da joaninha. Os traços
do fenótipo determinam seu ajuste (fitness)
ao ambiente. 62
Indivíduo
População
A cor das joaninha é um traço do fenótipo
Conceitos Básicos sobre Evolução
Numa população, cada indivíduo mostra um
conjunto de traços do fenótipo exclusivos,
que estão continuamente sendo testados
pelo ambiente [HOLLAND, 1992]. O ajuste
de cada indivíduo pode ser quantificado
numa análise matemática do sistema
biológico, os indivíduos com maior sucesso
apresentam um ajuste mais alto, ou seja,
uma função ajuste (fitness function) mais
alta.
Veja que estamos modelando nosso
sistema biológico, para capturar os
aspectos essenciais do sistema, que
possibilitarão o seu uso para resolver
problemas de otimização. Colocando de
outra forma, estamos simplificando o
sistema biológico, para extrairmos suas
características mais fundamentais, como a
seleção natural.
63
Conceitos Básicos sobre Evolução
Indivíduo
População
A cor das joaninha é um traço do fenótipo
Referência:
HOLLAND JH. Adaptation in Natural and Artificial
Systems. MIR Press. Cambridge MA, 1992.
População inicial da primeira geração
População inicial da segunda geração
Resumindo os conceitos básicos, uma
população é um conjunto de indivíduos, cada
um sendo considerado uma “ unidade de
seleção”, seu sucesso depende de o quão
bem adaptado ao ambiente eles estão.
Indivíduos mais bem adaptados apresentam
probabilidade mais alta de gerar descendentes,
e, mutações ocasionais, dão origem a novos
indivíduos que serão testados pelo ambiente.
Assim, de uma geração para outra, há variação
no genótipo (conjunto de genes) da população.
Cada gene codifica uma proteína, e pode ser
responsável por uma característica do indivíduo,
ou um conjunto de genes ser o responsável por
uma característica. Na figura vemos claramente
diferenças nos padrões de cores, embora
alguns indivíduos tenham sobrevivido de uma
geração para outra sem alterações.
64
Conceitos Básicos sobre Evolução
O processo de evolução pode ser
visualizado usando uma superfície
adaptativa (adaptive surface). No gráfico
ao lado, a altura z representa a função
ajuste (fitness function), também chamada
de função escore (scoring function). Aqui,
quanto maior a altura na superfície, melhor
o ajuste do indivíduo. Os eixos x-y
representam todas as combinações
possíveis de dois traços do fenótipo. Cada
ponto na superfície representa um
indivíduo, com a combinação de traços do
fenótipo representados pelo valores de x e
y. Para exemplificar, o eixo x pode
representar a capacidade de mimetismo
(camuflagem) das joaninhas, e o eixo y a
capacidade de escalar obstáculos. A
combinação de x e y dará a função ajuste.
Os picos mais altos na figura representam
os indivíduos mais bem adaptados. 65
Conceitos Básicos sobre Evolução
Ajuste
x
y
Superfície adaptativa (adaptive surface)
Os vales indicam indivíduos menos
adaptados ao ambiente. Cada pico na
superfície indica um ponto ótimo local (ou
simplesmente máximo local). O pico mais
alto o ponto de ótimo global (ou máximo
global). A partir desta analogia, está clara
as implicações da evolução em problemas
de otimização, que podemos pensar que é
representado pelo ponto de ótimo global.
Num problema de otimização, como o do
caixeiro viajante, nós podemos ter uma lista
de soluções para o problema (diferentes
rotas), e tentamos achar a melhor solução.
O conjunto de soluções possíveis é
chamado de espaço de busca, a superfície
adaptativa, da figura ao lado, é uma
representação gráfica do espaço de busca.
Ajuste
x
y
66
Conceitos Básicos sobre Evolução
Máximo local
Máximo global
Superfície adaptativa (adaptive surface)
A implementação de um algoritmo genético usa as ideias da evolução de Darwin, de
forma que os indivíduos de uma dada população são submetidos aos princípios da
evolução, tais como, seleção natural, cruzamento (crossover) e mutação. Veja abaixo,
um indivíduo será representado por uma string binária. Uma string binária é uma
sequência de “0” e “1”. No algoritmo genético a string binária é convertida num número
decimal, usando as operações matemáticas já vistas.
67
011011110001
Representação do genoma de um indivíduo
na abordagem de algoritmo genéticos
1777
String binária Decimal relacionado à string binária
Números Binários
Um algoritmo genético típico usa três operadores para manipular uma população de
indivíduos gerados aleatoriamente, são eles: seleção, crossover e mutação. Um
diagrama esquemático dá uma visão geral destes passos para uma iteração
(geração). A população inicial é formada de strings binárias geradas aleatoriamente,
os números indicados à esquerda.
101101011010
000010000100
000001111111
100111100111
111110011000
000001011010
000010111100
110100111100
Strings binárias
(populatção incial)
Operador
seleção
Operador
crossover
Operador
mutação
110100111010
101101011100
100110011000
111111110011
1
101101011010
100111100111
111110011000
110100111100
Strings binárias
(Nova população)
68
Algoritmo Genético
O operador seleção é uma implementação computacional da “seleção natural”. É
uma tentativa de aplicar a pressão evolucionária sobre indivíduos de uma população.
Indivíduos com função ajuste (ou função escore) baixa serão descartados. Os
indivíduos de mais alto valor de função ajuste apresentam maior probabilidade de
sobreviver. Os sobreviventes farão parte da população, que começará a nova geração
(iteração).
69
101101011010
000010000100
000001111111
100111100111
111110011000
000001011010
000010111100
110100111100
Strings binárias
(populatção incial)
Operador
seleção
Operador
crossover
Operador
mutação
110100111010
101101011100
100110011000
111111110011
1
101101011010
100111100111
111110011000
110100111100
Strings binárias
(Nova população)
Algoritmo Genético
O operador crossover, também conhecido como recombinação, faz com que os
indivíduos (strings binárias) troquem sua informação genética, de forma análoga à
reprodução sexuada. Uma forma de implementar tal operador, é selecionar pares de
indivíduos promovidos após a etapa de seleção (pais). Depois selecionamos
aleatoriamente um local único (locus) (indicado pela barra vermelha vertical), dentro
da string binária. Por último trocamos todos os dígitos à direita deste locus entre os
dois pais, conforme indicado abaixo.
110100111010
101101011100
100110011000
1111111100111
110100111100
101101011010
100111100111
111110011000
Locus
Locus
Pais Descendentes
Crossover
70
Algoritmo Genético
O operador crossover é aplicado a um par de pais, parar gerar um par de novas
strings binárias (descendentes). Um par de pais será submetido ao operador
crossover, se e somente se, um número aleatório (Rn) for menor que a
probabilidade de crossover (Pc). Rn está no intervalo [0,1], e um típico valor de Pc
está no intervalo [0,4, 0,9].
110100111010
101101011100
100110011000
1111111100111
110100111100
101101011010
100111100111
111110011000
Locus
Locus
Pais Descendentes
Crossover
Gera um
número
aleatório (Rn)
Rn<=Pc?
Escolha novo
par de pais
Sim
Não
71
Algoritmo Genético
Para ilustrar os princípios básicos do algoritmo genético, vamos resolver o seguinte
problema simples, qual o número entre 0 e 4095 maximiza a função quadrática
(f(x)=x2)? OK, não precisamos de um algoritmo genético para saber a resposta deste
problema, tal problema é só para ilustrar o algoritmo. Na implementação deste
algoritmo temos strings binárias de comprimento 12 (11111111112 = 409510). Assim,
vamos gerar números aleatórios entre 0 e 4095, como mostrado parcialmente na
tabela abaixo. Esta faixa de números é nosso espaço de busca.
String binária Decimal
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 1 0 2
0 0 0 0 0 0 0 0 0 0 1 1 3
0 0 0 0 0 0 0 0 0 1 0 0 4
0 0 0 0 0 0 0 0 0 1 0 1 5
0 0 0 0 0 0 0 0 0 1 1 0 6
0 0 0 0 0 0 0 0 0 1 1 1 7
0 0 0 0 0 0 0 0 1 0 0 0 8
.......... .....
1 1 1 1 1 1 1 1 1 1 1 0 4094
1 1 1 1 1 1 1 1 1 1 1 1 4095 72
Algoritmo Genético
Neste algoritmo simples, o operador seleção escolherá a melhor metade da
população, usando a função quadrática como função ajuste (fitness function).
Inicialmente temos que gerar a população de forma aleatória. Tal população é
formada por strings binárias (genótipo), também chamados de cromossomos no
jargão dos algoritmos genéticos. As strings binárias que serão convertidas em
números decimais, e então a função quadrática será calculada. A função quadrática é
nossa função ajuste. Nós classificamos a metade dos melhores indivíduos da
população e, então, aplicamos o operador crossover. Estes novos indivíduos gerados
pelo operador crossover serão submetidos ao operador mutação. Na mutação nem
todos os indivíduos serão submetidos a este operador, só aqueles que passarem no
critério de probabilidade de mutação (Pm). Na implementação do algoritmo
genético, usaremos o critério de número de iterações (gerações), como critério de
parada. Um típico conjunto de entrada para tal algoritmo é o seguinte:
Population size (tamanho da população):
Maximum number of iterations (Número máximo de iterações):
Probability of crossover (probabilidade de crossover):
Length of strings (tamanho das strings):
Probability of mutation (probabilidade de mutação):
73
Implementação de um Algoritmo Genético Simples
Gera uma população
aleatória de strings
binárias
Converte cada string
binária a um número
decimal
Calcula a função ajuste
para cada indivíduo
Seleciona parte da
população para seguir
(operador seleção)
Seleciona pares de pais
seguindo uma ordem
aleatória
Operador Crossover
Mutação dos
descendentes
(operador mutação)
Gera uma nova
população
Critério de
parada
satisfeito?
Retorna os resultados
Não
Sim
Ordena aleatoriamente
os melhores pais
74
Implementação de um Algoritmo Genético Simples
Inicialização. Números aleatórios são
gerados (genótipo), para representar
indivíduos numa população. Em
algoritmos genéticos tais números
são chamados cromossomos. Para
cada cromossomo uma função ajuste
(função escore) será calculada. 75
Initialização
A B
C D
Operador seleção (A). Agora um dos
maiores processos da evolução é
aplicado. Os cromossomos gerados
aleatoriamente são selecionados,
usando como critério a função ajuste.
Esta função indica o quão adaptado um
indivíduo está. Os indivíduos
selecionados são chamados “pais”. 76
Initialização
A B
C D
Operador crossover (B). Os
indivíduos selecionados (pais) podem
gerar descendentes (filhos). Os pais
são gerados aleatoriamente e seus
cromossomos são combinados para
gerar filhos. A posição de corte é
chamada locus, sendo gerada
aleatoriamente também.
.
77
Initialização
A B
C D
Operador mutação (C). É permitido
que os descendentes sofram mutação.
Em bactéria uma taxa de 2.10-3
mutações por genoma por geração é
observada. Aqui, o operador mutação
possibilita a diversidade genética na
simulação da evolução. 78
Initialização
A B
C D
Ao final, os indivíduos (pais mais
descendentes), tornam-se a população
inicial para um novo ciclo. Com objetivo
de manter a abordagem biológica, este
ciclo é chamado de geração. Em
computação um ciclo é chamado de
iteração. 79
Initialização
A B
C D
Este ciclo está completo e todo o
processo é repetido até que um critério
de parada seja satisfeito, como por
exemplo, o número de iterações
(gerações) máximo foi atingido.
80
Initialização
A B
C D
Agora temos uma visão geral de como
os algoritmos genéticos funcionam.
Vamos ver alguns conceitos de como
implementá-los. Os indivíduos nesta
população podem ser representados
por “0” e “1”, ou seja, uma string
binária. 81
Initialização
A B
C D
Na inicialização, números aleatórios
são gerados para representar cada
cromossomo na população. Cada linha
(string binária) é um cromossomo de
um indivíduo (equivalentes às
joaninhas de cores diferentes).
101101011010
000010000100
000001111111
100111100111
111110011000
000001011010
000010111100
110100111100
Strings binárias
82
Initialização
Initialização
A
Seleção. Para ilustrar a
evolução, vamos considerar
que queremos achar o máximo
da função quadrática para um
inteiro entre 0 e 4095. Agora
calculamos a função (f=x2) para
cada cromossomo. As strings
binárias são convertidas para
decimal e, então, calculamos a
função. Selecionamos a melhor
metade da população, segundo
a função ajuste.
101101011010
000010000100
000001111111
100111100111
111110011000
000001011010
000010111100
110100111100
101101011010
100111100111
111110011000
110100111100
f = x2
2906
132
127
2535
3992
90
188
3388
Converte
binário
para
decimal
2906
2535
3992
3388
Strings binárias Decimals (x)
8444836
17424
16129
6426225
15936064
8100
35344
11478544
Decimais (x)
8444836
6426225
15936064
11478544
Strings binárias
Seleção dos
melhores
resultados
83
Função ajuste ou
escore
Nesta etapa temos o operador crossover. Somente
os melhores pais são submetidos ao crossover,
(recombinação). Inicialmente as strings binárias são
aleatoriamente posicionadas e, então, a posição de
crossover é escolhida. Esta posição indica onde a
troca dos cromossomos acontecerá. Os novos
cromossomos agora fazem parte da população, junto
como os melhores pais.
10110101101
0
10011110011
1
11111001100
0
11010011110
0
Strings binárias
110100111010
101101011100
100110011000
1111111100111
110100111100
101101011010
100111100111
111110011000
101101011010
100111100111
111110011000
110100111100
Strings filhas
Strings de posição aleatória
84
Strings pais
Initialização
A B
110100111010
101101011100
100110011000
1111111100111
101101011010
100111100111
111110011000
110100111100 O operador mutação é usualmente aplicado a um bit da string,
mudando-o de “0” para “1”, ou vice-versa. Na maioria das
aplicações, é sugerida uma probabilidade de mutação (Pm) de
0,001, ou seja, uma mutação para cada 1000 bits. 85
Strings pais
Strings filhas
Initialização
A B
C D
110100111010
101101011100
100110011000
1111111100111
101101011010
100111100111
111110011000
110100111100 Há diversas formas de implementar o operador mutação, uma
forma é aplicá-lo a um bit (número “0” ou “1” na string) na
posição 1/pm e gerar um número aleatório, se o número aleatório
é maior que 0,5 muda o bit, caso contrário deixa como está. 86
Strings filhas
Strings pais
Initialização
A B
C D
110100111010
101101011100
100110011000
1111111100111
101101011010
100111100111
111110011000
110100111100
O operador mutação funciona para
aumentar a diversidade genética,
evitando que a população fique
confinada a um máximo local.
110100111011
101101011100
100110011000
1111111100111
Strings filhas
101101011011
100111100111
111110011000
110100111100
Mutação
87
Strings pais
Strings filhas
Strings pais
Initialização
A B
C D
Depois da aplicação do operador
mutação, os indivíduos tornam-se a
população de uma nova iteração.
O ciclo é repetido até que um critério
de parada seja satisfeito. Podemos
fixar o número de iterações, ou outro
critério de parada. Um outro critério de
parada possível, está baseado na
variação da população, ou seja, se os
indivíduos de uma geração não estão
variando com relação à geração
anterior. Quando não há variação
durante um certo número de gerações,
não faz sentido continuar a simulação,
pois não iremos gerar indivíduos que
gerem melhores funções ajuste, assim
podemos parar a simulação.
110100111010
101101011100
100110011000
1111111100111
Strings binárias
101101011010
100111100111
111110011001
110100111100 88
Para o problema descrito de maximização,
temos numa simulação típica de algoritmos
genéticos, as seguintes entradas: número de
indivíduos da população inicial de 10
indivíduos, probabilidade de mutação de 0,01,
probabilidade de crossover de 0,8 e número
de iterações igual à 60. Com estes dados de
entrada, observamos uma convergência
para o valor correto após poucas iterações
(gerações). O gráfico ao lado mostra os
resultados de tal simulação. O eixo x indica o
número de iterações (gerações) e o eixo y o
valor máximo da função quadrática (função
escore ou ajuste), obtido para cada geração.
Como o indivíduo com maior valor para uma
string binária de 12 algarismos é
1111111111112 , cujo o valor decimal é 4095,
temos uma função quadrática de 16769025,
que é alcançada na iteração 18. Depois disso
não há alteração, dizemos que houve
convergência. 89
Implementação de um Algoritmo Genético Simples
Vimos um tipo de algoritmo evolucionário chamado de algoritmo genético. Há outros
algoritmos que usam as ideias de evolução, mas são baseados em métodos
computacionais distintos. Todos usam como inspiração a evolução, mas sua
implementação computacional varia de algoritmo para algoritmo. Um dos algoritmos
evolucionários de maior sucesso é o algoritmo de evolução diferencial. Na evolução
diferencial temos os operadores clássicos dos algoritmos genéticos: seleção, crossover
e mutação, como mostrados abaixo. Como uma implementação distinta do crossover.
90
Algoritmos Evolucionários (Evolução Diferencial)
Operador
seleção
Operador
crossover
Operador
mutação
Critério
de
parada
satisfeito
?
Mostra
resultados
Sim
Não
O algoritmo de evolução diferencial executa a parte inicial de geração aleatória de uma
população com N cromossomos, em seguida avalia a função ajuste de cada
cromossomo. A novidade está na formação cromossomos filhos. O filhos são gerados
da seguinte forma, para cada cromossomo pai na população, chamado aqui
cromossomo j, são escolhidos aleatoriamente três outros cromossomos pais distintos,
cromossomos k, l e m. Calcula-se um novo cromossomo, chamado aqui de n, da
seguinte forma:
cromossomo(n) = cromossomo(m) + peso.[cromossomo(k) - cromossomo(l)]
o peso varia entre 0 e 2.
O cromossomo novo (n) será incorporado à população se ao gerarmos um número
aleatório entre 0 e 1, este for menor que a probabilidade de crossover, caso não seja, o
cromossomo filho não é considerado. Um último teste é realizado no cromossomo filho
n, se este apresenta função escore maior que o cromossomo pai j, caso seja, o
cromossomo j é deletado e substituído pelo cromossomo n. As etapas seguintes são
idênticas ao algoritmo genético original. Estamos considerando aqui que a função
ajuste de maior valor é a que representa um indivíduo mais bem adaptado. Veja, este
critério depende do tipo de problema a ser resolvido pelo algoritmo evolucionário.
91
Algoritmos Evolucionários (Evolução Diferencial)
Na implementação do algoritmo de
evolução diferencial, como nos
algoritmos genéticos, o primeiro passo é
gerar indivíduos de forma aleatória,
como no exemplo das joaninhas.
92
Algoritmos Evolucionários (Evolução Diferencial)
No passo seguinte, calculamos a função
ajuste, que indica a adaptação de cada
indivíduo. Depois aplicamos o operador
crossover, descrito anteriormente, onde
três joaninhas pais (joaninhas cinza,
branca e amarela) geram uma joaninha
filha, para cada cromossomo pai
(joaninha verde), como mostrado ao
lado.
93
Cromossomo k Cromossomo l
Cromossomo m
cromossomo(n) = cromossomo(m) + peso.[cromossomo(k) - cromossomo(l)]
Algoritmos Evolucionários (Evolução Diferencial)
Cromossomo n
Cromossomo j
Considerando que o cromossomo n
passou no teste da probabilidade de
crossover, e que tem função ajuste
maior que a do pai (cromossomo j), este
ocupa o lugar do pai, ou seja, o
cromossomo j é deletado e substituído
pelo cromossomo n. Por último,
aplicamos a mutação, onde
selecionamos aleatoriamente
cromossomos filhos. O critério para
escolher se um cromossomo filho
sofrerá mutação, é a probabilidade de
mutação (Pm). Geramos um número
aleatório entre 0 e 1, se este número for
menor ou igual à probabilidade de
mutação, a mutação ocorre, caso
contrário não. Testamos a condição de
mutação para todos os cromossomos
filhos. Terminamos um ciclo da
evolução, ou iteração. O processo se
repete um número finito de vezes. 94
Cromossomo n
Cromossomo n mutado
Mutação
Algoritmos Evolucionários (Evolução Diferencial)
Cromossomo j é deletado e
substituído pelo n
Como toda metodologia, a simulação de
docking tem uma etapa de validação e
refinamento do protocolo. Tal etapa é o
que chamamos de re-docking, onde
achamos o melhor protocolo capaz de
recuperar a posição cristalográfica de
um ligante acoplado ao sítio ativo de uma
enzima. A condição para que possamos
validar nosso protocolo de docking, é que
haja informações sobre pelo menos uma
estrutura cristalográfica de um complexo
proteína-ligante. A estrutura
cristalográfica é uma informação
experimental precisa, sendo usada como
padrão para verificarmos se o nosso
programa de docking é capaz de achar a
posição do ligante no sítio ativo.
Chamamos da posição obtida computacionalmente de pose
(em vermelho) e a comparamos com a cristalográfica (em
cinza claro) a partir do RMSD (Root-Mean Square Deviation)
que pode ser pensado como uma régua que mede a
distância da posição cristalográfica da pose.
Bio-Inspired Algorithms Applied to Molecular Docking
Simulations. Heberlé G, De Azevedo WF Jr. Curr Med Chem
2011; 18 (9): 1339-1352.
95
Docking Molecular
A estrutura cristalográfica tem que estar
presente como um “padrão ouro”, ou
seja, antes de usarmos a simulação de
docking, temos que verificar se o nosso
protocolo de docking está funcionando
adequadamente. Neste aspecto o
trabalho em bioinformática é similar ao
trabalho em bancada experimental.
Quando vamos testar um novo protocolo
experimental, normalmente recorremos
ao um padrão, para validarmos o
protocolo novo. No caso do docking, o
padrão é a estrutura cristalográfica.
Assim, visamos achar a posição do
ligante usando o docking e, ao final,
comparamos com a posição
cristalográfica, como mostrado ao lado.
96
Posição cristalográfica (cinza claro) e posição obtida pela
simulação de docking (vermelha).
Docking Molecular
No re-docking, vamos “recolocar” o ligante no sítio ativo e comparar com a posição
cristalográfica. A comparação se faz por meio do cálculo do desvio médio
quadrático, ou RMSD (root-mean square deviation). Podemos pensar no RMSD
como uma média das distâncias atômicas entre a posição cristalográfica ( xcristal, ycristal,
zcristal) e a posição do ligante obtida pela simulação de docking ( xpose, ypose, zpose).
Chamamos esta posição de pose. Abaixo temos em vermelho a posição do ligante,
obtida pela simulação de docking (pose), e, em branco, a posição cristalográfica.
Vemos que temos uma boa concordância entre as duas posições. A equação para o
cálculo do RMSD está mostrada abaixo, onde N indica que a soma é feita para todos
os átomos do ligante.
97
Docking Molecular
N
zzyyxx
RMSD
N
j
jjjjjj
1
2
,2,1
2
,2,1
2
,2,1
As posições dos átomos nas moléculas
são representadas por coordenadas
atômicas, x, y e z. As coordenadas
identificam a posição do centro do
átomo no espaço, como as posições
dos átomos mostradas ao lado. São
essas coordenadas atômicas que são
usadas para o cálculo do RMSD. Como
as coordenadas atômicas estão na
unidade angstrom (Å), o valor calculado
para o RMSD é dado também em Å.
98
Posição do átomo é indicada pelas coordenadas (x,y,z)
Docking Molecular
Abaixo temos a captura da tela do programa Molegro Virtual Docker (MVD), com um
inibidor de CDK2 na tela gráfica (lado direito). Ao colocarmos o cursor sobre o átomo,
vemos as coordenadas atômicas na janela à esquerda (dentro do retângulo vermelho),
as unidades em Å.
99
Coordenadas atômicas
do átomo indicado.
Docking Molecular
Nas simulações de docking, com
algoritmos evolucionários, o primeiro
passo é gerar posições aleatórias para a
molécula do ligante, como no exemplo
das joaninhas. Cada joaninha
representa uma posição do ligante. Veja
que é o mesmo ligante, com diferentes
posições.
100
Docking Molecular
No passo seguinte, calculamos a função
ajuste (função escore), que indica a
adaptação de cada indivíduo, no caso
do docking a energia de ligação de cada
posição da molécula. Como a energia
de ligação de Gibbs, só que agora
usamos as coordenadas atômicas para
calcularmos a energia de ligação.
Depois aplicamos o operador crossover,
como descrito para o algoritmo da
evolução diferencial, onde três posições
da molécula (pais) geram uma posição
filha, como mostrado ao lado. Veja que
a função escore não é uma função
energia de fato, podemos chamar a
função escore, como o Moldock Score,
de pseudoenergia.
101
Cromossomo k Cromossomo l
Docking Molecular
Cromossomo m
cromossomo(n) = cromossomo(m) +
peso.[cromossomo(k) - cromossomo(l)]
Por último, aplicamos a mutação, onde
selecionamos aleatoriamente posições
filhas (cromossomos filhos), e suas
posições são modificadas. O critério
para escolher se um cromossomo filho
sofrerá mutação, é a probabilidade de
mutação (Pm). Geramos um número
aleatório entre 0 e 1, se este número for
menor ou igual à probabilidade de
mutação, a mutação ocorre, caso
contrário não. Testamos a condição de
mutação para todos os cromossomos
filhos. Terminamos um ciclo da
evolução, ou iteração. O processo se
repete um número finito de vezes.
102
Cromossomo n
Cromossomo n mutado
Mutação
Docking Molecular
Ao final temos a posição obtida da
simulação de docking (pose),
comparada com a cristalográfica, como
mostrada ao lado. Consideramos que
a simulação de docking está
funcionando bem, se o RMSD da
sobreposição for menor que 2,00 Å,
no exemplo ao lado o RMSD foi de 1,68
Å.
103
Docking Molecular
A função ajuste ou escore, usada pelo programa Molegro Virtual Docker é chamada
MolDock Score. Esta função é uma aproximação da energia de interação entre o
ligante e a proteína alvo. Usamos as coordenadas atômicas do ligante e da proteína,
bem como, eventualmente, co-fatores e moléculas de água para calcular a função
escore. Assim, a entrada da função do MolDock Score é o sistema biológico em
estudo, ou seja, proteína, ligante, co-fatores e água. A saída é o valor da função
calculada para o sistema biológico. No caso do docking, temos o cálculo da função
MolDock Score para cada posição possível do ligante (pose). É a função que é usada
como critério de seleção das poses.
104
MolDock Scoring Function Sistema
biológico Score
Função MolDock Score
Abaixo temos a seleção da função MolDock Score do programa MVD. Na opção
mostrada, temos a seleção de termos de energia do ligante (Internal ES, Internal HB,
Sp2-Sp2 torsions e Displaceable Water com Entropy Reward de 0,50).
105
Função MolDock Score (MVD)
HODGKIN, ALAN L; HUXLEY, ANDREW F. "A quantitative description of membrane
current and its application to conduction and excitation in nerve". Journal of
Physiology, 1952; 117 (4): 500-544.
OLIVEIRA, Jarbas Rodrigues de; WACHTER, Paulo Harald; AZAMBUJA, Alan Arrieira.
Biofísica para ciências biomédicas. Porto Alegre: EDIPUCRS, 2002. 313 p.
OKUNO, Emiko; CALDAS, Iberê Luiz; CHOW, Cecil. Física para ciências biológicas e
biomédicas. São Paulo: Harper & Row do Brasil, 1982. 490 p.
PURVES, W. K., SADAVA, D., ORIANS, G. H., HELLER, H. G. Vida. A Ciência da
Biologia. 6a ed. Artmed editora. 2002.
VOET, Donald; VOET, Judith G. Bioquímica. 3ª edição. Porto Alegre: Artmed, 2006.
1596 p.
106
Referências