quinta-feira, 3 de abril de 2014

Usando R e Wolfram Alpha

É muito fácil usar tecnologia hoje em dia. Ao menor toque, um dispositivo reconhece exatamente o que você deseja fazer. A loja virtual "adivinha" com grande precisão aquele produto que você desejava tanto comprar, mostrando ele em destaque, logo na primeira página.
Só que, do outro lado, está o pessoal que desenvolve essas coisas. E, de forma inversa, eles precisam redobrar os esforços para construir essas interfaces inteligentes. Novas tecnologias trazem novos desafios de implementação, exigindo muita criatividade e conhecimento. Na maioria das vezes, essas soluções vêm na forma de modelos matemáticos que, seja em software, seja em hardware, precisam ser implementados.

Esse artigo mostra como usar o R Project for Statistical Computing e o Wolfram Alpha para resolver, com enorme facilidade, problemas comuns no dia a dia de quem trabalha no desenvolvimento de novas tecnologias e projetos de forte caráter inovador.

O que você vai precisar

Vamos precisar do R e do Wolfram Alpha. O Wolfram é uma ferramenta web.  Então tudo que você vai precisa é acessar o endereço http://wolframalpha.com e voilà.



Para usar o R, você vai precisar instalá-lo na sua máquina. Baixe o instalador do site da ferramenta e depois é next next next. Para executá-lo, basta dar um duplo clique no ícone da área de trabalho. 

Ambas as ferramentas são gratuitas. Não é necessário criar conta nem cadastrar email. Ready-to-use!

O que vamos fazer

Para efeito de exemplo, vamos trabalhar com a função sigmóide:


Escolhi essa função porque ela é realmente importante. Ela é utilizada em todo lugar. O pessoal de aprendizagem de máquina adora usar ela como função de ativação em redes neurais artificiais:




Estatísticas sócio-econômicas, controles de sinais elétricos, planejamento de tráfego, processamento de imagens e um monte de outras coisas são feitas com a função sigmóide. Ela é realmente a função da moda


A forma analítica mais simples da sigmóide é essa:

$S(x) = \frac{1}{1 + exp(-x)}$ 

As razões para se usar tanto a sigmoide são:
1) Ela é simples. Fácil de implementar e seu custo computacional é baixo;
2) Ela é contínua para qualquer valor de x. Dessa forma, ela sempre vai dar uma resposta para qualquer entrada;
3) Ela é derivável para qualquer valor de x, o que torna sua forma suavizada;
4) Ela é limitada entre 0 e 1, não importa qual o valor de x, o que permite obter uma saída controlada, mesmo com uma entrada incomum.

Vamos usar uma forma parametrizada da sigmóide, que possui um único parâmetro p:

$S(x) = \frac{1}{1 + e^{-px}}$

O parâmetro p vai ser útil logo mais.

Faça a análise visual!

A primeira coisa que fazemos quando analisamos algo é visualização. Com um modelo matemático não poderia ser diferente. Vamos usar o R para isso. 

Na tela do R digite:

p <- 1

E aperte a tecla ENTER. Não se preocupe, nada vai acontecer. A única coisa que você fez foi informar ao R que existe um parâmetro p e o valor dele é 1.

Em seguida, digite:

x <- seq(-10, 10, 0.1)

E tecle o ENTER. Estamos declarando uma variável x e dizendo ao R para inicializá-la com uma sequência de números, começando com -10 até o 10, com passos de 0.1. Agora, vamos fazer algo mais complicado. Digite:

s <- 1/( 1 + exp(-p * x))

Como habitual, tecle o ENTER para que o R reconheça o que você digitou. Estamos declarando uma variável s. Como x é uma sequência, s também é uma sequência. Cada valor da sequência s é calculado com a fórmula que você digitou. Desse modo, teremos 1 valor em s para cada valor em x.

Agora estamos prontos para gerar o nosso primeiro gráfico com o R. Digite:

plot(x, s)

A tela do R deverá estar assim:


O mesmo gráfico pode ser desenhado com o Wolfram. Para demonstrar isso, vamos abrir o navegador no endereço da ferramenta clicando aqui.

No alto da página tem uma caixa de texto. Dentro dela digite:

plot 1/(1+exp(-x)) from x=-10 to 10

E aperte ENTER. O Wolfram vai atualizar a tela e mostrar isso:


Esse foi um gráfico muito simples de ser criado.  Mesmo assim, já podemos identificar algumas coisas. Uma delas é que a função é limitada entre 0 e 1. Se x for muito grande, a função se aproxima do valor 1. Se x for muito negativo, a função se aproxima do valor 0. Isso se mantém indefinidamente. Por exemplo, se você alterar o range do gráfico:

plot 1/(1+exp(-x)) from x= -100 to 100

Vamos ter ainda o mesmo comportamento:


Essa é uma propriedade muito interessante. Por exemplo, se você está desenvolvendo algo que transforma uma sinal elétrico variável em uma saída limitada, usando a sigmóide sua saída estará sempre controlada entre 0 e 1, mesmo durante um surto de tensão.

