Na última seção, introduzi vocês a um conjunto de derivações matemáticas
cujo uso visa produzir um modelo de máxima entropia
do que era essencialmente um "toy problem", que era:
como podemos modelar a distribuição do tempo de chegada de táxis em Nova York,
baseado num pequeno conjunto de dados?
E esse é um problema que pode ser de interesse pessoal
mas certamente não possui interesse científico profundo.
Na próxima seção, o que farei é
apresentar a vocês um problema razoavelmente interessante e científico
e mostrar como o método de máxima entropia
pode ilustrar algumas propriedades interessantes deste sistema.
O sistema particular que temos em mente
é o que pessoas costumam chamar de ecossistema open source.
É uma comunidade grande de pessoas dedicadas a escrever código de tal forma
que ele seja aberto, acessível, e "debugável",
e, em geral, produzido não por um indivíduo,
nem por uma corporação,
com proteções de copyright e controle sobre a origem,
mas por uma comunidade de pessoas editando e compartilhando código uns dos outros.
O ecossistema open source é algo que domina uma grande fração
do código de computador que rodamos hoje,
incluindo não só macOS X,
mas também, claro, Linux.
É uma ótima história de sucesso, e queremos estudá-la cientificamente.
Usei a palavra "ecossistema" de propósito, em parte porque muito do que falarei
é um conjunto de ferramentas e derivações que aprendi com John Harte
e pessoas que trabalharam com John Harte na abordagem de máxima entropia
aplicada não a sistemas sociais, mas sistemas biológicos,
e, em particular, ecossistemas.
Recomendo o livro de John Harte, "Maximum Entropy and Ecology",
como fonte de muito mais informações das ferramentas que irei mostrar agora.
Meu objetivo aqui é mostrar que até mesmo argumentos simples de máxima entropia
podem nos dar insights científicos bem profundos.
O que tomarei como minha fonte de dados —
pois vou estudar o mundo empírico agora —,
o que tomarei como fonte de dados foi obtido do SourceForge.
SourceForge não é mais...
o repositório mais popular de softwares open source —
talvez o Github tenha superado-o nisso —,
mas, por muito tempo, talvez desde 1999,
(e pegamos dados até 2011),
ele tem um arquivo enorme de projetos
abrangendo desde vários tipos de jogos de computador
até editores de texto e softwares de negócios e de matemática.
Parte do código que utilizei na minha pesquisa está no SourceForge.
Em particular, é ótimo para estudar o uso de linguagens de computador.
Então, o que plotei aqui é uma distribuição
de linguagens usadas na comunidade open source
e encontradas no SourceForge.
No eixo x está o log do número de projetos escritos em uma linguagem particular.
Esse "0" quer dizer 1 [escala log: 10⁰ = 1].
Na database há cerca de 12 linguagens
que possuem algo na ordem de 1 projeto.
Ou seja, são linguagens extremamente raras no movimento open source.
No outro lado dessa escala logarítmica,
em 4, então 10⁴ = 10.000,
vemos um pequeno número de linguagens extremamente populares,
Estas são as linguagens mais comuns de se encontrar no SourceForge,
elas possuem uma popularidade maior.
E se você souber um pouquinho sobre programação,
não será surpresa que são principalmente linguagens derivadas de C,
como C, C++, Java.
Ali no meio destas "aves extremamente raras"
e destes bem comuns –
que são algo como bactérias do ecossistema open source –,
ali no meio, há um grande número de linguagens moderadamente populares.
Então essa distribuição de linguagens
é o que vamos tentar explicar usando métodos de máxima entropia.
Há um pequeno número de linguagens raras,
um número maior de moderadamente populares,
e, de novo, um número pequeno de linguagens extremamente populares.
Plotei isso como uma distribuição de probabilidade,
P(n), onde n é o número de projetos,
na comunidade open source, que usa essa linguagem,
e esta é a probabilidade que sua linguagem tenha n projetos
na comunidade open source.
Queremos criar um modelo de máxima entropia
desta distribuição aqui.
Representei os mesmos dados de forma diferente agora,
assim é como tendem a representá-lo,
esta é uma distribuição de ranking de abundância,
e o que ecologistas chamam de distribuição de abundância de uma espécie.
Então a linguagem com maior ranking, o ranking 1 aqui,
é a linguagem com o maior número de projetos,
e não surpreenderá ninguém aqui que esta linguagem é Java:
há cerca de 20.000 projetos escritos em Java.
A segunda maior linguagem é C++,
logo depois vem C, e então PHP,
e as linguagens mais raras, aqui embaixo, possuem rankings bem menores,
números maiores têm menores rankings, como 2º lugar, 3º, etc.
Então o 100º lugar, aqui embaixo, no 100º lugar
está uma linguagem bem desafortunada chamada Turing,
que possui, até então, até onde achei arquivado,
somente 2 projetos escritos em Turing.
Vemos também que algumas das minhas favoritas, como Ruby,
estão aqui no meio numa zona de popularidade moderada.
Então representamos estes dados –
são os mesmos dados –, mas agora o que plotei aqui
é a log-abundância neste eixo [y],
e aqui o ranking, mas agora linear,
ao contrário daqui, onde ele estava em escala log.
Este é um plot log-log,
este é um plot log-linear agora, então temos os dados de fato.
A primeira coisa que tentaremos
é uma distribuição de máxima entropia
para abundância de linguagens,
ou seja, para a probabilidade de achar uma linguagem com n projetos.
E o que vamos fazer é restringir uma coisa somente:
a popularidade média de uma linguagem.
Essa será nossa única restrição do problema de máxima entropia,
e vamos pegar a distribuição de probabilidade P(n)
que maximize a entropia P log P
soma negativa, de 0 a ထ,
de P log P,
onde vamos maximizar essa quantidade sujeita a essa restrição,
e, claro, sempre sujeita à restrição de normalização,
que [a soma de] P(n) seja igual a 1, essa é minha outra restrição.
Claro, já sabemos como resolver esse problema,
sabemos sua forma funcional,
este é exatamente o mesmo problema que vocês aprenderam a resolver
quando modelamos o tempo de espera de táxis em Nova York,
com um modelo da mesma forma
então, assim como restringimos somente o tempo de espera médio,
aqui vamos restringir a popularidade média de uma linguagem,
popularidade sendo o número de projetos arquivados, naquela linguagem.
Então sabemos como essa forma funcional é.
Ela é algo como exp(-𝜆 n)
tudo sobre Z,
e então o que precisamos fazer é ajustar 𝜆 e Z,
para reproduzir a abundância correta que vemos nos dados.
Então essa é a distribuição de máxima entropia.
Ela é, claro, um modelo exponencial, possui uma forma exponencial,
e, se acharmos 𝜆 e Z que melhor reproduzam os dados,
ou seja, que melhor satisfaçam essa restrição,
e que tenha, ademais, máxima entropia,
então achamos isso aqui.
Essas barras vermelhas aqui são desvios de 1 e 2 sigmas
para a distribuição de ranking de abundância,
e o que quero que vejam nesse gráfico
é que isso é um péssimo ajuste a estes dados!
A distribuição de máxima entropia,
com esta restrição,
não reproduz os dados,
não é capaz de explicar,
ou de modelar, estes dados em uma maneira razoável.
Ele subestima radicalmente estas linguagens extremamente populares.
Ou seja, é incapaz de reproduzir o fato de que existam linguagens como C e Python,
que são extremamente populares.
Ela sobrestima este regime "mesoscópico",
ela sobrestima as linguagens moderadamente populares.
E também sobrestima estas "aves raras", linguagens de baixo ranking,
as que possuem bem poucos exemplos arquivados.
Então ok, isso não deu muito certo.