Inteligência artificial e a ESPN

Seguindo o exemplo do Netflix, agora é a vez da ESPN abrir o leilão para o melhor algortimo de predição de desempenho de times, baseados em dados históricos. Via topCoder, um site onde desenvolvedores vendem seus serviços globalmente, via um mecanismo de competição (nada mais justo para quem quer fornecer para a ESPN). São US$ 100.000 em prêmios (falando assim, até parece frase do caminhão do faustão).

Os melhores algoritmos estão acertando em cerca de 80%.

Tem loteria esportiva nos estados unidos?

Independente do valor de se conseguir prever o desempenho ou não dos times no campeonato (afinal, as pessoas fazem apostas, os anunciantes gostam de avaliar o potencial dos jogos e dos times, etc), quanto será que a visibilidade deste concurso não rende para a ESPN? Imagine você ser o canal de esportes que além de passar e comentar o jogo, ainda mostra previsões.

Ou a quantidade de papo de buteco que isso rende. ;-)

Esportes, Inteligência Artificial 0 Comentários

Editores de jornal artificiais?

O Yahoo está utilizando inteligência artificial para selecionar notícias para sua página principal. Um grupo de notícias é selecionado manualmente à moda antiga: por editores de carne e osso. A partir daí, um sistema desenvolvido internamente decide quais notícias serão realmente exibidas, por quanto tempo, e com que grau de destaque. O sistema monitora, em tempo real, a “click through rate”, ou a fração de usuários que clicam na notícia para ler o texto completo.

Como cada texto completo vem com ads, aumentar a fração de cliques tem um impacto direto no faturamento. Os cientistas dizem que o novos sistema aumentou a “click through rate” em 30%.

Um aspecto interessante é que eles tentaram metodos mais sofisticados, como analisar informação semântica sobre o conteúdo de um artigo e personalizar a pagina para cada usuário, mas esses métodos nao apresentaram o mesmo impacto na “click through rate”. A técnica em uso atualmente, aparentemente baseada em um filtro de Kalman, é simples e tem a vantagem de ser facilmente ajustada em tempo real. Esse tipo de ajuste permite que notícias surpreendentemente populares sejam mantidas em evidência por mais tempo, e tambem que o sistema se recupere rapidamente quando faz uma sugestão ruim.

Nao é um computador que pensa, mas é uma aplicaçãoo muito prática (e, ao que tudo indica, lucrativa) de métodos simples. É sempre bom ver pesquisa com esse tipo de foco pé no chão.

Inovação, Inteligência Artificial, Internet 0 Comentários

Robôs Criam Pânico em Wall Street

Nessa segunda-feira, dia 8/9, o preço das ações da United Airlinas despencou de US$12,50 para US$3,00 nas bolsas de valores americanas, em apenas 15 minutos. A negociação das ações foi suspensa temporariamente. Tudo isso por causa de um rumor infundado de que a empresa estaria entrando em processo de concordata. O preço das ações voltou ao normal depois que ficou claro que o rumor era falso.

O que aconteceu? Uma combinação de problemas de “burrice artificial” e, claro, a boa e velha burrice natural. A United Airlines realmente entrou em concordata uma vez, mas isso foi em 2002, e isso foi amplamente noticiado pelos jornais.

Pois bem, essa notícia, de dezembro de 2002, de alguma forma apareceu na lista de notícias mais visitadas do site do Chicago Tribune na noite do dia 6/9. Aparentemente, de acordo com o Wall St. Journal, só uma pessoa visitou a notícia, mas o fez durante um período de tráfego muito baixo (afinal era sábado à noite), durante o qual uma visita era o suficiente para colocar a notícia velha entre as cinco mais populares. Burrice artificial número um.

Alguns minutos depois, o robô do Google News fez sua visita periódica ao site do Chicago Tribune, e viu um link que não estava lá antes. A notícia foi baixada mas, como não tinha data, o Google News assumiu a data do dia, que estava no cabeçalho da página que linkava para a notícia antiga. Já era madrugada do dia 7. A notícia foi parar no Google News, sem nenhuma indicação de sua data original de publicação. Burrice artificial número dois.

Aqui entra a burrice natural. A Bloomberg, além daquele canal de TV a cabo com a pior aparência de todos os tempos, também oferece um serviço de notícias em tempo real (com aparência um pouco melhor que a do canal de TV), que é acompanhado por todo mundo no mercado financeiro americano. Algum analista financeiro imbecil viu a notícia e a passou para a Bloomberg. Burrice natural.

