Medição de entropia / informação / padrões de uma matriz binária 2D


53

Quero medir a entropia / densidade da informação / semelhança de padrão de uma matriz binária bidimensional. Deixe-me mostrar algumas fotos para esclarecimentos:

Essa exibição deve ter uma entropia bastante alta:

A)

insira a descrição da imagem aqui

Isso deve ter entropia média:

B)

insira a descrição da imagem aqui

Finalmente, essas imagens devem ter entropia quase zero:

C)

insira a descrição da imagem aqui

D)

insira a descrição da imagem aqui

E)

insira a descrição da imagem aqui

Existe algum índice que captura a entropia, resp. a "semelhança de padrão" dessas telas?

Obviamente, cada algoritmo (por exemplo, algoritmos de compressão; ou o algoritmo de rotação proposto por ttnphns ) é sensível a outros recursos da tela. Eu estou procurando um algoritmo que tenta capturar as seguintes propriedades:

  • Simetria rotacional e axial
  • A quantidade de armazenamento em cluster
  • Repetições

Talvez mais complicado, o algoritmo pode ser sensível às propriedades do " princípio da Gestalt " psicológico , em particular:

  • A lei da proximidade: lei da proximidade
  • A lei da simetria: as imagens simétricas são percebidas coletivamente, mesmo apesar da distância:simetria

Os monitores com essas propriedades devem receber um "baixo valor de entropia"; telas com pontos aleatórios / não estruturados devem receber um "alto valor de entropia".

Estou ciente de que provavelmente nenhum algoritmo único capturará todos esses recursos; portanto, sugestões de algoritmos que tratam apenas de alguns ou mesmo de um único recurso também são bem-vindas.

Em particular, estou procurando algoritmos concretos existentes ou idéias específicas e implementáveis (e concederei a recompensa de acordo com esses critérios).


Pergunta legal! Posso perguntar, porém, o que motiva a necessidade de uma única medida? Suas três propriedades (simetria, agrupamento e repetições) na face delas parecem independentes o suficiente para justificar medidas separadas.
Andy W

Até agora, estou um pouco convencido de que você pode encontrar um algo universal que implementa o princípio da gestalt. Este último baseia-se majoritariamente no reconhecimento de protótipos preexistentes. Sua mente pode ter isso, mas seu computador pode não ter.
precisa saber é o seguinte

Eu concordo com vocês dois. Na verdade, eu não estava procurando por um único algoritmo - embora minha redação anterior realmente sugerisse isso. Atualizei a pergunta para permitir explicitamente algoritmos para propriedades únicas. Talvez alguém tem também ideias sobre como combinar a saída de múltiplas algos (por exemplo, "sempre ter o menor valor de entropia do conjunto de algos")
Felix S

11
A recompensa acabou . Obrigado a todos os colaboradores e às excelentes ideias! Essa recompensa gerou várias abordagens interessantes. Várias respostas contêm muito trabalho cerebral, e às vezes é uma pena que recompensas não possam ser divididas. Por fim, decidi conceder a recompensa ao @whuber, pois sua solução era o algoritmo que me pareceu o mais abrangente sobre os recursos que captura e como é fácil de implementar. Também aprecio que tenha sido aplicado aos meus exemplos concretos. O mais impressionante foi a capacidade de atribuir números na ordem exata do meu "ranking intuitivo". Obrigado, F
Felix S

Respostas:


35

Existe um procedimento simples que captura toda a intuição, incluindo os elementos psicológicos e geométricos. Ele se baseia no uso da proximidade espacial , que é a base da nossa percepção e fornece uma maneira intrínseca de capturar o que é imperfeitamente medido por simetrias.

Para fazer isso, precisamos medir a "complexidade" dessas matrizes em escalas locais variadas. Embora tenhamos muita flexibilidade para escolher essas escalas e escolher o sentido em que medimos a "proximidade", é simples e eficaz o suficiente para usar pequenos bairros quadrados e observar as médias (ou, equivalentemente, somas) dentro deles. Para esse fim, uma sequência de matrizes pode ser derivada de qualquer matriz por , formando somas de vizinhança em movimento usando por vizinhanças, depois por , etc., até por (embora normalmente haja poucos valores para fornecer algo confiável).mnk=2233min(n,m)min(n,m)

