Aproximando a complexidade de Kolmogorov

22

Estudei algo sobre a Complexidade Kolmogorov , li alguns artigos e livros de Vitanyi e Li e usei o conceito de Distância de compressão normalizada para verificar a estilometria dos autores (identifique como cada autor escreve alguns textos e agrupa documentos por sua semelhança).

Nesse caso, os compressores de dados foram usados ​​para aproximar a complexidade de Kolmogorov, uma vez que o compressor de dados poderia ser usado como uma máquina de Turing.

Além da compressão de dados e das linguagens de programação (nas quais você escreveria algum tipo de compressor), o que mais poderia ser usado para aproximar a complexidade de Kolmogorov? Existem outras abordagens que poderiam ser usadas?

woliveirajr
fonte
Não sei se entendi sua pergunta: a definição de KC envolve máquinas de turing, cujos programas formam exemplos (com relação a algumas traduções). O que significa aproximar a complexidade de Kolmogorv "sem linguagens de programação"?
Cody
1
Comprima uma string usando qualquer software de compactação, como o GZip. O tamanho da saída é um limite superior ao KC da sequência.
M. Alaggan
@ cody: exatamente, eu usei compressores de dados em minha pesquisa (zip, bzip, ppmd) para aproximar o KC. O compressor de dados não é exatamente um programa. Então, estou procurando sugestões sobre o que poderia ser usado no KC além de idiomas (= escreva um programa em C / prolog / qualquer que seja) e compressores de dados (= use zip, gzip, ppmc, ppmd ...) :)
woliveirajr 13/09
1
Acho que me parece que a definição de um programa de compactação de dados é exatamente: um programa que aproxima o KC de uma string por um programa (o "descompressor") e outra string (a string compactada).
Cody

Respostas:

9

Eu acho que uma possível resposta à sua pergunta é esta: Tome um gerador de números pseudo-aleatórios . Tente escolher um gerador que tem alguns poderosos ataques contra ele: um ataque gerador de números aleatórios para é (para os nossos propósitos), um algoritmo que, quando dado um imput corda , determina uma semente A ( s ) , tal que G ( A ( s ) ) = s . Em seguida, aproxime o KC de s :G A sGGAs A(s)G(A(s))=ss

input: s
Compute A(s);
if |A(s)| + |G| > |s| output: |s|
otherwise output: |A(s)| + |G|

Onde é o comprimento do programa que calcula G ( s ) (geralmente bastante curto, como nos geradores lineares).|G|G(s)

Observe que, na prática, os ataques de gerador de números aleatórios não são os descritos: eles podem falhar ou produzir resultados incompletos. Nesse caso, você pode adaptar o algoritmo para que ele retorne quando o resultado do ataque é insatisfatório. A mesma observação vale para algoritmos de compactação.|s|

A ressalva dessa abordagem, em oposição aos algoritmos de compactação, é que, em geral, os algoritmos de compactação são muito mais adequados para computar o KC, pois são adaptados para trabalhar em qualquer cadeia de caracteres, enquanto um ataque só pode funcionar se estiver na imagem de G ( muito improvável ).sG

cody
fonte
7

p(x)logp(x)

É por isso que a complexidade de Kolmogorov é tão interessante, não porque é o algoritmo de compressão final (que se importa com a compressão de qualquer maneira), mas porque é o algoritmo de aprendizado final . Compactação e aprendizado são basicamente a mesma coisa: encontrar padrões nos seus dados. O quadro estatístico construído sobre essa idéia é chamado Comprimento Mínimo da Descrição e foi diretamente inspirado pela complexidade de Kolmogorov.

Veja também esta pergunta no cStheory StackExchange.

Pedro
fonte
5

a codificação gramatical é uma versão menos usada de um algoritmo de compressão e pode ser tomada como uma estimativa "aproximada" da complexidade de Kolmogorov. a codificação gramatical não é tão comumente usada como um algoritmo de compactação quanto outras abordagens mais comuns, talvez principalmente porque não melhora muito a compactação, por exemplo, Lempel-Ziv em corpus baseados em texto, mas pode funcionar bem em outros tipos de dados. a idéia é "compactar" uma string usando regras gramaticais. uma derivação gramatical pode resultar em um DAG (versus uma árvore menos complexa), portanto, é possível haver uma complexidade representacional substancial.

outra opção é encontrar circuitos menores / mínimos que representam uma string, mas isso é conhecido por ter uma complexidade de computação muito alta e pode ter sucesso apenas em strings pequenas.

K(x)

K(x)

existem também outros métodos de algoritmo de compressão além das abordagens do tipo "execução de comprimento codificado" de Lempel-Ziv, por exemplo, álgebra vetorial e SVD podem ser usados ​​como algoritmo de compressão. também transformadas de Fourier são freqüentemente usadas para compactar imagens, por exemplo, no padrão JPG.

vzn
fonte
1
K(x)
bom ponto, no entanto, algoritmos com perdas geralmente têm um parâmetro ajustável que determina "perdas" e teoricamente podem alcançar a ausência de perdas com "termos" ou "frequências" suficientes, por assim dizer, e também depende das amostras de entrada, de modo que o valor do parâmetro sem perdas depende em sua "ordem relativa vs aleatoriedade" visto através da "lente" do algoritmo de compressão ...
vzn
1
@cody e vzn: Obrigado pela resposta, você me deu algumas boas idéias para o meu doutoramento sobre lossless x lossy compressão :)
woliveirajr
JPEG usa DCT, não DFT.
Mal