Na manhã de segunda feira, mais ou menos uma hora depois que o mercado tinha aberto, a famigerada notícia foi divulgada pela Bloomberg. Hoje em dia há uma grande quantidade de sistemas que “interpretam” o conteúdo das manchetes da Bloomberg e negociam ações com base nessa interpretação. Tudo automatizado. E tem que ser automatizado, porque o tempo de reação é que permite que esse tipo de operação dê lucro: o sistema tem que processar as manchetes, decidir o que fazer e operar antes que os analistas humanos tenham terminado de ler a notícia e tomado suas decisões. Bom, esses sistemas todos concluíram a mesma coisa, venderam tudo que tinham de ações da United Airlines e mais um pouco, e o preço foi pro brejo.

E aí? Esse último foi burrice artificial? A decisão dos sistemas foi correta, dada a informação disponível. Como os sistemas poderiam saber que a notícia era de 2002? Será que não foi burrice natural a falta de alguma salvaguarda?

Eu não sei responder essas perguntas acima, mas sei que essa história mostra o risco que investidores correm hoje em dia porque computadores movimentam um enorme volume de dinheiro nas bolsas sem supervisão cuidadosa de humanos. E esses computadores não estão preparados para lidar com entradas ruins desse tipo. Claro, a velha máxima ainda vale: inteligência artificial não é páreo para burrice natural…

Inteligência Artificial, Internet 3 Comentários

Nossos cãezinhos virtuais na Virtual Worlds Expo 2008

Já que estamos falando de conferências, semana passada rolou a Virtual Worlds Expo em Los Angeles. Mais de 1300 visitantes e expositores, e a Novamente estava lá, com um stand, mostrando os cãezinhos virtuais que estamos desenvolvendo por aqui.

Nós gravamos alguns vídeos de demonstração dos cachorros. Quatro vídeos estão disponíveis para quem quiser ver:

Desculpem as animações e arte ainda meio toscas, mas até agora o foco do trabalho tem sido mesmo na inteligência dos bichinhos. Nos próximos meses vamos trabalhar também na robustez do sistema e da interface, e vamos postando mais vídeos quando tivermos novidades interessantes!

Inovação, Inteligência Artificial, Mundos Virtuais 5 Comentários

TechCrunch 50!

Está rolando em San Francisco a TechCrunch 50, uma grande conferência onde startups se apresentam para a imprensa, investidores, empreendedores e outros formadores de opinião do Vale do Silício. É provavelmente o maior evento dedicado ao lançamento de novos produtos, sites e empresas inovadoras do mundo. As empresas selecionadas (52 de um total de mais de 1000 inscrições) têm que manter seus produtos em segredo até a conferência.

Como a conferência já começou, podemos anunciar que um dos produtos lançados foi desenvolvido todinho aqui no Labs, e está em beta atualmente. O StockMood.com é uma ferramenta para auxílio a pequenos investidores na bolsa dos EUA. O sistema usa processamento de linguagem natural e inteligência artificial para determinar o “tom” (positivo ou negativo) de artigos que saem na imprensa sobre uma empresa.

Correlacionando o tom dos artigos com o movimento do preço da ação ao longo do tempo, ele tenta quantificar o “humor” da ação, e gera alertas quando o humor e o tom dos artigos do dia chegam a valores muito altos ou muito baixos. Esses alertas indicam uma possível reversão dos preços. O sistema de classificação do tom de artigos está longe de ser perfeito, mas os usuários podem corrigir os erros do sistema pelo site, gerando alertas melhores e permitindo que o próprio classificador aprenda com os erros.

Brett Markinson presenting StockMood.com

A foto acima (by Andrew Mager) é do Brett, CEO da nova startup, durante a apresentação. A recepção ao StockMood.com foi geralmente bem positiva, como nesse artigo da Fortune. embora o modelo de negócios da empresa ainda esteja sendo refinado. O beta será limitado, por enquanto, a 1000 usuários cadastrados, então se você achou a idéia interessante e não tem medo do inglês, cadastre-se!

E, finalmente, parabéns a toda a equipe do StockMood.com, especialmente ao Fabrício Aguiar e ao Gustavo Gama, que vocês conhecem um pouco de posts aqui no blog.

