Elogios para Programando a Inteligência Coletiva

Propaganda
Elogios para Programando a Inteligência Coletiva
“Eu reviso uns poucos livros por ano, e naturalmente, leio uma boa quantidade durante o curso do
meu trabalho. E tenho que admitir que nunca gostei tanto de ler uma pré-impressão de um livro como
aconteceu com este. Bravo! Não consigo pensar numa forma melhor para um desenvolvedor ter seu
primeiro contato e aprender a respeito desses algoritmos e métodos, nem num método melhor para
que eu mesmo (sendo uma raposa velha em IA) reforce meu conhecimento a respeito dos detalhes.”
- Dan Russell, Responsável por Tecnologias de Ponta, Google
“O livro de Toby faz um ótimo trabalho ao analisar uma área complexa como os algoritmos de
aprendizado de máquina e chegar a exemplos práticos e acessíveis, que podem ser usados diretamente
para analisar interação social através da Internet hoje em dia. Se esse livro estivesse disponível dois
anos atrás, ele teria me poupado tempo precioso gasto seguindo caminhos sem resultados.”
- Tim Wolters, CTO (oficial chefe de tecnologia, Chief
Technology Officer), Collective Intellect
“Programando Inteligência Coletiva é uma realização extraordinária com relação à forma como ele
fornece uma coleção acessível de métodos computacionais para relacionar vastas quantidades de
dados. Especificamente, ele aplica essas técnicas no contexto da Internet, encontrando valor em ilhas
de dados que de outra forma estariam isoladas. Se você é um desenvolvedor para a Internet, este livro
é leitura obrigatória.”
- Paul Tyma, Engenheiro de Software Senior, Google
I
II
Programando a Inteligência Coletiva
Sumário
Prefácio..........................................................................................................XI
Capítulo 1. Introdução à Inteligência Coletiva................................................1
O Que É Inteligência Coletiva?..............................................................................................................2
O Que É Aprendizado de Máquina?......................................................................................................3
Limites do Aprendizado de Máquina......................................................................................................3
Exemplos na Vida Real.........................................................................................................................4
Outros Usos para Algoritmos de Aprendizado.......................................................................................5
Capítulo 2. Fazendo Recomendações..............................................................7
Coletando Preferências..........................................................................................................................8
Encontrando Usuários Similares.............................................................................................................9
Qual Métrica de Similaridade Deve Ser Usada?...................................................................................13
Classificando as Avaliações.................................................................................................................13
Recomendando Itens..........................................................................................................................14
Encontrando Produtos Similares..........................................................................................................16
Desenvolvendo um Sistema de Recomendação de Link do del.icio.us..........................................................17
Filtragem Baseada em Itens................................................................................................................20
Usando o Conjunto de Dados do MovieLens.......................................................................................23
Exercícios............................................................................................................................................25
Capítulo 3. Descobrindo Grupos....................................................................27
Aprendizado Supervisionado versus Não Supervisionado.................................................................27
Vetores de Palavras...............................................................................................................................28
Agrupamento Hierárquico...................................................................................................................30
Desenhando o Dendrograma...............................................................................................................35
Agrupamento de Colunas....................................................................................................................37
V
Agrupamento de K-Means..................................................................................................................39
Grupos de Preferências........................................................................................................................41
Vendo Dados em Duas Dimensões......................................................................................................45
Outras Coisas para Agrupar.................................................................................................................48
Exercícios............................................................................................................................................49
Capítulo 4. Procurando e Qualificando...........................................................51
O Que Tem Dentro de um Sistema de Busca?.....................................................................................51
Um Crawler Simples...........................................................................................................................53
Montando o Índice.............................................................................................................................55
Classificação Baseada em Conteúdo..................................................................................................60
Usando Links Externos.......................................................................................................................64
Aprendendo com os Cliques...............................................................................................................67
Exercícios............................................................................................................................................76
Capítulo 5. Otimização...................................................................................79
Viagens em Grupo..............................................................................................................................79
Representando Soluções.....................................................................................................................81
A Função Custo...................................................................................................................................81
Pesquisa Aleatória..............................................................................................................................83
Subindo a Colina.................................................................................................................................84
Têmpera Simulada..............................................................................................................................86
Algoritmos Genéticos..........................................................................................................................88
Buscas Reais por Vôos........................................................................................................................92
Otimizando por Preferências...............................................................................................................96
Visualização de Redes..........................................................................................................................99
Outras Possibilidades..........................................................................................................................103
Exercícios..........................................................................................................................................104
Capítulo 6. Filtragem de Documento...........................................................105
Filtragem de Spam............................................................................................................................105
VI
Programando a Inteligência Coletiva
Documentos e Palavras.......................................................................................................................106
Treinando o Classificador....................................................................................................................107
Calculando Probabilidades................................................................................................................108
Um Classificador Ingênuo (A Naïve Classifier)...................................................................................110
O Método Fisher................................................................................................................................114
Salvando os Classificadores Treinados................................................................................................117
Filtrando Blogs..................................................................................................................................119
Melhorando a Detecção de Características........................................................................................121
Usando a Akismet.............................................................................................................................122
Métodos Alternativos ......................................................................................................................123
Exercícios..........................................................................................................................................124
Capítulo 7. Modelos com Árvores de Decisão.............................................125
Prevendo incrições.............................................................................................................................125
Apresentando as Árvores de Decisão................................................................................................126
Treinando a Árvore............................................................................................................................128
Escolhendo a Melhor Divisão.............................................................................................................129
Construção Recursiva de Árvore........................................................................................................131
Exibindo a Árvore...............................................................................................................................133
Classificando Novas Observações......................................................................................................135
Podando a Árvore..............................................................................................................................136
Lidando com Dados Faltantes.............................................................................................................138
Lidando com Resultados Numéricos...................................................................................................139
Fazendo um Modelo de Preços de Casas...........................................................................................139
Fazendo Modelos de “Sensualidade”.................................................................................................142
Quando Usar Árvores de Decisão.......................................................................................................144
Exercícios..........................................................................................................................................145
Capítulo 8. Montando Modelos de Preço....................................................147
Montando um Conjunto de Dados de Exemplo.................................................................................147
Os k Vizinhos Mais Próximos.............................................................................................................148
VII
Vizinhos Ponderados........................................................................................................................150
Validação Cruzada.............................................................................................................................154
Variáveis Heterogêneas......................................................................................................................156
Otimizando as Escalas.......................................................................................................................158
Distribuições Desiguais.....................................................................................................................160
Usando Dados Reais - a API da eBay................................................................................................164
Quando Usar os k Vizinhos Mais Próximos.......................................................................................170
Exercícios..........................................................................................................................................170
Capítulo 9. Classificação Avançada: Métodos de Núcleo e MVSs................173
Conjunto de Dados de Páginas de Encontros...................................................................................173
Dificuldades com os Dados...............................................................................................................174
Classificação Linear Básica...............................................................................................................176
Características de Categoria.............................................................................................................180
Escalonando os Dados......................................................................................................................184
Entendendo Métodos de Núcleo........................................................................................................185
Máquinas de Vetor de Suporte...........................................................................................................188
Utilizando a LIBSVM (Biblioteca de Máquinas de Vetor de Suporte)............................................................189
Compatibilidade no Facebook...........................................................................................................192
Exercícios..........................................................................................................................................196
Capítulo 10. Encontrando Características Independentes.........................199
Um Corpus de Notícias......................................................................................................................200
Fatoração de Matriz Não Negativa...................................................................................................204
Mostrando os Resultados..................................................................................................................211
Utilizando Dados do Mercado de Ações...........................................................................................213
Exercícios..........................................................................................................................................218
Capítulo 11. Inteligência Evolutiva.............................................................219
O Que É Programação Genética?.....................................................................................................219
Programas Como Árvores.................................................................................................................221
VIII
Programando a Inteligência Coletiva
Criando a População Inicial...............................................................................................................225
Testando uma Solução......................................................................................................................226
Criando Programas Mutantes............................................................................................................228
Cruzamento.......................................................................................................................................230
Construindo o Ambiente....................................................................................................................232
Um Jogo Simples................................................................................................................................235
Mais Possibilidades............................................................................................................................238
Exercícios..........................................................................................................................................241
Capítulo 12. Resumo de Algoritmo..............................................................243
Classificador bayesiano.....................................................................................................................243
Classificador de Árvore de Decisão...................................................................................................246
Redes Neurais...................................................................................................................................250
Máquinas de Vetor de Suporte...........................................................................................................253
Os k Vizinhos Mais Próximos.............................................................................................................257
Agrupamento....................................................................................................................................260
Escalonamento Multidimensional.....................................................................................................263
Fatoração de Matriz Não-Negativa....................................................................................................265
Otimização.........................................................................................................................................267
Apêndice A..................................................................................................271
Apêndice B..................................................................................................277
Índice Remissivo..........................................................................................284
IX
X
Programando a Inteligência Coletiva
Prefácio
O número crescente de pessoas colaborando para a Internet, seja deliberadamente ou incidentalmente,
tem criado gigantescos conjuntos de dados que potencialmente podem nos despertar milhões de vezes
a intuição para entender: a experiência dos usuários, o mundo da propaganda, os gostos pessoais
e o comportamento humano de forma geral. Esse livro serve como introdução para aprender a se
aproveitar de conjuntos de dados interessantes oriundos de muitas páginas de Internet das quais você
provavelmente já ouviu falar, para ter idéias a respeito de como coletar dados de usuários para os seus
próprios aplicativos e também mostra muitas formas diferentes de analisar e entender os dados uma
vez que você os tenha encontrado.
O objetivo deste livro é levar você além do cenário comum de aplicativos baseados em bases de dados
e ensinar como escrever programas mais inteligentes que se aproveitam das informações que você e
outros coletam todos os dias.
Pré-Requisitos
Os exemplos de código nesse livro são escritos em Python, portanto familiaridade com essa linguagem
vai ajudar, mas fornecemos explicações a respeito de todos os algoritmos para que programadores de
outras linguagens possam compreender. O código em Python será particularmente fácil de endenter
para aqueles com conhecimento em linguagens de programação de alto nível como Ruby ou Perl.
Esse livro não se destina a ser um guia para aprender programação, portanto é importante que o
leitor tenha experiência e familiaridade com os conceitos básicos dessa área. Se você tem um bom
conhecimento a respeito de recursividade e de alguma programação funcional básica, vai achar o
material ainda mais fácil.
Esse livro não exige que você tenha qualquer conhecimento prévio em análise de dados, aprendizado de
máquina ou estatística. Tentamos explicar conceitos matemáticos da forma mais simples possível, mas
ter algum conhecimento de trigonometria e estatística básica deve ajudar a entender os algoritmos.
Estilo dos Exemplos
Os exemplos de código em cada seção são escritos num estilo de tutorial, que encoraja o leitor a construir
seus aplicativos em módulos e ter uma boa compreensão de como os algoritmos funcionam. Na maioria
dos casos, depois de criar uma nova função ou método, você os utilizará numa seção interativa para
melhor entender seu funcionamento. Os algoritmos são na maior parte variações simples e podem ser
estendidos de muitas formas. Ao analisar os exemplos e testá-los interativamente, você deverá intuir
maneiras pelas quais poderá melhorar esses algoritmos para usar em seus próprios aplicativos.
XI
Porque Python?
Embora os algoritmos sejam explicados com texto que descreve as fórmulas envolvidas, é muito mais
útil (e provavelmente mais fácil de entender) o código em si para os algoritmos e os problemas usados
como exemplos. Todo o código mostrado nesse livro é escrito em Python, uma ótima linguagem de
alto nível. Eu escolhi Python porque ela é:
Concisa
Código escrito em linguagens digitadas dinamicamente como o Python tende a ser mais
sucinto do que os escritos em outras linguagens importantes. Isso significa que menos digitação
é necessária quando copiando os exemplos, mas também implica que é mais fácil entender o
algoritmo e o que ele faz.
Legível
O Python tem sido chamado de “pseudo-código executável”. Embora isso seja claramente um
exagero, indica que a maior parte dos programadores experientes pode facilmente ler Python
e entender o que o código deveria fazer. Algumas das estruturas menos óbvias do Python são
explicadas na seção “Dicas de Python”.
Facilmente Extensível
O Python vem por padrão com muitas bibliotecas, incluindo de funções matemáticas, de
decodificação de XML (linguagem de marcação estensível, Extensible Markup Language).
As bibliotecas que não são o padrão utilizado neste livro, como as de decodificação de RSS
(publicação realmente simples, Really Simple Syndication) e a interface do SQLite, são
gratuitas e fáceis de baixar, instalar e usar.
Interativa
Quando executando um exemplo, é útil testar as funções sem ter que escrever outro programa
para esse propósito. Com Python é possível executar programas diretamente da linha de
comando, e também existe uma linha de entrada interativa que permite que se efetue chamadas
de funções, que se criem objetos e que pacotes sejam testados interativamente.
Multiparadigma
Python tem suporte para os paradigmas: orientação a objeto, procedural e funcional. Os algoritmos
de aprendizado de máquina variam grandemente, e a forma mais clara de implementar um deles
pode ser usar um paradigma diferente. Algumas vezes é útil passar funções como parâmetros e
outras ,é útil capturar estados num objeto. Python suporta ambas as abordagens.
Multiplataforma e gratuita
O Python tem uma implementação de referência única para cada uma das maiores
plataformas e é gratuita para todas elas. O código descrito neste livro funcionará em Windows,
Linux e Macintosh.
Dicas de Python
Para iniciantes interessados em aprender sobre programação em Python, eu recomendo ler Learning Python,
de Mark Lutz e David Ascher (O’Reilly), no qual encontramos uma excelente visão geral. Programadores
de outras linguagens devem considerar o código em Python relativamente fácil de entender, embora
XII
Programando a Inteligência Coletiva
cuidado seja necessário porque em alguns pontos no livro utilizamos algumas das idiossincrasias da
sintaxe do Python quando isso me permite expressar melhor as bases de um algoritmo ou algum conceito
fundamental. Eis uma revisão rápida para aqueles que não são programadores Python:
Constutores de Lista e de Dicionário
Existe no Python um bom conjunto de tipos básicos, e dois dos que são usados com freqüência nesse
livro são listas e dicionários. Uma lista é o que o nome indica, formada de itens ordenados de
qualquer tipo e é declarada com colchetes:
number_list=[1,2,3,4]
string_list=[‘a’, ‘b’, ‘c’, ‘d’]
mixed_list=[‘a’, 3, ‘c’, 8]
Um dicionário é um conjunto de pares de identificador/valor não ordenados, similar a mapas de hashes
de outras linguagens. É declarado usando chaves:
ages={‘John’:24,’Sarah’:28,’Mike’:31}
Os elementos de dicionários e listas podem ser acessados utilizando-se colchetes após o nome do
objeto:
string_list[2]
ages[‘Sarah’]
# returns ‘b’
# returns 28
Espaços em Branco Significativos
Diferente de muitas linguagens, o Python utiliza a identação do código para definir blocos. Considere
esse trecho de código:
if x==1:
print ‘x is 1’
print ‘Still in if block’
print ‘outside if block’
O interpretador sabe que os primeiros dois comandos print são executados quando x é igual a 1
porque o código está identado. Identação pode ser com qualquer número de espaços, desde que seja
consistente. Nesse livro usamos dois espaços para isso. Quando digitar o código é preciso ser cuidadoso
para copiar corretamente a identação.
Entendimento de Lista
Um entendimento de lista é uma forma conveniente de converter uma lista em outra filtrando
valores e aplicando funções nos itens. Um entendimento de lista é declarado da seguinte forma:
[expression for variable in list]
ou
[expression for variable in list if condition]
Por exemplo, o código seguinte:
l1=[1,2,3,4,5,6,7,8,9]
print [v*10 for v in l1 if v1>4]
teria como resultado:
[50,60,70,80,90]
XIII
Entendimentos de lista são usados com freqüência nesse livro porque são formas extremamente concisas
de aplicar uma função a toda uma lista, ou um meio de remover itens inválidos. Outra forma com a
qual são usados muitas vezes é com o construtor dict:
l1=[1,2,3,4,5,6,7,8,9]
timesten=dict([(v,v*10) for v in l1])
Esse código criaria um dicionário com a lista original como valores de identificação e cada item
multiplicado por dez como valor:
{1:10,2:20,3:30,4:40,5:50,6:60,7:70,8:80,9:90}
APIs Abertas
Os algoritmos para sintetizar inteligência coletiva exigem dados de muitos usuários. Além dos de
aprendizado de máquina, esse livro discute algumas APIs Abertas de Internet (Open Web APIs - API:
interface de programação de aplicativo, Application Programming Interface). Estas são as
formas por meio das quais algumas empresas permitem que se acesse gratuitamente dados de suas
páginas de Internet utilizando um protocolo específico. Você pode, portanto escrever programas que
baixem e processem esses dados. Eles geralmente consistirão de contribuições dadas pelos usuários da
página, que podem ser filtrados para tentar intuir informações. Em alguns casos, existirá uma biblioteca
Python disponível para acessar essas APIs. Se não for o caso, é bastante simples criar interfaces
personalizadas para acessar esses dados usando as bibliotecas nativas do Python para que os dados
sejam baixados e decodificados em XML.
Eis aqui uma lista de algumas das páginas com APIs abertas que você verá nesse livro:
del.icio.us
Um aplicativo de relacionamento social onde uma API aberta permite que você baixe endereços
de Internet por um assunto ou usuário específico.
Kayak
Um site de viagens com uma API feita para que se conduzam pesquisas com relação a vôos e
hotéis.
eBay
Uma página de leilão na Internet com uma API que permite que você consulte itens que estão
atualmente sendo vendidos.
Hot or Not
Hot or Not (algo como “sensual ou não?”), um sistema de categorização e de promoção
de encontros entre pessoas com uma API para procurar por alguém e obter sua classificação e
informação demográfica.
Akismet
Uma API para filtragem de spam colaborativa.
Um enorme número de aplicativos em potencial pode ser desenvolvido ao processar dados de uma
fonte única, ao combinar dados de várias fontes, e mesmo combinar informações externas com os
dados de seus próprios usuários. A capacidade de obter dados criados por pessoas numa variedade
XIV
Programando a Inteligência Coletiva
de formas em diversas páginas de Internet é o principal elemento para criar inteligência coletiva. Um
bom ponto de partida para encontrar mais sites com APIs abertas é ProgrammableWeb (http://
www.programmableweb.com).
Visão Geral sobre os Capítulos
Cada algoritmo nesse livro foi motivado por um problema real que pode, esperamos, ser facilmente
entendido por todos os leitores. Tentamos evitar problemas que exijam uma grande quantidade
ou domínio de conhecimento e nos concentramos naqueles que, embora complexos, possam ser
reconhecidos como comuns pela maioria das pessoas.
Capítulo 1, Introdução à Inteligência Coletiva
Explica os conceitos por trás do aprendizado de máquina, como ele é aplicado em muitos campos
diferentes e como usá-lo para chegar a novas conclusões a respeito dos dados recolhidos de
muitas pessoas diferentes.
Capítulo 2, Fazendo Recomendações
Introduz as técnicas de filtragem colaborativa usadas por muitas lojas na Internet para
recomendar produtos. O capítulo inclui uma seção a respeito de recomendações de endereços
de Internet, originados de um site de relacionamento social, e uma recomendação sobre filmes,
originada de um conjunto de dados do MovieLens.
Capítulo 3, Descobrindo Grupos
Avança algumas idéias do Capítulo 2 e introduz dois métodos diferentes de agrupamento
(clustering), que servem para detectar automaticamente grupo de itens similares num grande
conjunto de dados. Esse capítulo demonstra o uso de agrupamento para descobrir grupos num
conjunto de blogs populares na Internet e para descobrir similaridades no que querem pessoas
num site de relacionamento social.
Capítulo 4, Procurando e Classificando
Descreve as várias partes de um software de busca, incluindo a aranha (crawler),
o indexador e o sistema de pesquisa. O capítulo explica o algoritmo PageRank (nota
da página) para classificar páginas baseando-se nos links que fazem referência a ela e
mostra como criar uma rede neural que aprende quais palavras-chave são associadas com
diferentes resultados.
Capítulo 5, Otimização
Introduz-se algoritmos para otimização, que são projetados para procurar milhões de soluções
possíveis para um problema e escolher a melhor delas. A ampla variedade de usos para esses
algoritmos é demonstrada com exemplos como encontrar o melhor vôo para um grupo de
pessoas viajando para um mesmo lugar, ou achar a melhor forma de distribuir estudantes em
dormitórios, ou projetar uma rede com o mínimo de linhas cruzadas.
Capítulo 6, Filtragem de Documento
Demostra a filtragem Bayesiana, que é usada em muitos filtros de spam gratuitos e
comerciais para classificar automaticamente documentos baseando-se no tipo de palavras
e outras características que apareçam neles. Isso é aplicado num conjunto de resultados de
pesquisa RSS para demonstrar classificação automática de entradas.
XV
Capítulo 7, Modelando com Árvores de Decisão
Introduz árvores de decisão como um método não apenas para fazer previsões, mas também
para modelar a forma como as decisões são tomadas. A primeira árvore de decisão é montada
com dados hipotéticos vindos de logs de servidor e é usada para prever se é provável ou não
que um usuário se tornará um assinante privilegiado. Os outros exemplos usam dados de páginas
de Internet reais para modelar preços de imóveis e para determinar “sensualidade”.
Capítulo 8, Montando Modelos de Preço
Aborda problemas de prever valores numéricos ao invés de classificações usando técnicas dos kvizinhos mais próximos (k-nearest neighbors), e aplica os algoritmos de otimização do
Capítulo 5. Esses métodos são usados em conjunto com a API do eBay para montar um sistema
de previsão de preços finais de leilão para itens, baseando-se num conjunto de propriedades.
Capítulo 9, Classificação Avançada: Métodos de Núcleo e MVSs
Mostra como Máquinas de Vetor de Suporte (MVS, Support-Vector Machines, SVM) podem
ser usadas para encontrar pares de pessoas em páginas de Internet de encontros ou quando
procurando por contatos profissionais. Máquinas de vetor de suporte são uma técnica bastante
avançada e esse capítulo as compara com outros métodos.
Capítulo 10, Encontrando Características Independentes
Introduz uma técnica relativamente nova chamada fatoração de matriz não-negativa, que é usada
para encontrar características independentes num conjunto de dados. Em muitos conjuntos de
dados os itens são composições de diversas características que não conhecemos de antemão. A
idéia nesse capítulo é detectar essas características. Essa técnica é demonstrada num conjunto
de artigos de notícias, onde as histórias em si são usadas para detectar seus temas, um ou mais
dos quais pode se aplicar a uma dada história isolada.
Capítulo 11, Inteligências Evolutivas
Introduz programação genética, um conjunto de técnicas muito sofisticadas que vai além
da otimização e na prática monta algoritmos usando idéias evolucionárias para resolver um
problema em particular. Isso é demonstrado num jogo simples onde o computador é no início
um jogador ruim que melhora sua capacidade de jogo aprimorando seu próprio código, mais e
mais conforme o jogo vai sendo executado.
Capítulo 12, Sumário os Algoritmos
Revisa todos os algoritmos de aprendizado de máquina e estatísticos descritos no livro e os
compara com relação a um conjunto de problemas fictícios. Isso vai auxiliar a entender como
eles funcionam e a visualizar a forma como cada um deles divide dados.
Apêndice A, Bibliotecas de Terceiros
Contém informações sobre bibliotecas de terceiros usadas neste livro, como onde encontrá-las
e como instalá-las.
Apêndice B, Fórmulas Matemáticas
Contém fórmulas, descrições e código para muitos dos conceitos matemáticos apresentados
no livro.
XVI
Programando a Inteligência Coletiva
Exercícios no final de cada capítulo dão idéias a respeito de formas para estender os algoritmos e os
tornar mais poderosos.
Convenções
As seguintes convenções tipográficas são usadas neste livro:
Corpo de texto
Indica títulos, opções e botões de menus e aceleradores de teclado (como Alt e Ctrl)
Itálico
Indica novos termos, URLs, endereços de email, nomes, extensões e caminhos de arquivo e
diretórios, e utilitários do Unix.
Fonte Courier New
Indica comandos, opções, chaves, variáveis, atributos, funções, tipos, classes, namespaces,
métodos, módulos, propriedades, parâmetros, valores, objetos, eventos e suas funções de
tratamento, marcações XML e HTML (tags), macros, o conteúdo de arquivos ou o resultado
de comandos.
Fonte Courier New Negrito
Mostra comandos ou outro tipo de texto que deve ser digitado de forma literal pelo usuário
Fonte Courier New Itálico
Mostra texto que deveria ser substituído com valores fornecidos pelo usuário.
Esse ícone indica uma dica, sugestão ou nota genérica.
Usando o Código de Exemplo
Este livro existe para ajudar você a realizar o seu trabalho. Em geral, você pode usar o código neste livro
em seus programas e documentação. Não precisa entrar em contato conosco para obter permissões
exceto se você estiver reproduzindo uma quantidade significativa desse código. Por exemplo, escrever
um programa que use vários trechos de código desse livro não exige que se obtenham permissões.
Vender ou distribuir um CD-ROM de exemplos originados de livros da O’Reilly exige. Responder uma
pergunta citando esse livro e mostrando código de exemplo dele não exige permissão. Incorporar
uma quantidade significativa de exemplos desse livro na sua documentação de produto exige. Nós
apreciamos, mas não exigimos que se cite a autoria. Uma citação de autoria normalmente inclui o
título, o autor, a editora e o ISBN.
Como Entrar em Contato Conosco
Por favor enviar comentários e perguntas a respeito desse livro para a editora:
Editora Alta Books
Rua Viúva Claudio, 291 - Jacaré
Rio de Janeiro - RJ
CEP 20970-031
XVII
Temos uma página para esse livro onde listamos erratas, exemplos, e qualquer informação adicional.
Você pode acessar essa página em:
http://www.altabooks.com.br
Para comentários ou perguntas técnicas a respeito do livro, envie um e-mail para:
[email protected]
Agradecimentos
Gostaria de expressar minha gratidão a todos na editora envolvidos com o desenvolvimento e a
produção deste livro. Em primeiro lugar, gostaria de agradecer Nat Torkington por me dizer que a idéia
tinha mérito e que valia a pena desenvolvê-la. Mike Hendrickson e Brian Jepson por escutarem a idéia
e me animarem em escrever o livro, e especialmente Mary O’Brien que assumiu como editora no lugar
de Brian e que sempre foi capaz de amenizar meus medos a respeito do projeto ser mais do que eu
poderia fazer.
No time de produção, eu gostaria de agradecer Marlowe Shaeffer, Rob Romano, Jessamyn Read, Amy
Thomson e Sarah Schneider por transformarem minhas ilustrações e escritos em algo que alguém
realmente pode gostar de olhar.
Agradeço a todos que tomaram parte na revisão deste livro, especialmente Paul Tyma, Matthew Russell,
Jeff Harmmerbacher, Terry Camerlengo, Andreas Weigend, Daniel Russel e Tim Wolters.
Agradeço a meus pais.
Finalmente, tenho uma dívida de gratidão com vários dos meus amigos que me ajudaram a desenvolver
idéias para esse livro e que sempre entenderam quando eu não tinha tempo para eles: Andrea Matthews,
Jeff Beene, Laura Miyakawa, Neil Stroup e Brooke Blumenstein.
Escrever este livro teria sido muito mais difícil sem sua ajuda e eu certamente teria esquecido alguma
coisa nos exemplos mais interessantes.
XVIII
Programando a Inteligência Coletiva
Download