Um outro ponto interessante do gráfico é a evidente suavidade da função. Se você está planejando a trajetória de um vôo, provavelmente vai desejar usar a função sigmóide à esquerda do que usar uma trajetória como a da direita:

A grande diferença entre as duas trajetórias está nos pontos destacados com círculos verde. Naqueles pontos, a direção do avião precisa mudar abruptamente, o que é, no mínimo, desagradável.

Perturbando a  função sigmóide

Usar o Wolfram é muito fácil. Mas algumas coisas são mais fáceis de fazer no R. Vamos agora ver o que acontece quando alteramos o valor de p.

No R, digite:

p <- 2
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
plot(x, s, type="l", col="green")
p <- 1
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
par(new=TRUE)
plot(x, s, type="l", axes=FALSE, col="blue")
p <- 0.5
x <- seq(-10, 10, 0.1)
s <- 1/( 1 + exp(-p * x))
par(new=TRUE)
plot(x, s, type="l", axes=FALSE, col="red")

E o resultado será:



Como podemos ver, p pode ser alterado para ajustar a inclinação da sigmóide. Isso é muito útil, pois conseguimos ter um maior controle da forma da função.

Por exemplo, vamos supor que precisamos planejar a trajetória sigmóide de um vôo de avião. Vamos supor ainda que a inclinação máxima permitida seja de 30º. A questão que surge é: quais valores de p atendem a esse requisito?

Lá do cálculo diferencial, sabemos que a inclinação de qualquer curva é dada pela sua função derivada. Logo, precisamos saber qual é o valor máximo da derivada de S(x).

Calcular a derivada de S(x) "na mão" não é tarefa difícil. Nesse outro artigo, é mostrado como fazer isso com um papel e lápis.
O problema de fazer isso "na mão" é que tarefas desse tipo são cansativas, enfadonhas, propícias a erros e definitivamente não é produtivo. Não dá para fazer isso todo dia. Por outro lado, fazer isso no Wolfram é moleza, como podemos ver a seguir.

Acesse a página da ferramenta e entre com a seguinte consulta:

derivate 1/(1+exp(-p * x))

E rapidamente o Wolfram calculou a derivada de primeira ordem da sigmóide:


Não precisou de regra da cadeia nem de artifício algum. Em poucos segundos está lá a derivada prontinha.

Como a imagem mostra, o Wolfram calculou a derivada de S(x) como sendo:

$S'(x) = \frac{p e^{px}}{(1 + e^{px})^2}$ 

Da mesma forma que a sigmóide, podemos perceber que sua derivada S'(x) é sempre contínua. Se p = 1 então S'(x) tem a famosa forma de sino:


O gráfico mostra que o valor de S'(x) é máximo quando x = 0.

Podemos apenas supor que a forma da função se mantém igual para qualquer valor de p. Se essa suposição estiver correta, podemos pedir para o Wolfram fazer a seguinte conta para a gente:

derivate 1/(1+exp(-p * x)) , x = 0



O resultado mostra que a inclinação máxima é p/4. Como a inclinação máxima permitida é de 30º, temos p/4 = tg 30º. Logo, ao fixar o valor de p, temos que manter ele no máximo até p = 4 * tg 30º = 2.3.

Prove me com números!

A análise visual nos dá boas dicas sobre o comportamento da função. Mas não prova nada. Se quisermos ter absoluta certeza que a função se aproxima de 0 para x muito negativo e se aproxima de 1 para x muito grande, temos que provar isso. Em bom matematiquês, podemos dizer:

"O limite de S(x) quando x tende ao infinito negativo é ZERO e o limite de S(x) quando x tende ao infinito positivo é UM."

Ou, em notação matemática:

$ \lim_{x \to +\infty }{S(x)} = 1$ e $\lim_{x \to -\infty }{S(x)} = 0$ 

Calcular o valor desses limites com o Wolfram é muito fácil. Abra o Wolfram novamente no seu navegador e entre com:

lim 1/(1+exp(-x)) as x->infinity

O Wolfram calculou o valor do limite quando $x -> +\infty $ como 1, que era exatamente o que tínhamos esperado. Se repetirmos para infinito negativo:

lim 1/(1+exp(-x)) as x->-infinity

Como identificamos na análise gráfica, o valor do limite quando $x -> -\infty $ foi 0. O Wolfram realmente é demais!

Conclusão

15 anos atrás, quando iniciava meus estudos no cálculo, nunca imaginaria que as coisas iriam ficar tão fáceis como hoje. A capacidade de visualizar a informação facilmente e a interface simbólica e intuitiva do R e do Wolfram aceleram a produtividade e confiabilidade quando o assunto é matemática aplicada ao desenvolvimento de tecnologia atual. Como toda ferramenta, claro, o poder está na mão de quem a usa adequadamente.

Nenhum comentário:

Postar um comentário