Tempo medio di uscita di una stringa

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:F

Definizione

Nella teoria delle probabilità il tempo medio di uscita di una stringa è il calcolo della previsione di uscita di una stringa prefissata di k caratteri estraendo casualmente le lettere da un insieme finito di caratteri, dato dalla formula 𝐄[U]=hHmh, dove:

  • m è il numero totale di caratteri dell'alfabeto di riferimento
  • H è un insieme di indici che contiene i valori
    • la posizione del primo carattere, pari a 1
    • la posizione dell'ultimo carattere, pari alla lunghezza k della stringa
    • le posizioni di ogni sotto-stringa ripetuta all'interno della stringa
  • U è una variabile aleatoria che definisce il tempo di uscita della stringa

Per calcolare la previsione è necessario anche conoscere la probabilità di uscita di un carattere dall'insieme totale dei caratteri, dato da P{Xn=i}, dove Xn è una variabile aleatoria che può assumere i valori di un carattere dell'alfabeto, mentre l'evento {Xn=i} definisce l'uscita del carattere i alla n-esima estrazione.

Esempio

Si calcola la previsione del tempo medio di uscita della parola ABRACADABRA utilizzando l'alfabeto inglese composto da ventisei lettere.

Utilizzando la definizione si ha che {m=26k=11H={1,4,11}P{Xn=i}=126

Si osserva che H contiene le posizioni del primo e dell'ultimo carattere, oltre alla posizione dell'ultimo carattere della sotto-stringa ABRA ripetuta.

Da ciò ne deriva che 𝐄[U]=261+264+26113.67×1015, ossia il tempo medio di uscita della parola ABRACADABRA è dopo aver effettuato circa 3670 miliardi di digitazioni casuali su una tastiera di 26 caratteri.

Passaggio al limite

Si può facilmente vedere che la previsione del tempo medio di uscita di una stringa è una funzione divergente all'aumentare del numero di caratteri da estrarre. Pertanto, il limite della previsione per un numero di caratteri che tende all'infinito è pari a infinito, ossia limk(hHmh)=,m>1.

Intuitivamente si può calcolare il limite, considerando l'ipotesi che non esistano sotto-stringhe ripetute. Se questo limite tende a infinito a maggior ragione il limite nel caso di ripetizioni tende ad infinito. Si può non tenere conto dell'indice iniziale, pari sempre a uno, in quanto nel calcolo del limite sarebbe una costante. In base a queste considerazioni si osserva che mkhHmh,m>1 e se il limite di mk per k che tende a infinito è pari a infinito, allora anche il limite hHmh sarà pari a infinito. Per ogni m>1 la funzione mk è divergente, quindi limkmk=.

Enunciato

Sia C={1,2,,m} un insieme di m caratteri, con m{0}. Si può definire una stringa prefissata (aj)1jk di lunghezza k caratteri tale che ajC,j=1,,k.

Sia (Ω,𝒜,P) uno spazio di probabilità, tale che Ω={1,,m}, 𝒜 è una σ-algebra di Ω e P una misura di probabilità sullo spazio (Ω,𝒜). Su questo spazio si può costruire una successione di variabili aleatorie (Xn)n>0 tali che P{Xn=i}=1m=p,n>0,iC.

Sia T=inf{n:Xn+j=aj,j=1,,k} il tempo più piccolo entro il quale al tempo n+j+k la successione (Xn)n realizza la stringa (aj)j. Si definisce U=T+k il tempo di uscita della stringa.

Si prova che 𝐄[U]=hHmh, con H={h:1hk,akh+j=aj,j=1,,k}.

Dimostrazione

Sia F=(Fn)n una filtrazione tale che F0={,Ω} e Fn=σ(X1,X2,,Xn), ossia la σ-algebra generata dalla successione di variabili aleatorie al tempo n.

Osservazione 1

T e U sono dei tempi di arresto rispetto a F

Per il paradosso di Borel P{Xn+1=a1,Xn+2=a2,,Xn+k=ak}=1, ossia la probabilità di ottenere la sequenza (aj)j digitando casualmente le lettere di una tastiera è quasi certa. Da ciò deriva che P{T<}=1. Anche U è un tempo di arresto rispetto a F in quanto, essendo k una costante,P{T+k<}=P{U<}=1

Osservazione 2

P{T+k>n}=hH(j=1h1p)P{T+k=n+h}

Si definisce una successione di variabili aleatorie indipendenti, per ogni n fissato, (Yj(n))j>0 tale che Yj(n)=1pI{Xn+j=aj},j=1,,k. La successione è indipendente in quanto è funzione della successione (Xn)n, anch'essa indipendente.

Per ogni j si osserva che la previsione di Yj(n) è pari a uno. Infatti 𝐄[Yj(n)]=1pp=1

Si pone Mj(n)={1 se 0jnj=1hYj(n) se j=n+h, con 1hkMn+k(n) se j>n+h

La successione (Mj(n))j è una F-martingala.

Osservazione 2.1

T=inf{n:Mn+k(n)0}

Osservazione 2.2

I{T>n}Mn+k(n)=0

Si pone L(n)=M(n)|U=(MUj)j, che per la trasformazione secondo Burkholder è anch'essa una F-martingala.

Si trova il valore di Ln+k(n)quando T>n.

I{T>n}Ln+k(n)=I{T>n}MUn+k(n)=I{T>n}MT+kn+k(n)

Dato che stiamo considerando il caso che T>n, il valore più piccolo tra T+k e n+k è proprio n+k

I{T>n}MT+kn+k(n)=I{T>n}Mn+k(n)=I{T>n}j=1kYj=I{T>n}j=1k1pI{Xj=aj}

Per definizione di T, ossia il più piccolo n tale che la stringa si realizzi, si ha Mn+k(n)=0 in quanto esiste almeno un carattere j compreso tra 1 e k dove Xjaj. Come conseguenza si ha che I{Xn+j=aj}=0 e quindi I{T>n}j=1k1pI{Xj=aj}=0

Osservazione 2.3

I{T+k=n+h}Mn+h(n)={I{T+k=n+h}(1p)h, se hH0 se h∉H

Si trova il valore di Mn+h(n) quando T+k=n+h.

I{T+k=n+h}Mn+h(n)=I{T+k=n+h}j=1hYj(n)

I{T+k=n+h}j=1hYj(n)=I{T+k=n+h}j=1h1pI{Xn+j=aj}

I{T+k=n+h}j=1h1pI{Xn+j=aj}=I{T+k=n+h}j=1h1pI{XT+kh+j=aj}

Ne segue che

I{T+k=n+h}Mn+h(n)={I{T+k=n+h}j=1h1p=I{T+k=n+h}(1p)h, se hH0 se h∉H

In base all'osservazione 2.3 si ha che I{T+k>n}Mn(n)=hHI{T+k=n+h}(1p)h

Considerando che Mn(n)=1 per definizione si ha che P{I{T+k>n}1}=P{hHI{T+k=n+h}(1p)h}

Dato che la probabilità di una funzione indicatrice corrisponde all'evento stesso si ha che P{T+k>n}=hH(1p)hP{T+k=n+h}

Conclusione

𝐄[U]=nP{U>n}=nP{T+k>n}

Per l'osservazione 2 si ha che nP{T+k>n}=nhH(1p)hP{T+k=n+h}

Fissando h e facendo variare n si ottiene chenhH(1p)hP{T+k=n+h}=hH(1p)hnP{T+k=n+h}

La somma per ogni n della probabilità che il tempo di arresto T sia uguale a n+hk equivale a calcolare la probabilità che T sia finito, pari a 1 per l'osservazione 1.

Pertanto si dimostra la tesi ottenendo che 𝐄[U]=hH(1p)hnP{T+k=n+h}=hH(1p)h

Verifiche sperimentali

Si può dimostrare sperimentalmente il tempo medio di uscita di una stringa implementando un algoritmo che simula l'estrazione casuale dei caratteri e campionando il numero di estrazioni necessarie a comporre una determinata parola. L'algoritmo può essere implementato attraverso un simulatore, oppure utilizzando un linguaggio di programmazione fornito di una libreria che implementi un generatore di numeri pseudo casuale. Di seguito si descrive un semplice algoritmo di esempio, scritto con il linguaggio ANSI C, che permette di campionare i tempi di uscita di una stringa. Successivamente si descrive come avviene il campionamento dei dati e si fa vedere che i dati tendono alla previsione matematica.

Algoritmo di campionamento

Per effettuare un campionamento del tempo di uscita di una stringa è necessario implementare un algoritmo che effettui la stessa estrazione un certo numero di volte, solitamente maggiore di trenta. L'alfabeto di riferimento è quello inglese composto da ventisei lettere.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>
#include <time.h>

#define MIN_CAR 97
#define MAX_CAR 122
#define DELTA_CAR 26

#define MARKER_STR "-s"
#define MARKER_GIRI "-n"
#define MARKER_SID "-r"
#define MARKER_SAVE "-f"
#define MARKER_VERBOSE "-v"
#define VERBOSE_OFF "off"

int verbose;

unsigned long long estrai_stringa(int l, char * s){
	
	unsigned long long n;
	int k, maxk;
	char c;
	
	n = 0;
	k = 0;
	maxk = 0;
	
	while (k < l){
		
		if (n == ULLONG_MAX){
			
			if (verbose == 1){
				printf("raggiunto limite massimo di estrazioni: %llu\n", n);
				printf("numero massimo di caratteri estratti: %d su %d\n", maxk, l);
				fflush(stdout);
			}
			
			return 0;
		}
		
		c = (char) (MIN_CAR + (rand() % DELTA_CAR));
		
		if (c == s[k]){
			k++;
			
			if (maxk < k){
				maxk = k;
			}
			
		}else{
			k = 0;
		}
		
		n++;
		
	}
	
	if (verbose == 1){
		printf("stringa estratta dopo %llu step\n", n);
		fflush(stdout);
	}
	
	return n;
	
}

int main(int argc, char * argv[]){
	
	int i, l = -1, n = -1;
	time_t t;
	unsigned int sid = 0;
	unsigned long long ret;
	char * s;
	FILE * f = NULL;
	
	verbose = 1;
	
	for (i = 0; i < argc; i++){
		
		if (strcmp(argv[i], MARKER_STR) == 0){
			s = argv[i + 1];
			l = strlen(s);
		}else if (strcmp(argv[i], MARKER_GIRI) == 0){
			n = atoi(argv[i + 1]);
		}else if (strcmp(argv[i], MARKER_SID) == 0){
			sid = atoi(argv[i + 1]);
		}else if (strcmp(argv[i], MARKER_VERBOSE) == 0){
			if (strcmp(argv[i + 1], VERBOSE_OFF) == 0){
				verbose = 0;
			}
		}else if (strcmp(argv[i], MARKER_SAVE) == 0){
			
			f = fopen(argv[i + 1], "a");
			
			if (f == NULL){
				
				printf("errore nella creazione del file\n");
				fflush(stdout);
				
				return -1;
				
			}
			
		}
		
	}
	
	if (l == -1){
		if (verbose == 1){
			printf("specificare la stringa da estrarre: -s [stringa]\n");
			fflush(stdout);
		}
		return -1;
	}
	
	if (n == -1){
		if (verbose == 1){
			printf("specificare il numero di iterazioni: -n [numero iterazioni]\n");
			fflush(stdout);
		}
		return -1;
	}
	
	if (sid == 0){
		if (verbose == 1){
			printf("nessun sid specificato (opzione -r [sid]), uso sid generato automaticamente\n");
			fflush(stdout);
		}
		sid = (unsigned int) time(&t);
	}
	
	if (verbose == 1){
		printf("**** start estrazione ****\n");
		printf("sid = %du\n", sid);
		printf("stringa = %s\n", s);
		printf("lunghezza = %d\n", l);
		printf("iterazioni = %d\n\n", n);
		fflush(stdout);
	}
	
	srand(sid);
	
	for (i = 0; i < n; i++){
		
		ret = estrai_stringa(l, s);
		
		if (ret == 0){
			printf("errore nell'estrazione della stringa\n");
			fflush(stdout);
			return -1;
		}
		
		if (f != NULL){
			fprintf(f, "%llu\n", ret);
		}
		
	}
	
	if (f != NULL){
		fclose(f);
	}
	
	return 0;
	
}

Per compilare il codice è necessario salvarlo in un file (es. gen.c) e creare l'eseguibile attraverso un compilatore C. Di seguito si riporta il comando per compilare il sorgente con il compilatore gcc per il sistema operativo linux.

gcc gen.c -o gen

Verifica ipotesi mediante test di Student

Il test di verifica ipotesi di Student permette di stabilire se la media campionaria x¯ si discosti in modo significativo alla media matematica 𝐄[U]. Per effettuare il test si formulano le ipotesi H0:x¯=E[U] e H1:x¯E[U]. Nel caso in cui viene verificata l'ipotesi H0 si stabilisce che le due previsioni sono attinenti con una certa probabilità di errore. Nel caso in cui viene verificata l'ipotesi H1 si stabilisce che le due previsioni non sono attinenti con una certa probabilità di errore. Per effettuare il test di verifica è necessario ottenere i seguenti dati:

  • n+ è la numerosità del campione, ossia il numero di volte in cui si è registrato il tempo di uscita della parola "ciao"
  • (x1,x2,,xn)n è il campione da verificare, dove i=1,,n,xi rappresenta il numero di estrazioni occorse prima di comporre la parola "ciao"
  • x¯=1ni=1nxi è la media campionaria
  • σ¯2=1n1i=1n(xix¯)2 è la varianza campionaria
  • 𝐄[U]=hHmh è la media matematica
  • Z=(x¯𝐄[𝐔])σ2n è la statistica che ha legge di Student con (n1) gradi di libertà
  • α, t.c. 0<α<1 è l'errore tollerabile nella conferma dell'ipotesi
  • q(n1,α)+ è il quantile della legge di Student con (n1) gradi di libertà associato alla tolleranza α

Il test si esegue comparando il valore della statistica con il relativo quantile. Nel caso in cui Z<q(n1,α) si verifica l'ipotesi H0 con una probabilità pari a 1α. Nel caso in cui, invece, Zq(n1,α) si respinge l'ipotesi H0 e si conferma l'ipotesi H1 con una probabilità di errore pari ad α.

Esempio

Si procede ad un esempio concreto per verificare mediante il test di Student le ipotesi H0 e H1.

Per prima cosa si procede al campionamento dei dati utilizzando l'algoritmo descritto nella sezione precedente con il comando

./gen -s ciao -n 100 -f campionamento -r 1492875030

dove:

  • ciao è la stringa da estrarre
  • 100 è la numerosità del campionamento
  • campionamento è il nome del file dove verranno salvati i risultati delle estrazioni
  • 1492875030 è il seme per inizializzare il generatore pseudo casuale

Non appena il programma termina l'esecuzione è possibile procedere con il test di Student per stabilire se il numero di estrazioni necessarie per ottenere la stringa "ciao" è attinente alla previsione matematica. Si calcolano i parametri necessari a fare il test:

  • n=100 è la numerosità del campione
  • x¯=493329,65 è la media campionaria
  • σ¯2=253288754254,291 è la varianza campionaria
  • 𝐄[𝐔]=456976 è la media matematica
  • Z=0,7224 è la statistica con legge di Student
  • si pone α=0,05 come errore tollerabile nel caso di verifica di H1
  • il quantile associato è q(n1,α)=1,660

Essendo Z<q(n1,α) si conferma l'ipotesi H0 e pertanto la media campionaria conferma la media matematica. Analizzando il grafico sottostante con l'andamento delle previsioni parziali al variare della numerosità si vede chiaramente come x¯n𝐄[𝐔].

Bibliografia

Template:Cita libro

Template:Cita libro

Template:Cita libro

Template:Portale