sexta-feira, 9 de março de 2012

Uma imagem vale mais do que mil palavras

Em computação de inspiração biológicavisualizar é bastante importante. No passado já dissemos como podemos fazer o gráfico de funções unidimensionais, recorrendo ao módulo matplotlib. Foi o caso, por exemplo, da evolução da qualidade do melhor indivíduo da população ao longo das gerações. Mas também podemos ter interesse em ver a função objectivo associada a um problema. Vamos ver como podemos continuar a usar o módulo matlotlib para o fazer. Vejamos como exemplo a função Sphere para duas variáveis independentes:


import random
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np


def show_3d(domain,function,title):
# preparing
fig = plt.figure()
fig.suptitle(title, fontsize=18, fontweight='bold')
ax = Axes3D(fig)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# data
X = np.arange(domain[0], domain[1], 0.15)
Y = np.arange(domain[0], domain[1], 0.15)
X, Y = np.meshgrid(X, Y)
Z = function(X,Y)
# rendering
ax.plot_surface(X, Y, Z, rstride=1,cstride=1,cmap=cm.jet)
ax.legend()
plt.show()

# -- Problem
DOMAIN_DJ_1 = [-5,5]

def dejong_1_a(x,y):
return x ** 2 + y ** 2
if __name__ == '__main__':
show_3d(DOMAIN_DJ_1,dejong_1_a, 'Sphere')


Ao executar o código obtemos a figura retratada na imagem. Podemos verificar a existência de 4 máximos nas extremidades do domínio.




Em termos de código, e em alternativa, podemos recorrer a linspace em vez de arange. A diferença entre ambas, é que no caso da primeira dizemos quantos pontos queremos igualmente espaçados entre os limites inferior e superior.

def show_3d_b(domain,function,title):
# preparing
fig = plt.figure()
fig.suptitle(title, fontsize=18, fontweight='bold')
ax = Axes3D(fig)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# data
X = np.linspace(-5,5,50)
Y = np.linspace(-5,5,50)
X, Y = np.meshgrid(X, Y)
Z = function(X,Y)
# rendering
ax.plot_surface(X, Y, Z, rstride=1,cstride=1,cmap=cm.jet)
ax.legend()
plt.show()



Na aula propus duas variantes à função Sphere. Uma primeira em que alteramos a sua segunda componente, ficando agora a função a ser:

def dejong_1_b(x,y):
return x ** 2 + y ** 3

Visualmente fica:


Uma alteração aparentemente menor modifica bastante o resultado final.
Uma segunda em que introduzimos ruído gaussiano:

def dejong_1_c(x,y):
noise = np.array([random.gauss(0,3) for i in range(len(x))])
return (x ** 2 + y ** 2) + noise


De novo mostramos a imagem. Neste caso o valor do ruído acrescentado altera a imagem obtida.

Sem comentários:

Enviar um comentário