Visualizzazione post con etichetta python. Mostra tutti i post
Visualizzazione post con etichetta python. Mostra tutti i post

martedì, luglio 26, 2011

Networks with distance dependent connectivity, part I

Today I will give a short tutorial about the generation of random networks with distance dependent connectivity. Which means: we place the nodes somewhere in the space and we connect them with some probability which depends on the distance. Here you can find the python script.

Let me first discuss how to construct the matrix of distances between a set of vectors \{v_i\}. The idea is, obviously, to use the fact that the p-distance between two vectors is given by the formula
d_p(v_1,v_2) = \|v_1-v_2\|_p = \left(\sum_k (v^k_1-v^k_2)^p\right)^{1/p} 

For the Euclidean distance $p=2$ and we have
\|v\|^2 = (v,v) 
. So the squared distance is nothing but
\|v_1-v_2\|^2 = (v_1-v_2,v_1-v_2) 

This is good, then using the linearity of the scalar product, we obtain
\|v_1-v_2\|^2 = \|v_1\|^2 + \|v_2\|^2 -2(v_1,v_2) 
This expression can be computed with matrix multiplications. In python you can do it using numpy as follows. First, onstruct the matrix of the positions, i.e. stack all 'size' vectors of lenght 'dimension' on the top of each other
import numpy
dimension = 2
size = 100
positions = numpy.random.uniform(0,1, (size,dimension))
Here I have chosen uniformly distributed vectors, but you can use others of course.
Now, we construct the matrix s_{ij} = \|v_i\|^2 +\|v_j\|^2 by repeating, reshaping and transposing the vector of the norms. This is as easy as this
# construct the matrix s_ij = |v_i|**2+|v_j|**2
norms = numpy.sum( positions**2. , axis = 1 )
tmp = numpy.reshape(norms.repeat(size),(size,size))
sum_matrix = tmp + tmp.transpose()
'sum_matrix' is what you are looking for. The scalar product is even easier. Indeed the matrix of the products x_{ij} = (v_i,v_j) is just the multiplication of the vector matrix with its transpose (try on 2x2 example to see that it works). So you can do it easily by
# construct the matrix x_ij = (v_i,v_j)
scalars = numpy.dot(positions,positions.transpose())

domenica, dicembre 14, 2008

MCCN VIII

Giovedì abbiamo trattato il problema delle correlazioni fra variabili casuali - come al solito, la dispensa è qui.

Una famiglia di variabili casuali è detta indipendente se la distribuzione di probabilità si lascia fattorizzare nel prodotto delle probabilità marginali. Evidentemente, se X eY sono indipendenti, allora EXY=EXEY. In questo caso, si dice che X e Y non sono correlate.

Un errore che avviene molto spesso è quello di confondere correlazione e causalità. Cioè, dall'osservazione di una correlazione non nulla fra due variabili si deduce che una relazione causale fra le due variabili è presente. In realtà, ci sono vari effetti che possono indurre correlazioni.

1) Causalità diretta: ovviamente se X è la causa di Y, allora X e Y saranno correlate. In termini matematici: se Y=f(X), allora le due variabili non sono indipendenti; in genere, dunque, la covarianza delle due variabili, che è una possibile misura della loro correlazione, sarà non nulla.

2) Causalità comune: se X e Y sono due effetti della stessa causa, allora X e Y saranno correlate, in genere. Cioè, se Z è una variabile casuale, e f e g sono due funzioni non invertibili tali che X=f(Z) e Y=g(Z), allora, in generale, X e Y saranno correlate.

3) Dinamiche di reti: supponiamo adesso che X e Y siano immerse in una rete di interazioni. Allora, anche se X e Y non sono causalmente collegate, ne' hanno un input comune, di solito saranno correlate.

Qui trovate un breve script in python che mostra come 1) e 2) sono due effetti di dimensioni comparabili. Vengono create tre reti neurali elementari con delle dinamiche neuronali molto semplici. Ogni neurone può essere attivo o meno; se è attivo, ha una certa probabilità di emettere un potenziale d'azione che può cambiare il livello di attività degli altri neuroni.

La prima rete neurale è formata da un neurone di input e uno di output. Viene misurata il coefficiente di correlazione fra l'input e l'output.
La seconda rete (di controllo) è formata da due copie di reti I/O. Viene misurata il coefficiente di correlazione fra i due output.
La terza rete è formata da un input collegato a due diversi neuroni di output. Viene misurata il coefficiente di correlazione fra i due output.

Si può osservare che nel secondo caso il coefficiente di correlazione è 0 come atteso. Nel primo caso è tipicamente di un ordine di grandezza superiore al terzo caso; dato che però, a seconda dei parametri, le grandezza in gioco variano di più di un ordine di grandezza, non è possibile distinguere 1) da 3) a priori.

PS: ovviamente consiglio di installare python. Se l'avete fatto, per far funzionare lo script copiate il file in una cartella, entrate nella cartella e digitate in una console

'run mininetwork.py'

Dopo qualche secondo appariranno i risultati della simulazione. Se dovesse impiegare troppo tempo, aprite il file dello script e diminuite il numero degli steps della simulazione, si spiega da solo come farlo.

mercoledì, giugno 25, 2008

Un nuovo giocattolo

È python!

Per me che non ho mai programmato è una meraviglia: un linguaggio di programmazione semplice e meravigliosamente efficace.

In Ubuntu (una distribuzione Linux che vi consiglio di installare: ci riuscirete anche se fino ad ora avete usato solo Windows) è di solito preinstallato, altrimenti aprite l'applicazione synaptic e installate python e ipython.

Ne vedrete delle belle!