Pagina 1 di 1
Numeri (quasi) casuali...
Inviato: mar 23 giu 2009, 17:51
da EmaDaCuz
Forse il thread sarebbe piu' adatto alla sezione "Programmazione", ma intanto posto qui.
Per motivi didattici, mi piacerebbe creare delle curve simil-campana partendo generate da numeri quasi casuali.
Dico quasi casuali perche' mi piacerebbe che venissero rispettati dei limiti:
-dovrei scegliere il numero di elementi
-scegliere la moda
-scegliere la mediana
-scegliere l'intervallo entro cui la "campana" si sviluppa.
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Grazie per ogni eventuale interessamento.
Re: Numeri (quasi) casuali...
Inviato: mar 23 giu 2009, 20:20
da riotten
c'è un capitolo che potrebbe tornarti utile nel libro "algorithms in c" by sedgewick.....
Re: Numeri (quasi) casuali...
Inviato: mar 23 giu 2009, 23:21
da joe
In passato ho visto qualcosa del genere fatto in fortran, mi pare che si parlasse di "metodo montecarlo":
generi una serie di numeri casuali compresi tra 0 e 1, in pratica sono probabilità...si generano nel modo più casuale possibile usando se non ricordo male una funzione chiamata random_seed o qualcosa del genere, mi spiace ma non ricrdo di preciso...prova con google per maggiori info (cercando i termini di cui ho parlato).
Una volta che hai questa serie di numeri li sbatti nella funzione di probabilita cumulata relativa alla tua campana per capirci (mi sono spiegato?). Cioè ciascun numero rappresenta un valore della F(xi). Genericamente hai F(xi)=F(xi, a, b, c, ...n) dove a, b, c, .., n sono i parametri checaratterizzano la tua campana (per esempio la tua gaussiana, la tua gumbel o altre funzioni del genere.
Praticamente a te serve la formula xi=F^(-1)(xi), dovresti riuscire a ricavartela in qualche modo. (ripeto sto andando a braccio e può essere che amemoria non ricordi alcuni aspetti necessari).
Alla fine della fiera trovi una serie di xi che sono distribuiti secondo la tua funzione di densità di probabilità f(x,a,b,c,...n): come saprai il legametra F e f è noto F(xi)=int[f(x)]|,calcolato tra -infinito e xi (sempre andando a memoria...).
Quindi a matita o sbirciando in qualche appunto/libro/sito/ecc determini la F(x,a,b...) che poi se hai i parametri a, b, ... noti, è di fatto "F(x)".
Poi sempre a matita ricavi l'inversa x=F^-1[F(x)].
A questo punto passi alla programmazione:
- produci con random seed i valori casuali (completamente casuali eh) di F(x)
- ricavando per ognuno il valore della variabile casuale xi
- la serie di xi ottenuta sarà distribuita secondo la tua campana da cui eri partito.
Prendi tutto con le pinze ma teoricamente il discorso dovrebbe essere quello.
Prova anche la chiave di ricerca:
random seed metodo monte carlo generazione numeri casuali
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 0:50
da giberg
EmaDaCuz ha scritto:Forse il thread sarebbe piu' adatto alla sezione "Programmazione", ma intanto posto qui.
Per motivi didattici, mi piacerebbe creare delle curve simil-campana partendo generate da numeri quasi casuali.
Dico quasi casuali perche' mi piacerebbe che venissero rispettati dei limiti:
-dovrei scegliere il numero di elementi
-scegliere la moda
-scegliere la mediana
-scegliere l'intervallo entro cui la "campana" si sviluppa.
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Grazie per ogni eventuale interessamento.
Intendi generare numeri pseudocasuali da
delle particolari distribuzioni da quanto ho capito,
come ad esempio una Normale (Gaussiana)?
R (r-project tra i pacchetti slacky) ha le funzioni
già pronte per generare numero pseudocasuali
da varie distribuzioni. Ad esempio per generare
numeri da una normale hai la funzione
rnorm
con rnorm(1000) ad esempio generi 1000 numeri
da una Normale standard (media 0, deviazione standard 1).
Ovviamente puoi passare i valori che vuoi per media
e deviazione standard.
Poi puoi fare un istogramma e sovrapporci la curva della
normale per vedere "a occhio" se la simulazione è buona
(più numeri generi più l'istogramma prende la forma della
campana).
Se invece devi simulare da una funzione
qualsiasi allora bisogna costruirsi uno script
usando uno dei metodi di simulazione (non
molto difficile da usare ad esempio è
il metodo del rifiuto che permette di appoggiarsi
ad una distribuzione da cui si sanno generare
numeri pseudocasuali).
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 0:59
da lamarozzo
Sicuramente per campana intendi la guassiana. Per estrarre numeri da una distribuzione gaussiana c'è il metodo box-muller, ecco il codice:
Codice: Seleziona tutto
double gaussianDistribution()
{
double x1,x2,w,rnumb;
do {
x1=2.*drand48()-1.;
x2=2.*drand48()-1.;
w=x1*x1+x2*x2;
} while (w>=1.);
w=sqrt( (-2.*log(w))/w );
rnumb=x1*w;
return rnumb;
}
Ogni volta che chiami la funzione ti viene restituito un numero estratto dalla distribuzione normale, media 0 e varianza unitaria. Se vuoi una varianza diversa basta che moltiplichi il numero per la deviazione standard, e se vuoi una media diversa da zero basta che sommi il valore medio desiderato.
La funzione richiama drand48(), quindi assicurati di settare il seed prima di chiamare la funzione con srand48().
Ciao
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 1:37
da giberg
joe ha scritto:Una volta che hai questa serie di numeri li sbatti nella funzione di probabilita cumulata relativa alla tua campana per capirci (mi sono spiegato?). Cioè ciascun numero rappresenta un valore della F(xi). Genericamente hai F(xi)=F(xi, a, b, c, ...n) dove a, b, c, .., n sono i parametri checaratterizzano la tua campana (per esempio la tua gaussiana, la tua gumbel o altre funzioni del genere.
Praticamente a te serve la formula xi=F^(-1)(xi), dovresti riuscire a ricavartela in qualche modo. (ripeto sto andando a braccio e può essere che amemoria non ricordi alcuni aspetti necessari).
Alla fine della fiera trovi una serie di xi che sono distribuiti secondo la tua funzione di densità di probabilità f(x,a,b,c,...n): come saprai il legametra F e f è noto F(xi)=int[f(x)]|,calcolato tra -infinito e xi (sempre andando a memoria...).
Quindi a matita o sbirciando in qualche appunto/libro/sito/ecc determini la F(x,a,b...) che poi se hai i parametri a, b, ... noti, è di fatto "F(x)".
Poi sempre a matita ricavi l'inversa x=F^-1[F(x)].
Da quello che ho capito
quello che descrivi è il metodo
dell'inversione della funzione di
ripartizione di una variabile casuale.
Se hai una variabile casuale continua X
con funzione di ripartizione Fx, se si considera
la variabile casuale trasformata Y=Pr(X<=
y)=Fx(
y)
allora Y~U(0,1) (cioè uniforme 0,1).
Quindi estrai
n numeri da una
uniforme
u_i~U(0,1)
e quindi li trasformi in
x_i = F^(-1)(
u_i).
Comunque finché si tratta di generare
da variabili casuali, R ha già le funzioni
pronte per estrarre i numeri, non servono
trasformazioni.
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 2:02
da giberg
EmaDaCuz ha scritto:
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Come grafico è questo che vuoi ottenere?
Srivo qui il codice R per ottenere numeri e grafico
(commenti preceduti da #):
Codice: Seleziona tutto
# genera 1000 numeri pseudocasuali da una normale standard
numeri<-rnorm(1000)
# anziché aprire una finestra grafica, l'istogramma con il comando jpeg
# viene salvato in un jpeg (altrimenti si può usare png, pdf...)
jpeg(file="istogramma.jpeg")
# genera l'istogramma con le densità (frequency=FALSE, altrimenti mostra le frequenze)
hist(numeri, frequency=FALSE, main="Istogramma di 1000 numeri pseudocasuali\nda una Normale standard")
# aggiungi la curva di una normale standard. Alla funzione curve viene passata la funzione dnorm
curve(dnorm, add=TRUE)
# chiudi il device grafico
dev.off()
Se vuoi una gaussiana non standard,
ad esempio media=3, deviazione standard=2
allora
rnorm(1000,3,2)
per sicurezza, nel caso ci si dimentichi
dell'ordine dei parametri (di sicuro il primo è
la quantità da generare):
rnorm(1000, mean=3, sd=2)
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 8:16
da EmaDaCuz
giberg ha scritto:EmaDaCuz ha scritto:
E' possibile ottenere quello che desidero (bastano i dati, la curva la otterei via GNUPlot o foglio di calcolo) con qualche script o qualche programmino? Io non ho assolutamente idea da dove partire...
Come grafico è questo che vuoi ottenere?
Srivo qui il codice R per ottenere numeri e grafico
(commenti preceduti da #):
Codice: Seleziona tutto
# genera 1000 numeri pseudocasuali da una normale standard
numeri<-rnorm(1000)
# anziché aprire una finestra grafica, l'istogramma con il comando jpeg
# viene salvato in un jpeg (altrimenti si può usare png, pdf...)
jpeg(file="istogramma.jpeg")
# genera l'istogramma con le densità (frequency=FALSE, altrimenti mostra le frequenze)
hist(numeri, frequency=FALSE, main="Istogramma di 1000 numeri pseudocasuali\nda una Normale standard")
# aggiungi la curva di una normale standard. Alla funzione curve viene passata la funzione dnorm
curve(dnorm, add=TRUE)
# chiudi il device grafico
dev.off()
Se vuoi una gaussiana non standard,
ad esempio media=3, deviazione standard=2
allora
rnorm(1000,3,2)
per sicurezza, nel caso ci si dimentichi
dell'ordine dei parametri (di sicuro il primo è
la quantità da generare):
rnorm(1000, mean=3, sd=2)
Fantastico. Ci daro' un' occhiata piu' approfondita appena posso, ma a grandi linee ci siamo.
Grazie mille, non solo a te ma anche agli altri che hanno postato le loro idee.

Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 10:29
da giberg
EmaDaCuz ha scritto:
Fantastico. Ci daro' un' occhiata piu' approfondita appena posso, ma a grandi linee ci siamo.
Grazie mille, non solo a te ma anche agli altri che hanno postato le loro idee.

Se serve qualche chiarimento
su R chiedi pure.
Una nota al codice scritto sopra:
se vuoi vedere il grafico senza
salvarlo, tanto per vedre come
viene, non scrivere i comandi
jpeg(file="istogramma.jpeg")
e dev.off() (dev.off ti chiuderebbe
la finestra grafica che ti appare a video).
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 10:49
da EmaDaCuz
Grazie ancora, non conoscevo R e devo dire che mi ha sorpreso in positivo.
Una sola cosa, approfittando della tua gentilezza...
E' possibile plottare un istogramma con l'asse x in scala logaritmica??? Sto cercando informazioni ma mi sembra che nessuno abbia un metodo "definitivo".
E grazie ancora per la dritta!
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 11:06
da giberg
Quello che ti interessa è
trasformare i numeri nel loro
logaritmo?
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 18:23
da EmaDaCuz
Non proprio, per quello da quanto ho capito basta l<-log(x).
Semplicemente, mi piacerebbe avere una scala logaritmica sull'asse x... e non sembra una cosa banale!
Comunque grazie, piu' mi inoltro nel programma e piu' mi piace.
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 20:02
da giberg
Che grafico stai cercando di fare?
Non l'ho mai usato ma c'è un parametro
da usare nella funzione plot.
Esempio: plot(1:12, log="x")
L'ho scoperto dal manuale della funzione
par che viene usata o per impostare
dei paremetri grafici o per vedere quelli
in uso. Infatti par("xlog") restituisce FALSE
se x non è nella scala logaritmica, TRUE altrimenti.
Dice di vedere il parametro log nella funzione
plot.default (quella richiamata quando si usa
la funzione plot su un oggetto).
Codice: Seleziona tutto
log: a character string which contains '"x"' if the x axis is to
be logarithmic, '"y"' if the y axis is to be logarithmic and
'"xy"' or '"yx"' if both axes are to be logarithmic.
Per vedere gli help delle funzioni:
?plot.defalut
?par
Nel sito
http://cran.r-project.org/
prova a vedere tra la documentazione
"Contributed" se trovi qualcosa che riguarda
la creazione di grafici.
Un mio compagno di università so che aveva
trovato da qualche parte una guida completa
se riesco a rintracciarlo gli chiedo dove.
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 21:03
da giberg
Forse plottando la densità anziché
l'istogramma...
prova:
plot(density(numeri),log="x")
è questo ciò che volevi?
Re: Numeri (quasi) casuali...
Inviato: mer 24 giu 2009, 21:23
da giberg
Penso ti possano servire queste slide
che ho trovato proprio ora:
http://csg.sph.umich.edu/docs/R/graphics-1.pdf
C'è una slide che spiega proprio come
fare per avere gli assi in scala logaritmica
(come ti ho mostrato nel post precedente).
Poi trovi vari esempi di grafici, sia fatti tramite
la libreria graphics (quella che stai usando ora
e caricata di default) sia con la libreria lattice.
Se vuoi vedere esempi di grafici:
demo(graphics)
oppure carica la libreria lattice
library(lattice)
demo(lattice)
Puoi anche visualizzare gli esempi
che trovi alla fine degli help delle varie
funzioni. Ad esempio
example(plot)
visualizza i grafici con i codici di esempio
nella guida di plot.
altri che posso consigliarti:
example(plot.default)
example(par)
example(hist)
example(curve)
example(points)