Para ver como isso funciona, vamos fazer os cálculos para as matrizes na pergunta, que chamarei de a , de cima para baixo. Aqui estão gráficos das somas móveis para ( é a matriz original, é claro) aplicada a .a1a5k=1,2,3,4k=1a1

figura 1

No sentido horário, no canto superior esquerdo, é igual a , , e . As matrizes são por , depois por , por e por , respectivamente. Todos eles parecem meio "aleatórios". Vamos medir essa aleatoriedade com sua entropia de base 2. Para , a sequência dessas entropias é . Vamos chamar isso de "perfil" de .k124355442233a1(0.97,0.99,0.92,1.5)a1

Aqui, ao contrário, estão as somas móveis de :a4

Figura 2

Para há pouca variação, de onde baixa entropia. O perfil é . Seus valores são consistentemente inferiores aos de , confirmando a sensação intuitiva de que existe um forte "padrão" presente em .k=2,3,4(1.00,0,0.99,0)a1a4

Precisamos de um quadro de referência para interpretar esses perfis. Uma matriz perfeitamente aleatória de valores binários terá quase metade dos seus valores iguais a e a outra metade igual a , para uma entropia de . As somas móveis dentro de por vizinhanças tendem a ter distribuições binomiais, fornecendo entropias previsíveis (pelo menos para matrizes grandes) que podem ser aproximadas por :011kk1+log2(k)

Gráfico de entropia

Esses resultados são confirmados por simulação com matrizes de até . No entanto, eles quebram em pequenas matrizes (tais como os por matrizes aqui), devido à correlação entre janelas vizinhas (uma vez que o tamanho da janela é de cerca de metade das dimensões da matriz) e devido à pequena quantidade de dados. Aqui está um perfil de referência de matrizes aleatórias de por geradas por simulação, juntamente com gráficos de alguns perfis reais:m=n=1005555

Gráficos de perfil

Nesta plotagem, o perfil de referência é azul sólido. Os perfis da matriz correspondem a : vermelho, : ouro, : verde, : azul claro. (Incluir obscureceria a imagem porque ela se aproxima do perfil de .) No geral, os perfis correspondem à ordem na pergunta: eles ficam mais baixos no máximo em valores de medida que a ordem aparente aumenta. A exceção é : até o final, para , suas somas móveis tendem a ter entre as entropias mais baixas . Isso revela uma regularidade surpreendente: a cada por bairroa1a2a3a4a5a4ka1k=422a1 tem exatamente ou quadrados pretos, nunca mais ou menos. É muito menos "aleatório" do que se poderia pensar. (Isso ocorre em parte devido à perda de informações que acompanham a soma dos valores em cada vizinhança, um procedimento que condensa configurações possíveis de vizinhança em apenas somas possíveis. Se quisermos explicar especificamente para o agrupamento e orientação dentro de cada bairro, em seguida, em vez de usar somas móveis usaríamos concatenations em movimento. Ou seja, cada por bairro tem122k2k2+1kk2k2possíveis configurações diferentes; Ao distinguir todos eles, podemos obter uma medida mais fina da entropia. Eu suspeito que essa medida elevaria o perfil de comparação com as outras imagens.)a1

Essa técnica de criar um perfil de entropias em uma escala controlada de escalas, somando (ou concatenando ou combinando de outra forma) valores dentro de bairros em movimento, tem sido usada na análise de imagens. É uma generalização bidimensional da conhecida idéia de analisar o texto primeiro como uma série de letras, depois como uma série de dígitos (sequências de duas letras), depois como trigramas, etc. Também possui algumas relações evidentes com o fractal análise (que explora propriedades da imagem em escalas cada vez mais finas). Se tomarmos o cuidado de usar uma soma móvel de blocos ou concatenação de blocos (para que não haja sobreposições entre janelas), é possível derivar relacionamentos matemáticos simples entre as entropias sucessivas; Contudo,

São possíveis várias extensões. Por exemplo, para um perfil invariavelmente rotacional, use vizinhanças circulares em vez de quadradas. Tudo generaliza além de matrizes binárias, é claro. Com matrizes suficientemente grandes, é possível computar perfis de entropia com variação local para detectar não estacionariedade.