Data Mining, Inovação, Inteligência Artificial, Internet, Linguagem Natural, Negócios, Web 2.0 8 Comentários

A regra de Pareto e as máquinas de busca

A declaração recente da Marissa Mayer, “Vice President of Search Product and User Experience at Google”, de que o Google já resolveu 90% do problema de busca, mas que os 10% ainda vão dar um bom trabalho, incomodou muita gente na webosfera.

Prá quem não conhece a moça, Marissa é certamente uma das executivas mais importantes da indústria atualmente, e talvez um dos pontos máximos que um profissional de usabilidade almejaria hoje em dia.

O que há por trás dessa declaração? Bem, podemos desfilar vários aspectos interessantes aqui.

Uma delas é que frequentemente, no desenvolvimento de software, fala-se sempre da regra do 80/20 ou a Regra de Pareto, que originalmente falava que 80% das consequências vinham de 20% das causas. Mas claro que a proporção foi ganhando outros usos, como “80% do desenvolvimento leva 20% do tempo e os 20% restantes levam os outros 80% do tempo”.

Em bom e claro Português, “o diabo vive nos detalhes” :-)

De fato, muito da busca na web chegou a um nível de refinamento e desempenho formidáveis, mas o que significa dizer que 80% ou 90% do problema já está resolvido? E é neste pé que os críticos da web resolveram pegar para criticar o argumento da Marissa.

Segundo a techcrunch por exemplo, o que resta das coisas a serem indexadas e buscadas ainda é muito grande. Ainda não temos resultados satisfatórios GENÉRICOS para buscas semânticas, buscas em imagens, buscas em filmes, e muitos et ceteras.

Podemos dizer, certamente, que existe um grande potencial em buscas de imagens, por exemplo, em contextos restritos, e este é um mercado que deve crescer rapida e intensamente nos próximos anos. Mas se você quer buscar pela foto do gato com o cachorro, a menos que vc tenha intervenções humanas de forma inteligente, não se resolveu ainda o problema computacional de definir o que é exatamente um cachorro. Mas se você souber formatos de armas, talvez consiga localizar, com algum bom grau de precisão, armas num recinto por exemplo.

E aí podemos estender para as buscas em linguagem natural e etc, e a conclusão é: ainda tem muito terreno a ser caminhado neste aspecto, e isso significa, em termos de inovação, que há muito o que explorar ainda nesta área. Será que 10% é achar uma agulha numa cena de 1 segundo no youtube?

Enquanto isso, silenciosamente, coisas acontecem no Yahoo.

Ninguém do porte desta moça dá declarações impensadas. Stay tuned.

Update 11/9: 2 dias depois, Marissa escreveu uma declaração, voltando atrás, e concordando basicamente com a opinião das pessoas (eu entre elas) que acham que ainda falta muito chão, inclusive citando nosso bom e velho Pareto ;-)

Ciências cognitivas, Data Mining, Inovação, Inteligência Artificial, Internet, Linguagem Natural, Teoria da Informação, Visão Computacional, Web 2.0 0 Comentários

OpenCog: Inteligência Artificial livre

Há alguns meses estamos trabalhando em um conjunto de projetos bem interessante aqui no Labs. Normalmente, eu não anuncio projetos em desenvolvimento no blog a não ser que os julgue de interesse de boa parte dos leitores, como foi o caso dos cachorros virtuais. Bom, esse projeto está chegando ao ponto em que podemos (e queremos) recrutar colaboradores externos, e envolve diversas tecnologias que já discutimos por aqui.

O OpenCog é um conjunto de projetos de software livre, relacionados a inteligência artificial. É patrocinado pela Novamente (nosso parceiro nos EUA para projetos de IA) e pelo SIAI (Singularity Institute for Artificial Intelligence), com apoio de outras empresas, entre elas o Vetta Labs (onde hoje duas pessoas se dedicam ao projeto) e o Google (patrocinando estudantes via Google Summer of Code). Estamos empacotando diversas tecnologias que desenvolvemos ao longo dos últimos sete anos, e abrindo seu código para a comunidade. Tomamos essa decisão porque acreditamos que os projetos que fazem parte do OpenCog estão se aproximando de um nível de maturidade em que podem ser muito úteis para pesquisadoras em IA e áreas correlatas, e atrair uma comunidade ao redor dos mesmos nos permitirá continuar seu desenvolvimento de forma mais rápida que vínhamos conseguindo dentro da Novamente e do Labs, onde o trabalho de pesquisa sempre tem que competir por recursos com objetivos mais focados em necessidades imediatas dos clientes que pagam as contas.

