Mostrando postagens com marcador ica. Mostrar todas as postagens
Mostrando postagens com marcador ica. Mostrar todas as postagens

terça-feira, 12 de março de 2013

Olhar de gafanhoto evita que você bata o carro

Olhar de gafanhoto evita que você bata o carro: Os gafanhotos possuem uma forma de processamento das informações visuais extremamente rápida e incorporada em sua própria biologia.

Como muitas das principais inovações em tecnologia de sensoriamento e navegação, mais uma vez a natureza tem mostrado uma solução mais adequada que a abordagem tradicional.

Quando for possível modelar o sistema visual, e/ou de navegação, de animais mais complexos, como aves e mamíferos, talvez seja possível o desenvolvimento de sistemas com muito mais autonomia do que o que existe atualmente.

segunda-feira, 4 de fevereiro de 2013

Solução de mistério biológico impulsiona inteligência artificial

Como já deve ser de conhecimento, uma das áreas de conhecimento que mais me interessam é inteligência computacional, principalmente devido às possibilidades de aplicações em análise de dados e reconhecimento de padrões.

Uma das categorias mais conhecidas de algoritmos de reconhecimento de padrões são as redes neurais artificais (ver http://multisign.blogspot.com.br/search/label/redes%20neurais e http://multisign.blogspot.com.br/search/label/ica para mais informações) que consistem de modelos computacionais de estruturas neurais biológicas desenvolvidos para resolver um problema específico.

Por se tratarem de modelos baseados em sistemas biológicos, a evolução das redes neurais é dependente das novas descobertas em neurologia e biologia, como a apresentada a seguir.

Solução de mistério biológico impulsiona inteligência artificial: Uma descoberta associada à biologia e à teoria da evolução deverá ter um impacto direto nos algoritmos de inteligência artificial.

quarta-feira, 14 de novembro de 2012

Análise de dados com Pentaho

Esta semana eu conheci o Pentaho, um pacote de software, com uma versão livre e outra enterprise, completo para análise de dados.

O objetivo de sistemas como o Pentaho é fornecer toda a infraestrutura de software para armazenamento, cruzamento, filtragem, análise e processamento (matemático e estatístico) e visualização de dados com a finalidade de suportar tomadas de decisão por parte de gestores.

Os principais benefícios deste tipo de sistema é a capacidade de identificação de padrões e tendências em bases de dados e a possibilidade de se fazer predições fundamentadas nos dados já armazenados, como previsão de demandas, de crescimento, de lucro, de risco, etc... além de permitir também a identificação de padrões como perfis de clientes/usuários, padrões de comportamento (humano ou de um ambiente), potencial de fraude em processos ou transações, etc....

Já escrevi alguns posts sobre as técnicas de análise estatística utilizadas neste tipo de sistema:
Mas sei que os textos contidos neste blog sobre esse assunto deixam muito a desejar.

Assim, acho que vale citar dois artigos no portal IBM DeveloperWorks acerca de análise de dados, porém utilizando o software de análise estatística SPSS Modeler:


terça-feira, 6 de janeiro de 2009

Volta a ativa

Eu irei fazer uma viagem hoje e estarei retornando na segunda-feira, de modo que assim que voltar irei iniciar o tutorial do Scilab.

Caso alguém tenha alguma sugestão de temas para os exemplos de código, fique a vontade para pedir (processamento de sinais e/ou imagens, inteligência computacional, automação e controle, etc....).

Enfim, eu acho que com as sugestões dos leitores, que devem ser os mais interessados no blog, o tutorial ficará muito bom.

segunda-feira, 1 de dezembro de 2008

Sistemas Fuzzy

Para quebrar um pouco o jejum de posts (principalmente posts sobre coisas que não sejam relacionadas a opinião pessoal) vou falar um pouco sobre sistemas Fuzzy.

Sistemas Fuzzy são baseados em lógica fuzzy (lógico) e são constituidos de 3 partes:
  1. Fuzzyficador;
  2. Regras e inferência;
  3. Desfuzzyficador.

Descrição dos elementos do sistema fuzzy.

  • O Fuzzyficador consiste na interface entre as variáveis de entrada (valores numéricos) do fenômeno avaliado e o sistema fuzzy (conjuntos fuzzy).

  • As regras e inferência implementam a lógica entre a entrada e a saída, gerando um conjunto fuzzy de saída.

  • O Desfuzzyficador transforma o conjunto fuzzy de saída em um valor numérico.

Para dar um exemplo, vamos supor que nós precisamos controlar o nível de água em um tanque, porém este tanque tem uma entrada de água e uma saída de água.

Vamos criar os conjuntos fuzzy das variáveis de entrada do sistema (nível do tanque e volume de água que está saindo do tanque) e da variável de saída (volume de água que está entrando no tanque).
Obs.: A variável de saída é também chamada variável de controle.

Vamos criar algumas regras fuzzy para o sistema:

  1. Se o nível do tanque estiver baixo então tem que entrar muita água no tanque.
  2. Se estiver saindo pouca água do tanque e o nível estiver alto então tem que entrar pouca água no tanque.
  3. Se o nível da água estiver médio e estiver saindo muita água do tanque então tem que entrar muita água no tanque.
  4. Se o nível da água estiver alto e estiver saindo muita água do tanque então tem que entrar uma quantidade média de água no tanque.
Para cada variável (tanto faz ser de entrada ou saída) é interessante criar ao menos 3 conjuntos fuzzy (baixo, médio e alto, por exemplo).

O mais interessante na elaboração das regras é combinar todos os conjuntos de entrada, por exemplo (sendo x1 e x2 as variáveis de entrada e y a variável de saída):

  1. Se x1 é baixo e x2 é baixo então y é xxx.
  2. Se x1 é médio e x2 é baixo então y é xxx.
  3. Se x1 é alto e x2 é baixo então y é xxx.
  4. Se x1 é baixo e x2 é médio então y é xxx.
  5. Se x1 é médio e x2 é médio então y é xxx.
  6. Se x1 é alto e x2 é médio então y é xxx.
  7. Se x1 é baixo e x2 é alto então y é xxx.
  8. Se x1 é médio e x2 é alto então y é xxx.
  9. Se x1 é alto e x2 é alto então y é xxx.

Após a elaboração das regras, o sistema está pronto para ser implementado.

Para cada valor das variáveis de entrada, o grau de pertinência é computado e é feita uma inferência dos conjuntos fuzzy de entrada com os de saída, de modo a obter-se um conjunto fuzzy relativo a variável de saída.

Por fim, é usado algum método de desfuzzyficação para converter o conjunto fuzzy de saída em um valor numérico, como por exemplo o centro de massa do conjunto fuzzy.

Se alguém quiser, posso fazer novos posts mais detalhados.


Só para adiantar, o Scilab tem uma toolbox de lógica fuzzy (aqui).

sábado, 8 de novembro de 2008

Fuzzy Logic

The fuzzy logic is a generalization of classic sets theory.

In the classic sets theory, a element is in a set or not.

For example, the fruit's universe, the orange is in set of citric fruits, and the apple is not in that set.

But, if we analyze the people's universe and make 2 sets: rich people and poor people. If anyone has more than US$ 500,000.00, that's rich, if anyone has less than US$ 500,000.00, that's poor.

Thus, someone has US$10,000.00; US$30,000.00; US$50,000.00; US$70,000.00; US$100,000.00; US$120,000.00; US$180,000.00; US$210,000.00; US$220,000.00; US$300,000.00; US$450,000.00; US$480,000.00; US$492,000.00; US$497,000.00; US$499,800.00; US$499,930.00; US$499,981.00; US$499,996.00; US$499,999.20; US$499,999.98; that's a poor people. And other someone has US$1,000,000.00; US$980,000.00; US$840,000.00; US$770,000.00; US$680,000.00; US$610,000.00; US$590,000.00; US$540,000.00; US$510,000.00; US$508,000.00; US$502,000.00; US$501,000.00; US$500,100.00; US$500,010.00; US$500,001.00; US$500,000.10; that's a rich people.

But, let's think: if anyone has US$499,999.97 and other one has US$500,000.01 they have the same money, because US$0.04 is almost no money, but they aren't in same set.

The fuzzy logic add the pertinence concept for each element. So, all elements are in all sets, but each element has a specific pertinence in each set.

We can use fuzzy logic in any situation, solving it as a linguistic problem. If you need classify the cars in big or small, is possible do 2 fuzzy sets, if you need classify the cars in big, small and median, is possible do 3 fuzzy sets, and successively.

I did the following video of a application that I developed for A.I. class.



Any question, you can comment the post.

quinta-feira, 6 de novembro de 2008

Lógica Fuzzy

Lógica Fuzzy é uma generalização da teoria dos conjuntos clássica.

Na teoria dos conjuntos clássica, se eu tiver um determinado elemento, este elemento pode pertencer ou não a um determinado conjunto.

Por exemplo, tomando o universo das frutas, a tangerina pertence ao conjunto das frutas cítricas. A maçã não pertence ao conjunto das frutas cítricas.

Mas se tomarmos o universo das pessoas, vamos classificar as pessoas em ricas e pobres. Como critério vamos tomar o patrimônio de cada pessoa e determinar que pessoas com patrimônio acima de R$500.000,00 sejam ricas e abaixo sejam pobres, então pessoas com patrimônios de R$10.000,00; R$30.000,00; R$50.000,00; R$70.000,00; R$100.000,00; R$120.000,00; R$180.000,00; R$210.000,00; R$220.000,00; R$300.000,00; R$450.000,00; R$480.000,00; R$492.000,00; R$497.000,00; R$499.800,00; R$499.930,00; R$499.981,00; R$499.996,00; R$499.999,20; R$499.999,98 seriam pobres e pessoas com patrimônios de R$1.000.000,00; R$980.000,00; R$840.000,00; R$770.000,00; R$680.000,00; R$610.000,00; R$590.000,00; R$540.000,00; R$510.000,00; R$508.000,00; R$502.000,00; R$501.000,00; R$500.100,00; R$500.010,00; R$500.001,00; R$500.000,10 seriam ricas. Mas qual a diferença de padrimônio entre R$500.000,02 e R$499.999,97? Isto não vale nem um pirulito que vendem nas paradas de ônibus, algumas vezes nem dão o troco menor que R$0,10.

Então, para resolver o problema, a lógica fuzzy incorpora o conceito de pertinência. De modo que todos os elementos pertencem a todos os conjuntos, porém pertencem mais ou menos a um determinado conjunto.

Uma aplicação interessante da lógica fuzzy e que é presente em nosso cotidiano são os aparelhos de ar-condicionado, que têm algoritmos de lógica fuzzy embarcados para o controle da temperatura, assim evitando que a chave fique disparando toda hora, e considerando que o disparo da chave é o que gasta mais energia no aparelho de ar-condicionado, isto implica em uma economia muito considerável, por isto também que estes são os aparelhos com selo de economia de energia.

Segue um vídeo que mostra uma aplicação que fiz usando lógica fuzzy para controlar um foguete.

segunda-feira, 27 de outubro de 2008

Genetic Algorithms

I'll talk about Genetic Algorithms at this post.

Genetics Algorithms (G. A.) are a type of evolutionary computation, wich the software "upgrade itself" for solve a problem.

The principle of G. A. is the Theory of Evolution (Biology).

In terms of system's engineering, we use G. A. with 4 steps:
  1. Identify the problem and make it solution as a vector of numbers (preferentially, binary numbers);
  2. Generate a lot of possible solutions (population), without think "what's the best solution for my problem?" (the software will find a good solution);
  3. Create a measure for the solutions (G(.)), this measure indicates the "solution's adaptability" (for each solution);
  4. Cross the solutions until a satisfiable solution is find.

Observations:
  • The more adaptable solutions have more probability of cross with others solution.
  • The function G(.) is higher as better is the solution for solve the problem.
  • The cross between 2 solutions occurs with a changing of some numbers of the vectors.
  • The worst solutions are discarded and the new solutions just be better than the old solutions.

A example: give a room with N lamps, which lamps should be lit for best lighting and less power consume?

{Making N = 10}

Each possible solution is a 10 positions vector: s = [l0 l1 l2 l3 l4 l5 l6 l7 l8 l9] which s[i] indicates the status of i-st lamp (s[i] = 1 -> lamp on, s[i] = 0 -> lamp off).

Creating a population of solutions:
s1 = [0 1 1 0 0 0 1 1 1 1]
s2 = [0 1 0 0 1 1 0 1 1 0]
s3 = [1 1 0 1 1 0 0 0 1 0]
s4 = [0 0 0 0 1 1 1 1 1 0]

(Of course that's very few solutions.)

Let's suppose that:
G(s1) = 18%
G(s2) = 32%
G(s3) = 35%
G(s4) = 15%

(The developer invents the G(.) according the problem.)

Thus, in this case, the result of G(.) is the probability of each solution cross with other solution.
(Is not possible make a "self-cross")

One very possible crossing is {s1, s3}.
s1= [0 1 1 0 0 0 1 1 1 1] and s3 = [1 1 0 1 1 0 0 0 1 0]

Determine a random point in the vector (for example 6) and change the numbers.
The cross' result:
s1' = [s1[0] s1[1] s1[2] s1[3] s1[4] s1[5] s3[6] s3[7] s3[8] s3[9]]
s1' = [0 1 1 0 0 0 0 0 1 0]
s2' = [s3[0] s3[1] s3[2] s3[3] s3[4] s3[5] s1[6] s1[7] s1[8] s1[9]]
s2' = [1 1 0 1 1 0 1 1 1 1]

So, the function G(.) is used in all new solutions, and the cross occurs until find a good solution.

I explained a simple form of develop a genetic algorithm, but the algorithm's complexity can be higher if you use many points in the cross, non-binaries vectors or insert mutation in the algorithm (if the algorithm don't result to good solutions).

Now, let's play with the Genetic Algorithms.

sexta-feira, 5 de setembro de 2008

Conversa sobre redes neurais

Tenho um professor aqui na UFC que lenciona a disciplina de ICA (Inteligência Computacional Aplicada), dentre outras.

Este professor é especialista em redes neurais e sempre procura transmitir o possível de sua experiência aos alunos.

Aqui, neste post, pretendo fazer o mesmo: compartilhar um pouco das minhas experiências com redes neurais, em especial a MLP (Multi-Layer Perceptron).

Começando, digo que redes neurais são aproximadores de funções de um espaço n-dimensional em um espaço m-dimensional.

O espaço n-dimensional (domínio da função) é o espaço de entrada da rede e o m-dimensional (contra-domínio da função) é a saída da rede.

Por exemplo, para a identificação de um sistema elétrico, vamos supor que a entrada da rede seja tensão, corrente e impedância e a saída é uma de 3 classes de sistemas (predominantemente resistivo, capacitivo ou indutivo). Neste caso para cada elemento (V, I, Z) de entrada temos uma saída (S1, S2, S3) associada. A saída pode ser discreta ou contínua, no exemplo apresentado a saída pode ser a que classe pertence o sistema ou o grau de presença de cada tipo de elemento.

Uma aplicação interessante é a previsão de séries temporais, em que a rede neural "prevê o futuro" com base no passado. Neste caso, a entrada da rede podem ser n valores assumidos pela função no passado e a saída os m valores futuros. Para se prever o próximo elemento de uma função, pode-se por exemplo tomar 10 elementos anteriores e extimar o próximo a partir deles.

Limitando-nos as redes supervisionadas, dentre as quais está a MLP, a questão de aplicar a rede neural é o seguinte:
  1. Definir o problema e seus parâmetros (entrada(s) e saída(s));
  2. Projetar a arquitetura da rede neural, no caso da MLP consiste em definir os parâmetros da rede (taxa de aprendizagem), quantidade de camadas e número de neurônios por camada;
  3. Tomar dados conhecidos do problema, ou seja montar um conjunto de dados conhecido para o treinamento da rede neural, com as entradas e saídas respectivas;
  4. Realizar o treinamento da rede, em que para cada entrada é apresentada a saída desejada e assim a rede vai se adaptando ao problema;
  5. Tomar novos dados para testar (validar) a rede neural, os dados de treinamento não podem estar presentes na validação da rede neural.
Algumas dicas para o treinamento da rede neural:
  • Usar funções de ativação suaves;
  • Gerar valores de erro grandes, isto acelera a aprendizagem;
  • Usar taxas de aprendizagem baixas (da ordem de 0,001) para que a rede neural possa ajustar-se com maior precisão à função que está sendo mapeada;
  • Explorar a solução das redes neurais mais simples, começando sem camada oculta, depois com 1 camada oculta e por fim 2 camadas ocultas.

Acho que isto é tudo por enquanto. Depois faço novas postagens sobre redes neurais, se possível mais técnicas

E para fechar, o Scilab tem toolboxes de várias ferramentas que podem ser de grande ajuda no projeto de redes neurais.

terça-feira, 5 de agosto de 2008

Algoritmos Genéticos - Dicas de implementação

Para falar um pouco mais de algoritmos genéticos, agora citarei algumas dicas para a implementação.

  1. Criar uma grande população inicial de indivíduos;
  2. Descartar indivíduos pouco "adaptados", em alguns casos cada nova geração substitui a anterior;
  3. Buscar soluções na forma de vetores de números binários, isto facilita muito a manipulação dos "genes";
  4. Fazer com que os indivíduos "cruzem" da forma mais aleatória possível, para que o algoritmo apresente sempre bastante variabilidade;
  5. Quando o algoritmo encontra um "mínimo local", que representa uma condição da qual o algoritmo chega e não consegue sair, porém sabe-se que é possível chegar a um resultado melhor, usa-se o recurso da mutação que consiste em alterar aleatoriamente alguns genes dos indivíduos (todos ou alguns).
Como citei no post anterior, Algoritmos Genéticos são baseados na Teoria da Evolução, então é interessante que o desenvolvedor realmente imagine o problema com esta visão, que existem os indivíduos que resolvem o problema e estes indivíduos se reproduzem gerando novos indivíduos que podem resolver melhor ou não o problema, se nenhum dos indivíduos estiver adaptado ao problema ocorrem mutações para que eles possam ficar mais capazes de "perseverar".

Para fechar, o vídeo a seguir foi um trabalho que desenvolvi na disciplina de ICA (Inteligência Computacional Aplicada) usando algoritmos genéticos.



Adianto que o vídeo é curto, porém interessante.

segunda-feira, 4 de agosto de 2008

Algoritmos Genéticos

Para começar o período letivo 2008.2, o 1º post será sobre o assunto que deve ser também o primeiro da disciplina de ICA: Algoritmos Genéticos.

O princípio dos algoritmos genéticos (ag's) é baseado na Teoria da Evolução (biologia).

A idéia é a seguinte: primeiro deve-se analisar qual o problema e desenvolver uma solução representada por um vetor de numéros, preferencialmente binários. Depois disto, criam-se várias soluções (vetores de números binários) aleatoriamente (o conjunto de soluções denomina-se população e cada solução é denominada indivíduo), cada um destes indivíduos é então testado e atribui-se um grau de "adaptabilidade", que corresponde a quanto esta solução (indivíduo) satisfaz o problema. A partir da adaptabilidade, o indivíduo terá uma probabilidade de "cruzar" com outro indivíduo, quanto maior a adaptabilidade maior a probabilidade do indivíduo "cruzar".
O cruzamento entre indivíduos ocorre da seguinte forma: como cada indivíduo corresponde a um vetor (de números binários), toma-se um ponto aleatório neste vetor e faz-se um crossing-over, em que serão gerados 2 novos indivíduos sendo um com o começo dos "genes" de um indivíduo anterior e o final dos "genes" do outro indivíduo.

Para ilustra o problema, tomemos o seguinte problema:
Tem-se uma sala que tem N lâmpadas e deseja-se determinar quais devem ficar acesas para melhor iluminar o ambiente com o menor gasto de energia (ag's são muito usados em problemas de otimização, como este).

{Fazendo N = 10}

Cada solução corresponde a um vetor de 10 posições: s = [l0 l1 l2 l3 l4 l5 l6 l7 l8 l9] em que cada posição representa o status de uma lâmpada (0 -> apagada e 1 -> acesa).

Cria-se agora uma população de soluções, por exemplo:
s1 = [0 1 1 0 0 0 1 1 1 1]
s2 = [0 1 0 0 1 1 0 1 1 0]
s3 = [1 1 0 1 1 0 0 0 1 0]
s4 = [0 0 0 0 1 1 1 1 1 0]

Para cada solução, avalia-se quão bem o ambiente é iluminado e quanto de energia é gasto de modo a determinar a adaptabilidade de cada indivíduo. Suponto que chegue em:

adapt(s1) = 30%
adapt(s2) = 60%
adapt(s3) = 70%
adapt(s4) = 10%

Então cada indivíduo terá a probabilidade de "cruzar".

Fazendo o cruzamento dos indivíduos s1 e s3:
s1= [0 1 1 0 0 0 1 1 1 1] e s3 = [1 1 0 1 1 0 0 0 1 0]

Determina-se um ponto aleatoriamente para ocorrer o crossing-over, por exemplo 6.
s1' = [s1[0] s1[1] s1[2] s1[3] s1[4] s1[5] s3[6] s3[7] s3[8] s3[9]]
s1' = [0 1 1 0 0 0 0 0 1 0]
s2' = [s3[0] s3[1] s3[2] s3[3] s3[4] s3[5] s1[6] s1[7] s1[8] s1[9]]
s2' = [1 1 0 1 1 0 1 1 1 1]

São calculadas as adaptabilidades dos novos indivíduos e o processo é repetido até encontrar-se um indivíduo que satisfaça uma "adaptabilidade mínima".

A forma abordada é a mais simples, porém o algoritmo pode ficar complexo se forem definidos vários pontos de crossing-over, se o problema não tiver solução de natureza binária, se forem inseridas técnicas de mutação caso o algoritmo não esteja fornecendo bons resultados, enfim: pode-se complicar do jeito que quiser.

terça-feira, 15 de julho de 2008

Planejamento para o Gravity Racer

Como estive tendo uns problemas com o Open CV no PCLOS, não irei fazer esta parte do Gravity Racer agora.

No momento estou meio parado com relação a este projeto, mas em alguns dias (ainda este mês) espero ter algo "paupável".

A ordem que pretendo seguir no desenvolvimento do jogo é a seguinte:
  1. Interface visual, em que irei desenvolver uma tela de abertura e aproveitar as figuras para o jogo propriamente dito. Neste ponto terei de aprender a manipular as figuras com SDL no C++, sendo um dos pontos mais importante a rotação das figuras.
  2. Controle dos elementos, basicamente controlar a nave e fazê-la interagir com o cenário.
  3. Sonoplastia, em que posso inventar algum som ou procurar algo na internet.
  4. Desenvolver a "inteligência" do jogo, implementar a interação gravitacional, inserir possíveis adversários para jogos single player (acho que seria bom usar lógica fuzzy na inteligência dos adversários, como no vídeo do controle fuzzy de foguete).
  5. Esta é uma estapa opcional: permitir jogos multi-player pela web, neste ponto terei sérios problemas pois não tenho experiência em aplicações desta natureza.
  6. Por fim, fazer o módulo de controle do foguete pela webcam, sendo esta a parte final do projeto.

Com isso, fecho o Gravity Racer1.0 e este estará pronto para o mercado.

quarta-feira, 27 de fevereiro de 2008

Aplicações com ICA e SDL

Uma das áreas do conhecimento que tenho maior afinidade é a Inteligência Computacional Aplicada (ICA) que consiste basicamente de 3 técnicas:
  • Algoritmos Genéticos;
  • Lógica Fuzzy (Nebulosa);
  • Redes Neurais.
Quando fiz esta disciplina na graduação, coincidiu com meu estudos da API gráfica SDL (Simple Direct Layer) em C.

Seguemos vídeos ilustrativos de aplicações que desenvolvi.