[Algoritmi] Calcolo Bayesiano

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

[Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Buona sera a tutti, è da un po' che non scrivo e saluto tutti quanti.
Avrei bisogno di una mano per fa re un calcolo. Suppongo si tratti di un problema risolvibile col teorema di Bayes, ma non lo padroneggio molto.
Supponiamo di avere 3 array:
0,1,1
0,1,1,1
0,0,0

Come faccio a calcolare la probabilità di estrarre 1 in un qualsiasi vettore pescato a caso ?
Prove fatte con un programma riesco a capire che si tratta del 47% circa:

Codice: Seleziona tutto

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define LANCI 1000000



	
	
int main (void)
{
	int palline[3][4]={{0,1,1,0},
						{0,1,1,1},
						{0,0,0,0}};

	int indice[3]={3,4,3};	
	int rnd_palline,rnd_indice;
	int i;
	int cont=0;
	float perc;
	srand((unsigned) time(NULL));
	for (i=0; i<LANCI; i++)
	{
		rnd_palline= rand() % 3;
		//printf ("rnd_ palline%d\n", rnd_palline);
		rnd_indice=rand()% indice[rnd_palline];
		//printf ("rnd_ indice%d\n", rnd_indice);
		//printf ("%d ", palline[rnd_palline][rnd_indice]);
		if ( palline[rnd_palline][rnd_indice]==1)
			cont++;
	}
	perc=(cont*100.0)/LANCI;
	printf ("percentuale =%f\n", perc);
	return 0;
	
	
	
	
	




 
ma non riesco ad estrapolare il calcolo con o senza Bayes.
In teoria dovrei analizzare i casi favorevoli e dividerli per i casi sfavorevoli. Ma bene bene non ho capito.
Mi sono appena imbattuto nel calcolo Bayesano e non ho ancora molta pratica
Grazie a chi volesse aiutarmi.
Nel caso espongo le prove carta e penna che ho fatto.
Il programma è scritto al volo, un po' rozzo, ma funziona. Volevo risalire a posteriori in base all'output (una sorta di logica inversa)
ma per ora non ci sono riuscito.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Credo di aver risolto.
Ragionando sul caso base
1,0
1,0
sappiamo che la probabiltà è del 50 % e da li si riesce a ragionare.
con
0,1,1
0,1,1,1
1,0,1
dovremmo avere il 69% di possibilità.
Da quello che ho capito (correggetemi nel caso ) vanno sommati tutti gli eventi positivi possibili e poi divisi per gli eventi positivi più i negativi
quindi ragionando con l'array sopra
primo :2/3 di avere 1
secondo :3/4 di avere 1
terzo :2/3 di avere 1
quindi
(2/3+3/4+2/3)/ (2/3+3/4+2/3+(negativi---->1/3+1/4+1/3)
risolvendo abbiamo 25/36=0.694--->*100= 69.4%
Corretto ? Credo che sia giusto fare il calcolo bayesano così
saxtro
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2874
Iscrizione: domenica 4 giugno 2006, 13:16
Distribuzione: Kubuntu 20.04

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da saxtro »

E' un pò che ho studiato queste cose, per cui prendimi con le pinze.
Credo che per il primo estratto, non sia necessario utilizzare il teorema di Bayes.

Le probabilità iniziali saranno: eventi favorevoli / totale degli eventi

Il teorema di Bayes dovrebbe tornare utile se hai già estratto uno 0 o un 1, e vuoi calcolare la possibilità che esca un 1 alla pesca successiva.

Ti ripeto però, prendimi con le pinze, potrebbe essere una castroneria.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Grazie della risposta. Può essere che non sia necessario, non so, cercherò di approfondire.
Credo che possa essere esteso anche al caso più banale (anche se non lo si fa mai).
Faccio un esempio: immaginiamo di estrarre un numero da 1 a 10. La probabilità è il 10 %, lo sappiamo a priori.
Ma possiamo usare anche il calcolo bayesiano:
(10%)/(10%)+(90%)
Ovvio nella pratica non si fa mai.
Credo che sia uno strumento potentissimo con calcoli elementari. La difficoltà (a mio avviso) sta nell'interpretazione dei
dati quando il problema diventa complesso: quali sono gli eventi certi (o a priori se non sbaglio)? Quali quelli non certi?
A volte facendo i primi esercizi sbaglio queste interpretazioni.
Quando non ho la soluzione, scrivo un programma (come quello sopra) che a "suon di brute force" mi trova la risposta.
Mi sono imbattuto in questo calcolo leggendo un libro su A.I dove il calcolo bayesiano è il capostipite di una dell cinque "tribù"
dell' intelligenza artificiale.
Grazie ancora per l'interessamento :)
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da vaeVictis »

Ciao gila75.
Posti per cortesia un link al teorema di Bayes a cui fai riferimento per cortesia?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Ciao Vae. Ho spulciato vari link, ma sono tutti troppo teorici, e ho capito poco. Non padroneggiando i formalismi matematici ovvio che sono in difficoltà.
Sta sera ne posto qualcuno. Grazie
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da vaeVictis »

@gila75
Non ti dimenticar di postar :birra:
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Non ricordo tutti i link che ho visitato, ma va bene anche quello di wikipedia :
https://it.wikipedia.org/wiki/Teorema_di_Bayes

il problema come dicevo è che a volte faccio confusione con i casi favorevoli e quelli sfavorevoli. Secondo me nel calcolo baysesiano è quello il difficile.
Faccio un esempio:
il 5% della popolazione ha il cancro. l' 80% dei casi sono diagnosticati, ma il 10 % potrebbe essere un falso positivo.
Quanti sono quelli che effettivamente hanno il cancro ?
Il calcolo corretto dovrebbe essere:
80%/(80%+10%) =0.88 che riferito alla popolazione in esame (5%) dovrebbe essere 0.05*0.88=0.044--> 4,4%
Quindi della popolazione iniziale (5%) il 4.4% potrebbe avere il cancro.
Prendetelo con le pinze, l'ho inventato adesso l'esempio e i calcoli sono miei, quindi potrei aver sbagliato.
La cosa che confonde sono i casi negati: erroneamente io all'inizio prendevo il 20% delle persone (le restanti dall' 80 % del problema sopra).
Ma da come ho capito, il 20% non fa parte del gruppo, universo che serve a noi. Semplicemente quel 20% non fa parte del nostro insieme.
Credo sia così, ma aspetto vostri consigli.
A volte i problemi sono così complessi che è difficile districarsi.
Mi piacerebbe padroneggiare questo calcolo, perchè può risolvere casi di statistica che con altri metodi si finirebbe dritti al manicomio

ribadisco per non dare informazioni false che NON sono sicuro dello svolgimento dell'esercizio sopra. Sono qui proprio per avere conferme e imparare

Questo video è semplice e interesssnte:

https://www.youtube.com/watch?v=dC_wW9_6Q7c
Ci sono poi molti esercizi in rete
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

saxtro ha scritto:
sabato 4 settembre 2021, 21:52
E' un pò che ho studiato queste cose, per cui prendimi con le pinze.
Credo che per il primo estratto, non sia necessario utilizzare il teorema di Bayes.

Le probabilità iniziali saranno: eventi favorevoli / totale degli eventi

Il teorema di Bayes dovrebbe tornare utile se hai già estratto uno 0 o un 1, e vuoi calcolare la possibilità che esca un 1 alla pesca successiva.

Ti ripeto però, prendimi con le pinze, potrebbe essere una castroneria.
Effettivamente per questo problema non serve il teorema di Bayes.
è un calcolo statistico molto più semplice:
0,1,1
0,1,1,1
1,0,1

Si risolve così:
(2/3+3/4+2/3)*1/3=25/36=69%
Hai fatto bene a farmelo notare. Interessante però notare che il calcolo bayesano si possa applicare anche nei casi base.
Questo invece un problema tratto dal web:
// Ci sono 2 strade, una a sinistra e una a destra.
In quella a sinistra ci sono 3 ristoranti di cui 2 soli sono aperti
mentre a destra ce ne sono 5 di cui solo 3 aperti.
calcolare:
(1) la probabilità di trovare un ristorante aperto
(2) sapendo che ho trovato un ristorante aperto, qual è la probabilità che abbia scelto la strada di destra?


io ho cercato di risolverlo. Ci sono un po' d'insidie a mio avviso.
Questo potrebbe essere un bell'esempio per ragionare sui casi favorevoli e sfavorevoli, quello che dicevo che secondo me è difficile da capire.
Noi abbiamo bisogno di ragionare su P(A|DX) cioè probabilità che ristorante aperto scelto da noi sia nella strada a dx.

Se qualcuno è interessato si può parlare.
Affascinante notare anche,che scrivendo piccoli script, i grandi numeri (cioè su 100000 o più lanci) le statistiche siano sempre
rispettate
saxtro
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2874
Iscrizione: domenica 4 giugno 2006, 13:16
Distribuzione: Kubuntu 20.04

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da saxtro »

gila75 ha scritto:
domenica 12 settembre 2021, 20:48
...
// Ci sono 2 strade, una a sinistra e una a destra.
In quella a sinistra ci sono 3 ristoranti di cui 2 soli sono aperti
mentre a destra ce ne sono 5 di cui solo 3 aperti.
calcolare:
(1) la probabilità di trovare un ristorante aperto
(2) sapendo che ho trovato un ristorante aperto, qual è la probabilità che abbia scelto la strada di destra?


io ho cercato di risolverlo. Ci sono un po' d'insidie a mio avviso.
Questo potrebbe essere un bell'esempio per ragionare sui casi favorevoli e sfavorevoli, quello che dicevo che secondo me è difficile da capire.
Noi abbiamo bisogno di ragionare su P(A|DX) cioè probabilità che ristorante aperto scelto da noi sia nella strada a dx.

Se qualcuno è interessato si può parlare.
Affascinante notare anche,che scrivendo piccoli script, i grandi numeri (cioè su 100000 o più lanci) le statistiche siano sempre
rispettate
Io lo affronterei cosi:
PD e PS indicano la possibilità di trovare un ristorante aperto a destra o a sinistra
PT la possibilità totale
P(D)=2/3
P(S)=3/5
P(T)=(2/3 + 3/5)*1/2=19/30 approssimabile a 5/8

Scegliendo destra o sinistra?

P(D|S)= probabilità di inforcare a destra, piuttosto che a sinistra
P(D|S)=1/2

Quanto varrà P(D|A)=? (possibilità di aver girato a destra, sapendo che si è trovato un ristorante aperto)

P(D|A') Possibilità di trovare un ristorante aperto a destra.
P(D|A')= P(D|S)*P(D)/P(T)

E quindi:
P(D|A)= P(D|S)*P(D|A')/P(T)

E' altamente probabile che l'approccio non sia corretto però :D
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Domani guardo. Io ho anche la soluzione teatta dal web.
Devo solo tradurre in numeri gli ultimi passaggi.
Anzi se hai voglia di fare due calcoli mi dici la percentuale finale ?
Se no ci provo io . Poi dico cosa secondo me è spesso difficile da capire nel calcolo bayesano
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da vaeVictis »

Per trovare la probabilità dell'evento D|A, ovvero di aver imboccato la strada a destra se hai trovato un ristorante aperto, puoi procedere così.
Il teorema ti dice che:
P(D|A) = P(A|D) x P(D) / P(A)
in cui
P(D|A) è la probabilità che cerchi.
P(A|D) = 3/5 è la probabilità di trovare un ristorante aperto una volta che si è già verificato l'evento di aver imboccato la strada a destra
P(D) = 1/2 è la probabilità di prendere la strada a destra
P(A) = 19/30 è la probabilità di trovare un ristorante aperto, calcolata al primo punto

Quindi avrai:
P(D|A) = ( 3/5 ) x ( 1/2 ) / ( 19/30 ) = ( 3/10 ) / ( 19/30 ) = 9/19 = 0.47 e spicci.

L'esercizio è una versione alternativa del classico esercizio sulla scuola mista che di norma si fa quando si introduce il teorema di Bayes
Si consideri una scuola che ha il 60% di studenti maschi e il 40% di studentesse femmine.
Le studentesse indossano in egual numero gonne o pantaloni; gli studenti indossano tutti quanti i pantaloni.
Un osservatore, da lontano, nota un generico studente coi pantaloni. Qual è la probabilità che quello studente sia una femmina?

Il problema può essere risolto con il teorema di Bayes, ponendo l'evento A che lo studente osservato sia femmina, e l'evento B che lo studente osservato indossi i pantaloni. Per calcolare P(A|B), dovremo sapere:
  • P(A), ovvero la probabilità che lo studente sia femmina senza nessun'altra informazione. Dato che l'osservatore vede uno studente a caso, ciò significa che tutti gli studenti hanno la stessa probabilità di essere osservati. Essendo le studentesse il 40% del totale, la probabilità risulterà 2/5.
  • P(A'), ovvero la probabilità che lo studente sia maschio senza nessun'altra informazione. Essendo A' l'evento complementare di A, risulta 3/5.
  • P(B|A), ovvero la probabilità che uno studente femmina indossi i pantaloni (ossia la probabilità che, verificato l'evento che lo studente sia femmina, si verifichi l'evento che indossi i pantaloni). Poiché indossano gonne e pantaloni in egual numero, la probabilità sarà di 1/2.
  • P(B|A'), ovvero la probabilità che uno studente indossi i pantaloni, noto che lo studente è maschio. Tutti gli studenti maschi indossano i pantaloni, quindi vale 1.
  • P(B), ovvero la probabilità che uno studente qualsiasi (maschio o femmina) indossi i pantaloni. Poiché il numero di coloro che indossano i pantaloni è di 80 (60 maschi + 20 femmine) su 100 studenti fra maschi e femmine, la probabilità P(B) è di 80/100 = 4/5.
Ciò detto, possiamo applicare il teorema:
P(A|B) = P(B|A) x P(A) / P(B) = ( 1/2 x 2/5 ) / 4/5 = 1/4

p.s.: in un primo momento avevo calcolato male P(A) perché avevo calcolato semplicemente il numero di ristoranti aperti diviso il numero di ristoranti totali e mi veniva 5/8 che è approssimativamente giusto ma concettualmente sbagliato.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
saxtro
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2874
Iscrizione: domenica 4 giugno 2006, 13:16
Distribuzione: Kubuntu 20.04

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da saxtro »

vaeVictis ha scritto:
lunedì 13 settembre 2021, 1:20
Per trovare la probabilità dell'evento D|A, ovvero di aver imboccato la strada a destra se hai trovato un ristorante aperto, puoi procedere così.
Il teorema ti dice che:
P(D|A) = P(A|D) x P(D) / P(A)
in cui
P(D|A) è la probabilità che cerchi.
P(A|D) = 3/5 è la probabilità di trovare un ristorante aperto una volta che si è già verificato l'evento di aver imboccato la strada a destra
P(D) = 1/2 è la probabilità di prendere la strada a destra
P(A) = 19/30 è la probabilità di trovare un ristorante aperto, calcolata al primo punto

Quindi avrai:
P(D|A) = ( 3/5 ) x ( 1/2 ) / ( 19/30 ) = ( 3/10 ) / ( 19/30 ) = 9/19 = 0.47 e spicci.
.....
è lo stesso calcolo che ho fattoio fino a P(D|A') --> probabilità di trovare un ristorante una volta firato a destra (io ho commesso un errore di lettura traccia, ho invertito destra e sinistra)

Però secondo me non è il punto di arrivo.
La traccia chiede:
sapendo che ho trovato un ristorante aperto, qual è la probabilità che abbia scelto la strada di destra?

Per cui secondo me manca un conto, solo che non riesco a capire, se vada rivalutato il 3/5 con la scoperta di un ristorante aperto, o se utilizzare P(D|A) di vaeVictis (P(D|A') nel mio caso) per l'equazione finale.
O magari la traccia chiede semplicemente la possibilità di trovare un ristorante girando a destra, per cui un'ulteriore operazione non serve, circa 0,48 e 0,52 sono le risposte per destra e sinistra
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da vaeVictis »

No, è corretto.
Tra l'altro, è la stessa identica domanda della scuola.
Se osservo una persona coi pantaloni (se ho trovato un ristorante aperto) quale è la probabilità che sia femmina (quale è la probabilità che ho preso la strada a destra)?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Algoritmi] Calcolo Bayesiano

Messaggio da gila75 »

Però secondo me non è il punto di arrivo.
La traccia chiede:
sapendo che ho trovato un ristorante aperto, qual è la probabilità che abbia scelto la strada di destra?
Si è così. Le probabilità comunque come avete detto sono 9/19=0.47--->47 %
Io all'inizio ho sbagliato: consideravo i casi favorevoli (ristoranti aperti)/(casi favorevoli)+(casi sfavorevoli: ristoranti chiusi) ma sbagliavo.
Questo mi confonde: intendevo appunto i casi sfavorevoli i ristoranti chiusi.
Ma credo si debba ragionare su P(strda DX|RISTORANTI AP). L'insieme che ci interessa o universo dati (forse si dice così) sono i ristoranti aperti (tutti)
ma i casi sfavorevoli vanno interpretati quelli della strada a sx aperti (se vogliamo calcolare le probabilità sulla strada dx) . Giusto ?
Ho anche un esempio di due scatole di cioccolatini che è più o meno così. Testando con uno script, la teoria è sempre in accordo con la pratica.
Questi però sono esempi semplici. Ne ho incontrati di più subdoli.
Comunque incredibile come venga applicato il teorema di Bayes all'intelligenza artificiale. Leggendo il mio libro (che consiglio: L'algoritmo definitivo), si
può constatare la complessità che c'è dietro.
Ci terrei ad avere conferme\smentite del punto sopra. Intanto vi ringrazio per la collaborazione ;)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: nik1404 e 17 ospiti