O OpenCog é composto de um framework que oferece uma fundação para o desenvolvimento de diversos métodos de IA, em uma abordagem de sistemas multiagentes, que trabalham sobre uma base de conhecimento comum. Além do framework, o programa inicial inclui projetos de processamento de linguagem natural (inclusive as tecnologias mencionadas no excelente post introdutório do Murilo), raciocínio probabilístico e computação evolutiva. Combinando esses projetos é possível construir sistemas para uma enorme variedade de objetivos.

Um desses sistemas exemplo será a versão software livre dos
nossos cachorros virtuais, que estamos criando sob patrocínio da RealeXtend e estará disponível em outubro.

Fomos agraciados esse ano também com 11 projetos patrocinados pelo Google Summer of Code. Nada mal para um programa recém-lançado. É o mesmo número de projetos aprovados para a Debian, e mais que muita gente famosa obteve: Wikimedia Foundation, One Laptop Per Child, GCC e outros. O leitor interessado pode conferir os projetos aqui. Quando esses projetos forem concluídos devemos postar mais detalhes por aqui.

Recentemente nós completamos a documentação de boa parte dos planos de longo prazo para o OpenCog, na forma de um “wikibook“. Existem também um canal de IRC, listas de discussão, blogs e uma rede social dedicados ao OpenCog. A partir de setembro, teremos discussões semanais sobre os planos e projetos do OpenCog no IRC. Com tudo isso, espero que leitores com formação técnica e interesse por inteligência artificial se sintam encorajados a se juntar ao time OpenCog. Serão muito bem vindos.

Inteligência Artificial 2 Comentários

Aprendizagem de Máquina ao Alcance de Todos - (2)

Voltando sem muitas delongas ao exemplo da primeira parte desse artigo, vamos considerar novamente o nosso banco de dados de pessoas caracterizadas cada uma por um “registro” seguindo o mesmo formato, com campos de peso, altura, idade, sexo, etc. Agora, vamos supor que além dessa caracterização por dados biométricos sabemos que essas pessoas estão classificadas em dois grupos, digamos que com e sem histórico de problemas cardíacos. Em jargão de biologia, as pessoas com histórico cardíaco são “Casos”, as sem são “Controles”.

Em Aprendizagem de Máquina, a chamada Aprendizagem Supervisionada consiste em treinar um “modelo” (uma função ou algoritmo de classificação) a reconhecer casos e controles automaticamente. É o tipo de problema aplicável exatamente a massas de dados com informação de categoria, como a do exemplo acima. Essa massa de dados é chamada de “conjunto de treinamento”, justamente porque sua função é servir como uma coleção de exemplos que são usados para “dizer” ao classificador onde ele está errando e onde ele deve melhorar - daí o “supervisionado” no nome desse tipo de aprendizagem.

Exatamente como um método de classificação pode conseguir resultados melhores ou piores dado um conjunto de exemplos? Bom, existem inumeráveis algoritmos de aprendizagem supervisionada - redes neurais, métodos evolutivos, árvores de decisão, todos eles podem ser usados para classificação. Para fins didáticos, porém, vou focar aqui em um método bem geométrico, as SVMs (do Inglês Support Vector Machines).

Como já disse na Parte 1, cada “campo” do banco de dados descrevendo as coisas sendo classificadas (no exemplo pessoas) é visto como uma dimensão (no sentido espacial da coisa mesmo) em aprendizagem de máquina. Se os registros tiverem só três campos - digamos, peso, altura e idade - temos três dimensões, e as pessoas são “vistas” por um algoritmo de ML como pontos num espaço tridimensional com eixos de idade, peso e altura. Assim Fulano pode ocupar o ponto em 1,80 metros, 75 quilos e 36 anos, enquanto Beltrano está no ponto 1,72m, 60Kg, 28a. Esse é um exemplo não tão difícil de visualizar porque usa um espaço tridimensional como aquele de largura, comprimento e altura onde vivemos, mas na prática os problemas de ML lidam quase sempre com “hiperespaços” multidimensionais. Em problemas de Bioinformática são comuns espaços com milhares de dimensões, por exemplo.

