mercoledì, dicembre 20, 2006

Un framework per l'analisi di dati

Quante volte è capitato, a chiunque faccia ricerca in ambito scientifico, di dover manipolare ed esplorare dati, magari di doverli rappresentare graficamente, oppure interpolare con una qualche tencinca, per esempio con le T-spline. Se non si utilizza un software commerciale come Matlab e si sta lavorando in C++ per mantenere un occhio sulla portabilità e un occhio sull'efficienza.. in genere ci si affida a librerie esterne con il risultato di avere un elenco enorme di dipendenze. Ecco qui un framework che mette a disposizione tantissimi strumenti (tutti quelli di cuik si ha bisogno?) sotto un'unico pacchetto: ROOT.
Direi che il modo migliore per apprezzare ROOT è quello di andare a dare un occhio al materiale pubblicato, alle applicazioni che ci sono state implementate utilizzandolo.. e poi scaricarlo e provare ad utilizzarlo :D

sabato, dicembre 16, 2006

Tensor Voting

Il Tensor Voting, tecnica che si sta diffondendo molto rapidamente nella computer vision per il perceptual grouping di informazioni, non può che essere una tecnica citata in questo blog come ospite d'onore: infatti penso che non ci sia nulla di più vicino alla tecnologia, all'arte ed alla percezione di questa tecnica.
Il Tensor Voting affronta il problema di determinare le strutture percettive presenti in un insieme di punti di uno spazio a N dimensioni RN. Tali strutture vengono determinate sfruttando due principi principali:
  1. La "continuazione percettiva" di strutture esistent verso il vicinato: ad esempio se osserviamo una linea tratteggiata vediamo comunque una linea, anche se in realtà si tratta solo di tanti segmenti, questo perchè eprcettivamente tentiamo a "continuare" ogni segmento verso il successivo.
  2. La "morbidezza delle variazioni" delle strutture stesse: qui si intende parlare di smoothness, in questo caso il senso di questo termine è quello di mantenere il più costante possibile (minimizzarne quindi le variazioni) la curvatura delle strutture. Ad esempio la curva con curvatura costante che può unire due punti è un arco di circonferenza, non obbligatoriamente un segmento, infatti l'arco di circonferenza potrebbe evitare variazioni brusche nella derivata prima della curva in una giunzione precedente o successiva.
Non intendo descrivere qui il Tensor Voding, sarebbe decisamente ridondante (si cerci sulla rete, con autori Medioni, Tang e Mordohai), quello che intendo dare come idee.. o come riflessioni sono le seguenti:
  • Esistono tutti gli strumenti matematici che permettono di lavorare algoritmicamente con il Tensor Voting.. ma nessuno strumento di analisi globale, che permetta di interpretarne i risultati.. che sono stupefacenti.. ma che non sono secondo me descritti con sufficiente rigore.. ad esempio non si parla mai dello spazio delle possibili orientazioni, o delle possibili curve, o del fatto che ogni singolo voting è uno step discreto in un automa a stati infiniti.. insomma dal punto di vista analitico manca un bel po' di lavoro (speriamo di essere io a farlo ;).
  • Il Tensor Voting è una tecnica molto pontente, non ci sono dubbi.. però credo che il suo nome debba essere spezzato in due:
    • Tensor: Si lavora con votanti e voti che sono tensori; i votati sono solo punti.
    • Voting: Si tratta di una tecnica di voto, come ad esempio Hough; io direi che la generalizzazione del Tensor Voting più ovvia è il Voting.. una descrizione del voting come meta-tecnica di information transmission fra dati possa essere un formalismo potente, molte tecniche figlie possono essere costruite a partire da questa. Ovviamente in questo caso la matematica analitico-descrittiva del Voting sarebbe l'assoluta essenza del Voting stesso.
  • Dal punto di vista computazionale ci sono vari problemi: è una tecnica che può essere resa molto veloce grazie alle giuste strutture dati, però tende ad occupare una quantità di memoria esponenziale al crescere della dimensionalità N, costruire una tecnica efficiente di sintesi dei tensori del tensor voting field per dimensionalità alte potrebbe essere molto utile.