Se um número único for desejado, em vez de um perfil inteiro, escolha a escala na qual a aleatoriedade espacial (ou a falta dela) é interessante. Nestes exemplos, que escala corresponderia melhor para um por ou por bairro em movimento, porque para a sua padronização todos eles dependem de agrupamentos que período de três a cinco células (e um por vizinhança apenas médias distância toda variação na matriz e por isso é inútil). Na última escala, as entropias de a são , , , e3 4 4 5 5 a 1 a 5 1,50 0,81 0 0 0 1,34 a 1 a 3 a 4 a 5 0 3 3 1,39 0,99 0,92 1,77334455a1a51.500.81000 ; a entropia esperada nessa escala (para uma matriz uniformemente aleatória) é . Isso justifica a sensação de que "deve ter entropia bastante alta". Para distinguir , e , que estão amarrados com entropia nessa escala, observe a próxima resolução mais fina ( por vizinhanças): suas entropias são , , , respectivamente (enquanto uma grade aleatória é esperada). tem um valor de ). Por essas medidas, a pergunta original coloca as matrizes exatamente na ordem correta.1.34a1a3a4a50331.390.990.921.77


Sinto muito, eu não conseguia entender como você produziu seus gráficos de somas em movimento. Por favor, explique com mais detalhes como calcular a soma móvel.
ttnphns

11
@ttnphns Aqui está uma página de ajuda ilustrada popular sobre o tópico.
whuber

4
Reproduzi os resultados desta excelente resposta do @whuber usando NumPy e matplotlib em Python, disponível aqui: github.com/cosmoharrigan/matrix-entropy
Cosmo Harrigan

(+1) Aqui está um princípio muito geral: com qualquer multiset , existe a entropia naturalmente associada da distribuição de probabilidade determinada pelas multiplicidades de seus elementos distintos , ou seja, , em que é o conjunto de elementos distintos em . Exemplos são multisets formados por vizinhanças de tamanho de várias formas em objetos de várias dimensões. (Acabei de publicar uma aplicação 1D para comprimento- substrings .)Mμ(e)ep(e):=μ(e)eSμ(e)  (eS)SMkk
res

Excelente resposta. Embora faça sentido intuitivo, existe um artigo ou livro que se possa citar para a derivação original disso (estou assumindo que, se esse é seu trabalho original, você o publicou formalmente em um periódico)?
Subhacom 19/09/19

10

Primeiro, minha sugestão é puramente intuitiva: não sei nada no campo de reconhecimento de padrões. Segundo, dezenas alternativas de sugestões como a minha podem ser feitas.

Começo com a ideia de que uma configuração regular (isto é, com baixa entropia) deve ser de alguma forma simétrica, isomórfica a este ou aquele seus tranformantes. Por exemplo, em rotações.

Você pode girar (mude para 90 graus, que 180 graus, etc) sua matriz até que a configuração coincida com a original . Ele sempre concorre com 4 rotações (360 graus), mas às vezes pode concorrer mais cedo (como a matriz E na figura).

Em cada rotação, conte o número de células com valores não idênticos entre a configuração original e a girada. Por exemplo, se você comparar a matriz A original com sua rotação de 90 graus, descobrirá 10 células em que há um ponto em uma matriz e em branco na outra matriz. Em seguida, compare a matriz original com sua rotação de 180 graus: 11 dessas células serão encontradas. 10 células é a discrepância entre a matriz original A e sua rotação de 270 graus. 10 + 11 + 10 = 31, é a "entropia" global de matriz Uma .

Para a matriz B, a "entropia" é 20, e para a matriz E , apenas 12. Para as matrizes C e D, a "entropia" é 0 porque as rotações param depois de 90 graus: o isomorfismo já foi alcançado.

insira a descrição da imagem aqui


Obrigado por sua sugestão! Embora eu pudesse pensar em várias exibições "fáceis" que não são invariáveis ​​a uma transformação de rotação, essa é uma abordagem agradável e fácil (e expansível!). Eu tenho que pensar sobre que tipo de transformação eu gostaria de ter. E eu gosto da sua abordagem de contar pontos em cada transformação.
Felix S

Obrigado pela apreciação. Mas a abordagem é apenas um esboço inicial, uma ideia geral, e você está certo ao dizer que é expansível.
ttnphns

