Na parte anterior, nós demonstramos que um modelo ingênuo de máxima entropia
para a distribuição de abundância de linguagens,
para descrever quão popular uma linguagem é, onde popularidade é
quantas vezes aquela linguagem foi usada no arquivo "open source".
Aquele modelo, que toma a seguinte forma funcional,
e que restringe o valor esperado de abundância das linguagens,
que restringe somente o número médio de vezes que uma linguagem é usada
no arquivo, em relação a todas linguagens.
Este modelo de máxima entropia fracassa totalmente
em reproduzir os dados que vemos.
Ele subestima as linguagens populares,
e sobrestima as linguagens menos populares.
Este é o modelo de melhor ajuste, obtido quando encontro lambda e Z
para conseguir o valor correto de restrição
que vemos nos dados.
Então façamos o seguinte: consideremos um modelo mais rico --
e com "modelo", digo distribuição de probabilidade --
e esta distribuição tentará explicar
não somente a popularidade das linguagens,
mas também o tempo dedicado a elas, o tempo de programação dedicado a elas.
Então n aqui é, como antes,
o número de projetos
que aparecem em dada linguagem,
e este 𝜖 significa o tempo
dedicado por projeto.
Pense neste 𝜖 como um modelo referente à eficiência da linguagem,
e este n como um modelo da popularidade da linguagem.
Algumas linguagens, por exemplo,
são extremamente populares e extremamente eficientes,
então possuem n grande e 𝜖 pequeno.
Outras linguagens podem ser não tão populares
e talvez menos eficientes
(ou seja, requerem maior tempo de programação),
e, claro, podem haver linguagens extremamente eficientes
mas profundamente impopulares, e vice-versa.
A intuição aqui é de tentar descrever duas coisas ao mesmo tempo.
Antes tentamos criar um modelo que incluía somente uma variável, popularidade.
Agora estamos tentando criar um modelo com duas variáveis,
popularidade e eficiência
(ou tempo dedicado por projeto).
Então, o que faremos agora é restringir duas quantidades:
como antes, vamos restringir o número médio de projetos,
e agora vamos restringir também
a quantidade média de tempo de programação
dedicado a uma linguagem.
A ideia é que há uma força intrínseca
que mantém constante o número de projetos de cada linguagem.
Existem coisas como
fatores sociais de larga escala, ou um conjunto de fatores sociais,
que fixam o número médio de projetos,
e que também restringem a quantidade média de tempo de programação
dedicada a uma linguagem particular.
Coloquemos isso numa distribuição de máxima entropia,
para este modelo de dois parâmetros.
Vamos restringir n, então sabemos que...
temos um termo do tipo exp(-𝜆₁ n), como antes,
e agora temos também um termo na exponencial
que parece com 𝜆₂ —
𝜆₂ o segundo multiplicador de Lagrange —
𝜆₂ n 𝜖
e, claro, com um fator geral de normalização, Z.
Então a única coisa que pode parecer "misteriosa" aqui
é de onde conseguimos esse segundo termo.
Sabemos de onde veio esse aqui,
mas por que isso?
Então agora vou relembrá-los brevemente
como conseguimos essas formas funcionais.
Fizemos a derivada
da função que queremos maximizar, a entropia,
e agora temos três restrições:
temos a restrição
sobre o número médio de projetos
aquela restrição g₁,
g₁(p) = c;
temos a restrição [g]₂,
sobre este termo aqui,
g₂(p) = c',
e, finalmente, temos a restrição de normalização geral,
g₃(p).
(Vou escrever aqui.)
g₁(p) = ...
e g₂(p) ...
Então g₁(p) é o número médio de linguagens,
ou o número médio de projetos para uma dada linguagem,
isso é [soma de] P(n) n,
e podemos escrevê-lo em termos da distribuição conjunta,
como P(n, 𝜖) * n,
e agora somamos não só sobre todos valores de n,
mas também integramos sobre todos valores de tempo de programação, 𝜖.
g₂(p) fica bem similar,
mas agora restringimos não só n, mas n vezes 𝜖,
então temos que integrar sobre 𝜖 e somar sobre todos os valores de [n],
e é assim que fica nossa equação,
assim fica nossa restrição
para essa segunda quantidade.
Agora, quando tomamos a derivada de g₁ com respeito a p_[i],
sabemos como isso fica:
fica como 𝜆₁ vezes n, [i = n]
e quando tomamos a derivada [de g₂] com relação a p_i,
tudo sai, exceto
𝜆₂ n 𝜖;
e, finalmente, g₃
é só uma restrição sobre a normalização geral:
ela diz que,
quando integro sobre todos os 𝜖's e somo sobre todos os n's, dá 1.
Então, quando tomo a derivada disso com relação a p[_i],
resta 𝜆₃ vezes 1.
No outro lado aqui,
a derivada da entropia com respeito a p_i,
é igual a -log p_i...
- 1.
Quando rearranjo isso, tenho p_i proporcional a
exp(-𝜆₁ n - 𝜆₂ n 𝜖)
Todo o resto pode ser fatorado em alguma normalização geral.
Então é daqui que vem essa forma funcional,
e é um princípio geral, na prática,
que, se você quer ver o que
a distribuição de máxima entropia está restringindo, olhe termo a termo
dentro da exponencial para achá-las.
O que temos agora
é a seguinte forma funcional
para a distribuição conjunta de popularidade
e eficiência de linguagem.
Vou fazer mais uma coisa,
que é tentar recuperar
a distribuição marginal original,
P(n), ao integrar
a distribuição conjunta [P(n, 𝜖)] em relação a 𝜖.
Então o que fiz foi criar um modelo
mais sofisticado, com duas restrições:
restrição do número médio de projetos
e tempo médio de programação dedicado a uma dada linguagem.
O que vou fazer agora é integrar fora essa variável oculta.
Se eu fizer essa integral,
o que consigo é isso:
ainda tenho o fator exp(-𝜆₁ n),
vou chamá-lo de λ'.
Ainda tenho o fator de 1/Z,
e só preciso fazer a seguinte integral
de exp(-𝜆₂ n 𝜖) d𝜖,
e isso é igual a
exp(-λ_2 n ε) / (-λ_2 n),
com integral indo de 0 a ∞.
Então, quando coloco esses termos aqui,
minha forma funcional final
(de novo, não ligo para todas essas multiplicações
então estou transformando Z em Z' para absorvê-las),
a forma funcional final parece com uma exponencial em cima,
dividida por n.
Então minha nova forma funcional
para abundância de linguagens, é modificada.
Antes, só para lembrá-los,
antes, quando fizemos MaxEnt,
restringindo somente o número médio de projetos,
minha distribuição de popularidade parecia com uma exponencial,
e percebemos que era um péssimo ajuste,
é esse ajuste daqui.
Mas agora, o que fizemos foi
criar uma distribuição conjunta com duas restrições,
uma das restrições é a mesma, a outra é uma restrição nova
que involve uma variável oculta, eficiência de programação,
e quando integro fora essa variável oculta,
consigo uma nova forma funcional
para popularidade.
Em particular, vemos que ela é proporcional a exp(-λ n) / n.
Essa distribuição se chama
log-série de Fisher [Fisher's Log-series].
Então essa é a forma funcional que conseguimos ao integrar fora
essa variável oculta, eficiência de programação.
E o que podemos ver agora
é que essa distribuição é um modelo bem melhor para popularidade.
E o que fizemos aqui,
só para ser claro,
é postular uma restrição adicional
envolvendo uma variável oculta que não conseguimos ver,
e integramos fora essa variável oculta.
O que deveria impressioná-los
é o fato, não só de conseguirmos um bom ajuste,
mas também pelos mecanismos subjacentes
que o modelo MaxEnt está sugerindo.
Ele está sugerindo que duas coisas são restritas:
linguagens tendem a não serem tão populares,
em média,
há algum limite do quão popular uma linguagem chega a ser,
em média;
disso vem essa restrição aqui.
Mas também tem um limite
de quanto tempo, ou esforço, pode ser dedicado
a projetos em uma dada linguagem,
e isso é essa restrição aqui.
Então o que acontece é que
essas linguagens aqui em cima
podem tornar-se mais populares
pois não tomam tanto tempo de programação por projeto.
Estas, na linguagem de um ecólogo,
estas são espécies muito abundantes com necessidades metabólicas bem baixas.
Então agora podemos reproduzir estas linguagens muito populares,
podemos explicá-las adequadamente, ou prever adequadamente,
que precisamos ter algumas linguagens muito populares,
como C e C++ e Java.
E também conseguimos explicar por que
a popularidade dessas linguagens na cauda são menores
do que o esperado por um modelo exponencial:
presumivelmente,
muitas destas linguagens são associadas a menores eficiências, ou ε's bem altos,
ou seja, com um tempo maior de tempo dedicado por projeto nestas linguagens.
Intuitivamente, programando em Java,
esta é uma linguagem com eficiência bem alta comparada com Haskell,
que é uma linguagem profundamente bela, mas que não associamos a eficiência
e bibliotecas rápidas para parsing de páginas HTML.
Então, ao postular a existência dessa variável oculta,
e usando um argumento de máxima entropia,
podemos começar a reproduzir os dados
e parece que estamos começando a falar sobre restrições importantes ao sistema.
Então isso deveria ser impressionante, em parte pois é mais profundo
que os resultados obtidos no caso dos táxis.
No caso dos táxis, pegamos uma restrição particular,
e calhou de corresponder a um modelo mecanístico bem simples.
Você poderia dizer:
"Eu poderia bolar esse modelo mecanístico por conta própria, muito obrigado!"
Aqui, o que fizemos foi postular um conjunto de restrições
que são cientificamente substanciais:
a primeira restrição diz que restringimos o número médio de projetos,
o movimento open source pode fazer o que bem quiser
desde que mantenha fixo o número de projetos por linguagem.
Pessoas estão fazendo decisões —
de fato, fazendo decisões numa forma maximamente desorganizada,
essa é a hipótese de máxima entropia —,
de tal forma que preservem esta quantidade aqui em média.
Além disso,
a comunidade open source, por algum método cognitivo de grupo que seja
presume-se que por um monte de diferentes processos interagentes,
também preserva a quantidade média
de tempo de programação dedicado a uma linguagem particular.