martedì, novembre 21, 2006

Cellular Neural Networks (CNN)

Gli automi cellulari sono sempre stati considerati dei giochini interessanti, fatti per esplorare le basi più semplici della teoria del caos, osservare comportamenti e proprietà emergenti non banalmente deducibili dalle regole di evoluzione del sistema. La loro natura di "stati definiti su nodi du un lattige rettangolare bidimensionale" però li hanno sempre resi molto vicini alle problematiche di elaborazione delle immagini. Ecco qui un lavoro che permette di esplorare alcune tecniche di elaborazione di immagini basate sugli automi cellulari. Lo strumento teorico, estensione dell'automa cellulare classico, prende il nome di rete neurale cellulare (CNN). I risultati sono interessanti, anche se non mostrano nulla di non ottenibile per altre vie, in genere anche in maniera molto più efficiente.

L'idea di estendere però lo strumento affinchè sia in grado di gestire organizzazioni di cellulle in agglomerati capaci di computazione locale non sarebbe malaccio.. si immaginino delle sorte di agglomerati cellulari che si muovono nello spazio degli stati attingendo alle informazioni presenti in esso e nell'immagine, aggregazioni che magari tendono a nutrirsi di pixel a 1 nell'immagine (binaria) da elaborare, la loro evoluzione potrebbe portare ad agglomerati di cellule addensati dove sono presenti curve o aree, portando ad un perceptual grouping dei dati sparsi ed incompleti.

Potrebbe essere un campo divertente in cui giocare :)

lunedì, novembre 13, 2006

Flatlandia, quesito di Novembre 2006

Nel sito Flatlandia ogni mese viene proposto un quesito geometrico a cui provare a rispondere cimentandosi nella dimostrazione di piccoli teoremi oppure dove è possibile cimentarsi in divertenti costruzioni geometriche. Su questo blog verranno pubblicate le risposte.
Quesito di Novembre 2006:

Costruire un quadrilatero in cui le bisettrici di due angoli opposti (di vertici A e C) siano parallele.

1) Quali caratteristiche presenta il quadrilatero così ottenuto?
2) Potrebbe essere un trapezio o un parallelogrammo?

Descrivere la costruzione e giustificare le risposte.


La costruzione richiesta non è banale, ma può essere ottenuta ragionando sulla costruzione della bisettrice di un angolo dati tre punti (estremo, centro ed altro estremo), e sui gradi di libertà a disposizione. In particolare è possibile utilizzare un SW di geometria vincolata, come kseg, per costruire ciò che di seguito viene descirtto.
  • Il quadrilatero descritto ha 7 gradi di libertà: ovvero perde solamente un grado di libertà nel vincolo richiesto. E' quindi possibile pernsare di utilizzare 6 gradi di libertà per fissare 3 punti del quadrilatero, utilizzare il restante grado di libertà per selezionare la bisettrice parallela a quella (implicitamente) data e trovare quindi la costruzione che permetta di determinare il quarto punto.
  • La costruzione di una bisettrice dati tre punti A, B e C è molto semplice, è sufficiente infatti:

    1. costruire la retta passante per A e B,
    2. proiettare C su tale retta con un arco centrato in B,
    3. Successivamente può essere costruito un segmento DB, ed il suo punto medio E.
    4. La bisettrice è la semiretta che parte da B e passa per il punto E.



  • Per ottenere ora il quarto punto del quadrilatero è indispensabile costruire una retta parallela alla bisettrice appena ottenuta controllabile tramite un punto; per questo motivo si costuisce un punto P libero sul segmento AC e si costruisce la retta passante per esso e parallela alla bisettrice.

  • Per costruzione, esattamente come per il segmento DC, il punto incognito X potrà essere utilizzato per costruire la bisettrice, a noi nota, utilizzando la stessa costruzione. Per questo motivo si costruisce il segmento passante per A e parallelo a DC, si determina il punto di incontro F con la bisettrice di X e si determina il punto proiettato D' a distanza doppiarispetto ad AF.
  • A questo punto, esattamente come B è il punto di incontro tra le rette BE (bisettrice) ed AD, così è possibile costruire la retta CD' e determinare il quarto punto del quadrilatero come incrocio con la bisettrice nota.
  • L'output ottenuta con in input i punti A, B, C e P vincolato sul segmento AC è quello mostrato in figura.
  • Interessante è osservare, al muoversi di P sul segmento AC, quali sono le possibili posizioni del punto X. Per ottenere questa informazione viene costruito il luogo di punti X definito dalle possibili posizioni di P ottenendo quanto mostrato nella figura seguente:
  • Si può mostrare che le possibili posizioni del punto X si trovano su una roto-omotetia dell'iperbole equilatera limitata dai punti A e C e passante per B ed ovviamente X. Un ramo (quello superiore nella figura) consente di ottenere i quadrilateri convessi e l'altro consente di ottenere i quadrilateri concavi.
  • Per quanto riguarda i quesiti: questa costruzione consente di avere tutti e soli i quadrilateri costruibili con le condizioni date, possono essere parallelogrammi ma non trapezi (se non degeneri in rettangoli).

