Approssimazione della complessità di Kolmogorov


22

Ho studiato qualcosa sulla complessità di Kolmogorov , ho letto alcuni articoli e libri di Vitanyi e Li e ho usato il concetto di distanza di compressione normalizzata per verificare la distanza degli autori (identificare come ciascun autore scrive alcuni testi e documenti di gruppo in base alla loro somiglianza).

In tal caso, i compressori di dati sono stati utilizzati per approssimare la complessità di Kolmogorov, poiché il compressore di dati poteva essere usato come una macchina di Turing.

Oltre alla compressione dei dati e ai linguaggi di programmazione (in cui scrivere un qualche tipo di compressore), cos'altro si potrebbe usare per approssimare la complessità di Kolmogorov? Ci sono altri approcci che potrebbero essere utilizzati?


Non sono sicuro di aver capito la tua domanda: la definizione di KC coinvolge macchine di turing, di cui i programmi formano esempi (rispetto ad alcune traduzioni). Che cosa significa approssimare la complessità di Kolmogorv "senza linguaggi di programmazione"?
codice

1
Comprimi una stringa usando qualsiasi software di compressione, come GZip. La dimensione dell'output è un limite superiore al KC della stringa.
M. Alaggan,

@cody: esattamente, ho usato i compressori di dati nella mia ricerca (zip, bzip, ppmd) per approssimare KC. I compressori di dati non sono esattamente programmi. Quindi, sto cercando suggerimenti su cosa potrebbe essere usato in KC oltre alle lingue (= scrivi un programma in C / prolog / qualunque cosa) e ai compressori di dati (= usa zip, gzip, ppmc, ppmd ...) :)
woliveirajr

1
Immagino mi sembri esattamente che la definizione di un programma di compressione dei dati sia esattamente: un programma che approssima il KC di una stringa da un programma (il "decompressore") e un'altra stringa (la stringa compressa).
cody,

Risposte:


9

Credo che una possibile risposta alla tua domanda è questa: Prendete un generatore di numeri pseudo- . Prova a scegliere un generatore che ha alcuni potenti attacchi contro di esso: un attacco di generatore di numeri casuali per G è (per i nostri scopi), un algoritmo A che, quando viene data una stringa di imput s , determina un seme A ( s ) , tale che G ( A ( s ) ) = s . Quindi approssimare il KC di s :solsolUNS UN(S)sol(UN(S))=SS

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

Dove è la lunghezza del programma che calcola G ( s ) (spesso piuttosto breve, come per i generatori lineari).|sol|sol(S)

In pratica, gli attacchi generatori di numeri casuali non sono come descritti: potrebbero fallire o produrre risultati incompleti. In tal caso, è possibile adattare l'algoritmo in modo che ritorni quando il risultato dell'attacco è insoddisfacente. La stessa osservazione vale per gli algoritmi di compressione.|S|

L'avvertenza di questo approccio rispetto agli algoritmi di compressione è che gli algoritmi di compressione sono in genere molto più adatti al calcolo di KC in quanto sono su misura per funzionare su qualsiasi stringa, mentre un attacco può funzionare solo se è nell'immagine di G ( molto improbabile ).Ssol


7

Qualsiasi distribuzione di probabilità. Se si dispone di una distribuzione di probabilità calcolabile che fornisce la probabilità di dati p(X)-logp(X)

Questo è il motivo per cui la complessità di Kolmogorov è così interessante, non perché sia ​​l'algoritmo di compressione definitivo (che si preoccupa comunque della compressione), ma perché è l' algoritmo di apprendimento definitivo . Compressione e apprendimento sono sostanzialmente la stessa cosa: trovare schemi nei dati. Il quadro statistico basato su questa idea si chiama Minimum Description Length ed è stato direttamente ispirato dalla complessità di Kolmogorov.

Vedi anche questa domanda nel cstheory StackExchange.


5

la codifica grammaticale è una versione meno frequentemente utilizzata di un algoritmo di compressione e può essere considerata una stima "approssimativa" della complessità di Kolmogorov. la codifica grammaticale non è così comunemente usata come algoritmo di compressione come altri approcci più comuni, forse principalmente perché non migliora molto sulla compressione, ad esempio Lempel-Ziv su corpus basati su testo, ma può fare bene su altri tipi di dati. l'idea è di "comprimere" una stringa usando le regole grammaticali. una derivazione grammaticale può comportare un DAG (rispetto ad un albero meno complesso), quindi è possibile una sostanziale complessità rappresentativa.

un'altra opzione è quella di trovare i circuiti più piccoli / minimi che rappresentano una stringa, ma questo è noto per avere una complessità di calcolo molto elevata e potrebbe avere successo solo su stringhe di piccole dimensioni.

generalmente più si avvicina qualsiasi approssimazione al calcolo di K(X) , più è intrattabile.

K(X)

ci sono anche altri metodi di algoritmo di compressione oltre agli approcci di tipo "codifica della lunghezza di esecuzione" di Lempel-Ziv, ad esempio l'algebra vettoriale e SVD possono essere usati come algoritmo di compressione. anche le trasformate di Fourier vengono spesso utilizzate per comprimere le immagini, ad esempio nello standard JPG.


1
K(X)

buon punto tuttavia gli algoritmi con perdita di solito hanno un parametro regolabile che determina "perdita" e teoricamente può raggiungere la perdita senza abbastanza "termini" o "frequenze" per così dire, e dipende anche dai campioni di input, in modo che il valore del parametro senza perdita dipenderà sul loro "ordine relativo vs casualità" visto attraverso la "lente" dell'algoritmo di compressione ...
vzn

1
@cody and vzn: Grazie per la risposta, mi hai dato alcune buone idee per il mio dottorato di ricerca sulla compressione lossless x lossy :)
woliveirajr l'

JPEG utilizza DCT, non DFT.
Evil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.