Eu gosto da sua abordagem. Entretanto, para obter uma resposta mais geral, pode valer a pena um grupo de simetria um pouco maior - identidade, 3 rotações e 4 reflexões (por exemplo , , en.wikipedia.org/wiki/Dihedral_group ). Em seguida, conte as diferenças ( ) entre todos os pares (ou seja, ) e como uma medida de aleatoriedade , onde é o número de pedras negras. Para formas puramente aleatórias, deve-se obter , enquanto que para simetricamente . O bom é que a fórmula para é válida para um número diferente de pedras no tabuleiro e possui a simetria de BW. D4d87r=k187252n(25n))nr1r0r
Piotr Migdal

Desculpe por complicar demais. Basta comparar os padrões originais com suas simetrias diferentes da identidade. Então, no fator de normalização, há vez de . 7778
Piotr Migdal 26/10

5

A informação é geralmente definida como . Existe uma teoria interessante que explica que é a quantidade de bits que você precisa codificar usando . Se você quiser saber mais sobre isso, leia sobre codificação aritmética .h(x)=logp(x)log2p(x)xp

Então, como isso pode resolver seu problema? Fácil. Encontre um que represente seus dados e use que é uma nova amostra como uma medida de surpresa ou informação sobre como encontrá-los.plogp(x)x

O difícil é encontrar algum modelo para gerar seus dados. Talvez você possa criar um algoritmo que gere matrizes que você considere 'provável'.p

Algumas idéias para montagem .p

  1. Se você estiver olhando apenas matrizes 5x5, precisará de apenas bits para armazenar todas as matrizes possíveis, para que você possa apenas enumerar todas elas e atribuir uma certa probabilidade a cada uma.225
  2. Use uma máquina Boltzmann restrita para ajustar seus dados (então você teria que usar a energia livre como substituto da informação, mas tudo bem),
  3. Use zip como substituto de e não se importe com toda a história de probabilidade de cima. É formalmente aceitável, porque você usa o zip como uma aproximação à complexidade de Kolmogorov e isso foi feito por teóricos da informação, levando à distância de compressão normalizada ,logp(x)
  4. Talvez use um modelo gráfico para incluir crenças espaciais anteriores e use variáveis ​​de Bernoulli localmente.
  5. Para codificar invariância translacional, você pode usar um modelo baseado em energia usando uma rede convolucional .

Algumas das idéias acima são bastante pesadas e vêm do aprendizado de máquina. Caso deseje receber mais conselhos, basta usar os comentários.


Evidentemente, a entropia de Kolmogorov é a melhor abordagem, em um sentido filosófico, se você pensa em "simplicidade de padrão abstrato" e não está tentando prever como isso resultará simples para a mente humana. Simplesmente declara a entropia como a "duração do programa mais curto que pode produzir esse padrão". Obviamente, você ainda precisa especificar a linguagem do computador, mas ainda pode contar com uma máquina de Turing abstrata para fazer o truque.
Javier Rodriguez Laguna

Linguagem de programação não é realmente importante. Uma parte adicional do programa que compila da linguagem A para a linguagem B terá um aumento constante de bits (o compilador) e, portanto, pode ser negligenciada.
bayerj

4

Minha proposta a seguir é bem mais perspicaz do que deduzida, portanto não posso provar isso, mas pelo menos posso oferecer alguma justificativa. O procedimento de avaliação da "entropia" da configuração dos pontos inclui:

  1. Digitalize pontos.
  2. Realize a comparação da configuração consigo mesma permutada, muitas vezes, pela análise ortogonal de Procrustes .
  3. Plote os resultados das comparações (coeficiente de identidade) e avalie a irregularidade do gráfico.

Digitalize os pontos , ou seja, tome suas coordenadas. Por exemplo, abaixo está sua configuração D com pontos numerados (a ordem de numeração pode ser arbitrária) e suas coordenadas. insira a descrição da imagem aqui

spot x   y
1   1   1
2   3   1
3   5   1
4   2   2
5   4   2
6   1   3
7   3   3
8   5   3
9   2   4
10  4   4
11  1   5
12  3   5
13  5   5

Faça permutações e realize análises de Procrustes. Permuta pontos (linhas nos dados) aleatoriamente e faça a comparação Procrustes dos dados originais (não permitidos) com os permutados; registre o coeficiente de identidade (medida de similaridade das duas configurações, produzido pela análise). Repita a permutação - Procrusta - economizando o coeficiente várias vezes (por exemplo, 1000 vezes ou mais).