mercoledì, novembre 08, 2006

Matlab: ottenere un numero arbitrario di parametri d'uscita

Spesso in Matlab capita di conoscere solo a run-time il numero di parametri da ottenere in uscita dalla chiamata a una funzione, questa situazione si presenta, ad esempio, se si utilizza la classica funzione ind2sub su un array di dimensionalità non nota a tempo di scrittura del codice.
Si immagini di avere a disposizione un array A ed un indice i di accesso lineare ai dati contenuti in A (accesso non strutturato, vedendo i semplicemente dati come una sequenza senza struttura). Ottenerne le dimensioni è possibile con la funzione size, ottenere l'indice strutturato da i richiede di ottenere in uscita dalla funzione ind2sub un numero di parametri non a tempo di scrittura del codice. L'utilizzo dell'espansione delle celle in sequenze di parametri viene in soccorso:
% Ottenimento delle dimensioni:
sze = size(A);

% Costruzione della cella per i parametri in output:
is = cell(1,numel(sze));

% Conversione dell'indice i in indice strutturato:
[is{:}] = ind2sub(sze,i);

% Esempio di utilizzo degli indici strutturati memorizzati nella cella:
elem = A(is{:});

martedì, novembre 07, 2006

Lenta carne pensante

A volte, il peso del proprio corpo,
ci fa sentire legati
a una realtà terrena da cui fuggire;
lo si vorrebbe abbandonare,
seppur momentaneamente,
per inibirne le distrazioni,
per eliminare dalla mente
gli effetti dei suoi capricci.

M'immagino senza carne,
pensiero puro librante,
capace di incredibili voli pindarici
che mi portino ovunque:
nel cuore di persone fantastiche,
nel cuore di luoghi fantastici,
nel cuore di teorie fantastiche.

Ma il fardello è qui, da trasportare;
la realtà ci mantiene
in uno spazio-tempo limitato;
solo un sospiro e una carezza
possono dar l'illusione della libertà.
Chiudo gli occhi: per un attimo volo.

Tempo fuggevole, luoghi lontani,
li focalizzo chiaramente:
canyon, foreste, oceani e ghiacciai;
luoghi dove dispiegare le ali
d'una ricercata serenità.

Ne carezzo la freschezza,
ne vedo i bagliori,
ne respiro l'aria,
ne odo i silenzi.

Riapro gli occhi,
tornano i sensi,
strette pareti.

Mi opprimono,
mi soffocano.

Uccidono.

venerdì, novembre 03, 2006

Matlab: multidimensional array slicing

Si immagini di avere un array multidimensionale A con un numero di dimensioni non noto nel momento in cui si scrive il codice. Si immagini anche di avere a disposizione un array from contenente per ogni dimensione l'indice di partenza di un'operazione di slicing, e un arrai to contenente gli indici di arrivo. Ipotizzando di avere già svolto tutti i controlli sulle dimensioni e sugli indici si può effettuare lo slicing come segue:

  • Si costruisce una cella contenente per ogni dimensione l'array di indici da utilizzare.
  • Si utilizza l'espansione di celle in elenco di parametri accoppiato con l'operatore di slicing.
