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.