O que podemos esperar dos coeficientes de identidade (IDc) obtidos após a operação acima em uma estrutura regular ?Considere, por exemplo, a configuração D. acima. Se compararmos as coordenadas originais definidas consigo, obteremos IDc = 1, é claro. Mas se permutarmos alguns pontos, o IDc entre o conjunto original e o permutado terá algum valor abaixo de 1. Permitamos, apenas por exemplo, um par de pontos, rotulados 1 e 4. IDc = 0,964. Agora, em vez disso, permita os pontos 3 e 5. Curiosamente, o IDc será 0,964 novamente. O mesmo valor, por quê? Os pontos 3 e 5 são simétricos para 1 e 4, de modo que a rotação a 90 graus os sobrepõe. A comparação de procrustes é insensível à rotação ou reflexão e, portanto, a permutação no par 1-4 é "igual" à permutação no par 5-3, para ele. Para adicionar mais exemplo, se você permitir apenas os pontos 4 e 7, o IDc será novamente 0,964! Parece que, para Procrustes, a permutação no par 4-7 é a "mesma" como os dois acima, no sentido de fornecer o mesmo grau de similaridade (conforme medido pelo IDc). Obviamente, tudo isso ocorre porque a configuração D é regular.Para uma configuração regular, esperamos obter valores bastante discretos de IDc em nosso experimento de permutação / comparação; enquanto que para configuração irregular, esperamos que os valores tendam a ser contínuos.

Plote os valores de IDc registrados. Por exemplo, classifique os valores e faça o gráfico de linhas. Eu fiz o experimento - 5000 permutações - com cada uma de suas configurações A, B (ambas bastante irregulares), D, E (ambas regulares) e aqui está o gráfico de linha:

insira a descrição da imagem aqui

Observe quanto mais irregulares são as linhas D e E (especialmente D). Isto é devido à discrição dos valores. Os valores para A e B são muito mais contínuos. Você pode escolher algum tipo de estatística que calcule o grau de discrição / continuidade, em vez de plotar. A parece não ser mais contínuo que B (para você, a configuração A é um pouco menos regular, mas meu gráfico de linhas parece não demonstrá-lo) ou, se não, talvez mostre um pouco outro padrão de valores IDc. Que outro padrão? Isso está além do escopo da minha resposta ainda. A grande questão é se A é de fato menos regular que B: pode ser para seus olhos, mas não necessariamente para a análise Procrustes ou para os olhos de outra pessoa.

A propósito, toda a permutação / Procrustes experimentei muito rapidamente. Usei minha própria macro de análise Procrustes para o SPSS (encontrada na minha página da web) e adicionei algumas linhas de código para fazer permutações.


3

A informação mútua, considerando cada dimensão como uma variável aleatória, portanto cada matriz como um conjunto de pares de números, deve ajudar em todos os casos, exceto em C, onde não tenho certeza do resultado.

Veja a discussão em torno da Fig 8 (começando na p24) sobre análise de desempenho de regressão no manual do TMVA ou na entrada arxiv correspondente .

Métricas diferentes para diferentes distribuições


Estou com problemas para abrir o documento vinculado.
ttnphns

Adicionado um link alternativo. Mas o primeiro funciona para mim (apenas testado).
adavid 25/10/11

3

Em vez de observar as propriedades globais do padrão (como simetrias), pode-se dar uma olhada nas locais, por exemplo, o número de vizinhos que cada pedra (= círculo preto) possui. Vamos denotar o número total de pedras por .s

Se as pedras foram jogadas aleatoriamente, a distribuição dos vizinhos é que é a densidade das pedras. O número de lugares depende se uma pedra estiver no interior ( ), na borda ( ) ou no canto .

Prand,p(k neighbors|n places)=(nk)pk(1p)nk,
p=s/25nn=8n=5(n=3)

É claramente visível que a distribuição de vizinhos em C) , D) e E) está longe de ser aleatória. Por exemplo, para D) todas as pedras interiores têm exatamente vizinhos (opostos à distribuição aleatória, que rende em vez de medido ).4(0%,2%,9%,20%,27%,24%,13%,4%,0%)(0%,0%,0%,0%,100%,0%,0%,0%,0%)