Il tutto è riassunto nel codice seguente:

% Parametri forniti:
A = rand(3,3,3);
from = [1,2,1];
to = [3,2,2];

% Costruzione della cella (domanda: il ciclo è evitabile?):
D = numel(size(A));
inds = cell(1,D);
for i=1:D
% Gli indici voluti:
inds{i} = from(i):to(i);
end

% Lo slicing:
sliceA = A(inds{:});

Flatlandia, quesito di Ottobre 2006

Sul sito Flatlandia
ogni mese viene proposto un quesito geometrico da risolvere con la sola logica e la sola geometria. Ecco la mia risposta al seguente quesito di Ottobre 2006:

1) Fissato un segmento BC, costruire un triangolo ABC in cui la mediana AM sia congruente al lato AB.

2) Come si dovrà scegliere AM affinché il triangolo ABC sia rettangolo o acutangolo o ottusangolo?

Giustificare le risposte.



Nella figura è mostrata la costruzione che permette di ottenere il triangolo richiesto. In essa:

  • Si è determinato il punto medio M sul segmento BC. Si è identificato il punto medio D sul segmento BM.
  • Si è costruita la retta passante per D ortogonale a BM: questa retta è ortogonale alla corda della circonferenza passante per B ed M; preso un qualunque punto A su tale retta si ha che la distanza tra A e B è uguale alla distanza tra A ed M (mediana) essendo entrambe raggi della circonferenza costruita. Così è risolto il punto 1.


  • Esistono solamente due punti A sulla retta passante per AD tali che il triangolo ottenuto sia rettangolo. Chiamati A1 ed A2 tali punti si ha che tutti i triangoli AiBC, in cui Ai è un punto sul segmento A1A2, sono ottusi. I triangoli A1BC e A2BC sono rettangoli e gli altri sono acuti.
  • I punti A1 e A2 sono facilmente ottenibili grazie al seguente ragionamento: il triangolo finale, avendo un lato e due angoli in comune con ABD, deve essergli simile. Ma tracciandone la mediana DE come in figura, per similitudine deve essere DE congruente con BD, e quindi con DM, deve quindi essere la mediana la DE metà della mediana AM. Ne segue che il triangolo ABC è il doppio del triangolo ABD. Questo implica che, essendo AE, EB, ED, BD e DM congruenti, devono esserlo anche AB con BM, quindi il triangolo ABM è equilatero; è quindi sufficiente tracciare un arco centrato in B e passante per M per ottenere, come intersezione con la retta AD, i due punti A1 e A2. Così è risolto il punto 2.

martedì, ottobre 31, 2006

Poesia: uno sfogo per i sentimenti?

Penso che la poesia sia per me, come per molti autori, uno sfogo per i sentimenti, per questo si scrive di più e meglio quando qualcosa non và!

Date un occhio a questa poesia di Charles Baudelaire:

L'AMORE E IL CRANIO
Vecchio fregio

Sul cranio dell'umanità
l'Amor sta seduto,
che sembra sul trono, e di là,
con viso paffuto,

soffiando le bolle rotonde
le lancia su in alto
e prende, lievi e gioconde,
le stelle d'assalto.

I fragili globi lucenti
van su spensierati,
ma esplodono tosto:
frammenti di sogni dorati.

invano ogni volta la voce
del cranio garrisce:
"Ma questo giochetto feroce,
quand'è che finisce?

perchè ciò che tu, traditore,
disperdi nel vento,
è il vivo mio sangue, il mio cuore,
il mio sentimento!"

Adoro Baudelaire!!! Penso che molti si immedesimino in questo testo quando qualcosa va male con il partner.

Le mie poesie sono una raccolta di sentimenti, pensieri e sensazioni gettate sulla carta da un ragazzo di differenti età, che scrivendo dall'adolescenza alla (quasi ;) maturità mostra la propria crescita intellettuale e sentimentale. Potete reperirle qui.