De qualquer forma, voltando às SVMs, o que elas fazem é (supersimplificando a coisa) encontrar uma “hipersuperfície” que divide esse “espaço” do problema em dois lados. Uma divisão boa é aquela que deixa os pontos representando Casos de um lado da superfície e os pontos representando Controles do outro lado. No nosso exemplo das pessoas com e sem problemas cardíacos ocupando um espaço tridimensional, vamos enxergar o espaço 3D como um cubo e supor que a maioria dos casos ocupa a metade do cubo correspondendo a pessoas com mais peso e mais idade, enquanto os controles se concentram nas pessoas mais novas e magras. Um plano cortando o cubo em dois na diagonal, paralelo ao eixo de altura, já dá uma divisão razoável então. Talvez essa divisão razoável deixe muitos pontos ainda nos lados errados, então podemos experimentar outras coisas como inclinar o plano (talvez em relação ao eixo de altura, para fatorar pessoas que são pesadas porque são grandes), ou mesmo experimentar uma superfície que não seja plana, mas sim curva, correndo em uma forma meio ondulada que divida os dois conjuntos de pontos quase perfeitamente. (No caso de SVMs, o tipo de superfície é determinado pela chamada “função de kernel” - que no caso do plano é uma função linear.)

Finalmente, é interessante também computar a superfície de forma a que, além de separar o mais corretamente possível os pontos, ela também mantenha uma certa distância desses pontos, sem “passar raspando” em nenhum deles. Isso tem a ver com o que talvez seja a mais desejada e mais difícil de obter das características de um bom classificador: a capacidade de generalização. Isto é, a capacidade de corretamente classificar elementos novos, desconhecidos, que não estavam no conjunto de treinamento. No caso das SVMs, podemos visualizar que uma superfície correndo muito “rente” pelos pontos limítrofes da, digamos, Categoria Caso, pode erroneamente classificar um monte de pontos como Controle, mesmo eles caindo perto dos pontos de Caso, simplesmente porque a superfície está rente demais e não inclui pontos próximos que provavelmente também são Casos. Em casos assim, podemos “antropomorfizar” o que aconteceu dizendo que o classificador na verdade não aprendeu nada, apenas “decorou” os pontos que foram mostrados a ele…

No fim das contas, todo classificador gerado por aprendizagem supervisionada faz essencialmente a mesma coisa que a SVM - seccionar o espaço do problema em regiões correspondentes a categorias. Só que eles trabalham sob princípios que não são tão obviamente geométricos (e didáticos) como no caso da SVM, daí não vou falar sobre eles aqui. Finalmente, aprendizagem supervisionada não é categorização - coisas como regressão simbólica também caem nessa subdivisão de ML. Mas acho que isso já fugiria um pouquinho do nível “feijão com arroz” implicado pelo título. :)

Inteligência Artificial 0 Comentários

Alan Turing

Antes de chegarmos ao centésimo post deste blog (será o próximo), não podíamos deixar passar em branco que exatamente ontem, véspera de dia de São João, também foi o aniversário de uma das pessoas mais importantes da ciência da computação, o matemático britânico Alan Turing.

Graças ao Turing, temos o conceito de algoritmo e construções lógico-matemáticas como a máquina de Turing (uma abstração que descreve o funcionamento de uma máquina lógica determinística, exatamente como nossos computadores) e o teste de Turing, que descreve um procedimento que diferenciaria uma pessoa de um programa, com base na inteligência do interlocutor, ou em sua capacidade de mimetizar a inteligência de um ser humano real.

Assim, Alan Turing não só teorizou sobre o funcionamento dos computadores muito antes deles existirem, mas também lançou sementes de discussão sobre a Inteligência Artificial.

Alan Turing também passou maus bocados desde o início da guerra fria por conta de seu homossexualismo que era condenado (mais ainda) na época. Em 1954, Alan Turing morreu por suicídio, comendo uma maçã envenenada, uma referência à Branca de Neve (que alguns atribuem erroneamente à logo colorida da maçã da apple). Um triste fim para um gênio: morrer por causa do preconceito e da intolerância da “moral” do pós-guerra.