Portanto, para quantificar se um padrão é aleatório, você precisa comparar sua distribuição de vizinhos e compará-la com uma aleatória . Por exemplo, você pode comparar suas médias e variações.Pmeasured(k|n)Prand,p(k|n)

Como alternativa, é possível medir suas distâncias nos espaços funcionais, por exemplo: onde é a razão medida de pontos com espaços adjacentes e é o previsto para um padrão aleatório, ou seja, , e .

n={3,5,8}k=0n[Pmeasured(k|n)Pmeasured(n)Prand,p(k|n)Prand,p(n)]2,
Pmeasured(n)nPrand,p(n)Prand,p(3)=4/25Prand,p(5)=12/25Prand,p(8)=9/25

2

Existe uma maneira realmente simples de conceituar o conteúdo de informações que remonta à idéia de Shannon (admitidamente unidimensional) usando probabilidades e probabilidades de transição para encontrar uma representação menos redundante de uma sequência de texto. Para uma imagem (neste caso particular, uma imagem binária definida em uma matriz quadrada), podemos reconstruir exclusivamente a partir de um conhecimento das derivadas x e y (-1,0, + 1). Podemos definir uma probabilidade de transição 3x3 e uma função de densidade de probabilidade global, também 3x3. A informação de Shannon é então obtida a partir da fórmula clássica de soma logarítmica aplicada sobre 3x3. Esta é uma medida de informações de Shannon de segunda ordem e captura bem a estrutura espacial no pdf 3x3.

Essa abordagem é mais intuitiva quando aplicada a imagens em escala de cinza com mais de 2 níveis (binários), consulte https://arxiv.org/abs/1609.01117 para obter mais detalhes.


1

Ao ler isso, duas coisas vêm à mente. A primeira é que muitas das propriedades da gestalt são bastante difíceis de prever, e muito trabalho no nível de doutorado é utilizado para tentar descobrir modelos de como os agrupamentos ocorrem. Meu instinto é que as regras mais fáceis que você pode imaginar acabarão com exemplos contrários.

Se você pode deixar de lado a descrição dos agrupamentos da gestalt por enquanto, acho que uma abstração útil é pensar na sua entrada como um caso especial de uma imagem. Existem muitos algoritmos na visão computacional que visam atribuir uma assinatura a uma imagem com base em um conjunto de recursos que são invariáveis ​​em escala e invariantes em termos de escala. Eu acho que os mais conhecidos são os recursos do SIFT:

http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

Basicamente, sua saída será um novo vetor que fornece os pesos para esses recursos. Você pode usar esse vetor e aplicar uma heurística a ele (encontrar a norma, talvez) e torcer para que ele descreva o que você está procurando. Como alternativa, você pode treinar um classificador para usar o vetor de característica como entrada e apenas dizer qual é a sua impressão sobre sua 'entropia'. A vantagem disso é que ele usará os recursos SIFT apropriados (que são definitivamente um exagero para o seu problema) e criará algum tipo de mapeamento que pode muito bem ser apropriado. A desvantagem é que você precisa fazer muito disso rotulando a si mesmo, e o que obtém pode ser mais difícil de interpretar, dependendo do classificador usado.

Espero que isto seja útil! Muitos algoritmos tradicionais de visão por computador também podem ser apropriados para você aqui - uma rápida navegação pela wikipedia nesse portal pode fornecer algumas informações adicionais.


0

Seus exemplos me lembram as tabelas da verdade da álgebra booleana e dos circuitos digitais. Nesse domínio, os mapas de Karnaugh (http://en.wikipedia.org/wiki/Karnaugh_map) podem ser usados ​​como uma ferramenta para fornecer a função booleana mínima para expressar toda a grade. Como alternativa, o uso de identidades de álgebra booleana pode ajudar a reduzir a função para sua forma mínima. Contar o número de termos na função booleana minimizada pode ser usado como sua medida de entropia. Isso fornece simetria vertical e horizontal junto com a compressão de vizinhos adjacentes, mas falta simetria diagonal.

Usando álgebra booleana, os dois eixos são rotulados de AE ​​começando no canto superior esquerdo. Dessa maneira, o exemplo C seria mapeado para a função booleana (! A &! E). Para outros exemplos, os eixos precisariam ser rotulados separadamente (ou seja, AE, FJ).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.