A vida de Alan Turing também rendeu um filme feito para a TV em 96 chamado “Breaking the code” (não sei se chegou a sair no Brasil). E no site oficial do Turing, há também uma “oração“, um texto muito legal e crítico do Andrew Hodges, que escreveu o livro “Enigma“, talvez a mais bem conhecida biografia de Turing.

Mas este post não é apenas para homenagear o Alan Turing, mas também para anunciar a parceria do Instituto Turing, o braço de pesquisa e educação do Vetta Labs, com a ETEG, uma empresa que dentre outras atividades, é referência em treinamento de TI em Belo Horizonte. A ETEG disponibiliza, junto com seu rol de cursos (a grande maioria relacionada a JAVA), os cursos de Eclipse RCP e BIRT, AJAX Básico, Toolkits AJAX e Ruby On Rails. Fica a dica.

Biografia, Desenvolvimento, Inteligência Artificial, Teoria da Computação 0 Comentários

Aprendizagem de Máquina ao Alcance de Todos - (1)

Volta e meia surge algum artigo aqui no blog falando de aplicações de inteligência artificial e frequentemente usando termos que podem soar meio misteriosos para muitos, como o críptico “aprendizagem de máquina”, às vezes também usado em sua forma original em Inglês, “machine learning”. Penso que talvez esse termo pode ainda evocar na cabeça de muitos uma imagem de coisa scifi incompreensível, então decidi escrever este artigo (em dois “capítulos”) sobre o beabá da aprendizagem de máquina para mostrar que, uma vez explicado, o tal Machine Learning (ou ML) pode até parecer meio prosaico…

A definição vaga e por alto (e não sei se existe uma definição exata e profunda, a propósito :) de ML como um todo é: um método ou algoritmo para descobrir de forma automatizada padrões em uma massa de dados. Acho que essa definição não diz muito coisa sem exemplos, então vamos dar alguns nomes a alguns bois.

Vamos supor que você tenha um banco de dados com características de várias pessoas. As características podem ser qualquer coisa (digamos, peso, altura, idade, etc), desde que possam ser comparadas de forma quantitativa ou lógica. Esse conjunto de valores de características descrevendo cada pessoa é chamado vetor de características, em jargão de ML.

Já que o valor da altura de uma pessoa é comparável com o valor da altura de outra, o mesmo acontecendo com peso, idade e demais dimensões (=outro jargão de ML - bem, na verdade de ciências exatas em geral, nesse caso :) do vetor de características, então acaba que dois vetores inteiros podem ser comparados um com o outro, levando em conta todas as suas dimensões ao mesmo tempo. É possível criar o que chamamos de medida de similaridade, que é simplesmente uma conta envolvendo todas as dimensões de dois vetores que no final solta um número - quanto mais alto esse valor, mais similares são esses vetores.

De posse dessa medida, já é possivel fazer coisas divertidas em ML - por exemplo juntar as pessoas parecidas umas com as outras, dividindo o conjunto original em vários subconjuntos de pessoas parecidas. Esse tipo de processo é o chamado clustering - ou aglomeração, traduzindo - e é a base da vertente de ML chamada de aprendizado não-supervisionado.

A parte do “aprendizado” nesse nome vem do fato de que antes os elementos do conjunto de dados sendo analisado eram completamente amorfos, não-estruturados, “farinha do mesmo saco” por assim dizer; após o clustering, porém, temos grupos separados nos quais veremos padrões. No exemplo do clustering de pessoas, talvez se forme um aglomerado de pessoas baixas e gordas, outro de pessoas altas, um de pessoas velhas de peso médio, e por aí vai.

Já a parte do “não supervisionado” vem do fato de que não é preciso dizer ao algoritmo de clustering sendo usado (existe uma infinidade deles) se os resultados que ele está produzindo são bons ou ruins, ele mesmo toma suas próprias “decisões” de como fazer melhor a aglomeração. Aliás, é difícil dizer quantitativamente e de forma geral, irrestrita, se um clustering é bom ou ruim, no sentido de que é algo um tanto subjetivo - existe uma multiplicidade de métricas de qualidade de clustering, com aplicações apropriadas caindo em vários casos diferentes.

Existe também, é claro, a aprendizagem supervisionada, o outro grande campo da Aprendizagem de Máquina. Mas isso é assunto para a Parte 2 deste artigo…

Data Mining, Inteligência Artificial 0 Comentários

« Previous Entries