Archive for January, 2008

Implementazione grafica dell’algoritmo KNN

Wednesday, January 30th, 2008

Stamattina mi sono divertito a realizzare in Java una semplice implementazione grafica dell’algoritmo KNN (K-Nearest Neighbor). Nonostante si tratti del più banale metodo di classificazione di oggetti, viene utilizzato moltissimo proprio per la sua semplicità e tutto sommato discreta efficienza, e quindi vale la pena tenerlo presente perché in ambito di programmazione può spesso tornare utile. La classificazione si basa sul numero di oggetti che circondano l’oggetto da classificare all’interno di un raggio stabilito di valore k. Per una definizione puntuale vi rimando a Wikipedia. Supponendo il caso più semplice di scelta tra due sole possibilità, rappresentate da punti rossi e punti blu, si tratta quindi di effettuare due conteggi da confrontare alla fine per stabilire se il nuovo punto sarà rosso, blu oppure indeterminato (rappresentato in verde) nel caso in cui i conteggi risultino uguali.

Qui sotto il programmino inserito all’interno di un’applet (richiede il runtime di Java 6 o versioni successive), in cui è sufficiente inserire i valori di k e dei punti random iniziali rossi e blu. K è un intero positivo, tipicamente piccolo. Se non si seleziona l’opzione riempimento si ha una visualizzazione dinamica del colore determinato dall’algoritmo direttamente spostando il cursore del mouse all’interno del pannello.

Molto più interessante è però avere una vista d’insieme sulle aree di medesima catalogazione, spuntando l’opzione riempimento di cui sopra. Variando i valori numerici si osserva molto bene come si originano le aree dall’intersezione di più cerchi di raggio k e come prevale il colore rosso o blu a seconda se i punti di partenza sono in numero maggiore per il rosso o per il blu rispettivamente.

Partendo da un solo punto rosso ed uno blu con k=3:

knn 3-1-1

Poi, sempre con k=3, dando la prevalenza al rosso (5 rossi e 3 blu):

knn 3-5-3

Ancora con k=3, ma stavolta aumentando i valori di partenza e dando la prevalenza al blu (20 rossi e 25 blu):

knn 3-20-25

Diminuendo k al valore minimo ed aumentando ulteriormente i valori di partenza con prevalenza di nuovo del rosso (50 rossi e 40 blu):

knn 1-50-40

Con i valori predefiniti k=4, 80 punti rossi e 80 blu si ottengono risultati molto più uniformi:

knn 4-80-80

Con il massimo di punti rossi e blu, 99 ciascuno, si ottiene un risultato che si discosta poco a valori di k limitrofi, ad esempio con k=3 e k=5 si ottengono:

knn 3-99-99

knn 5-99-99

Tutt’altro discorso invece per valori estremi di k, ad esempio per k=1, sempre con il massimo di punti rossi e blu:

knn 1-99-99

Si nota una diminuzione dell’uniformità, ancora più evidente nel caso di k=9, sempre con il massimo di punti rossi e blu:

knn 9-99-99

L’implementazione in Java richiede veramente pochissimo tempo senza nemmeno l’utilizzo di un IDE. Se siete interessati al codice sorgente potete scaricarlo da qui Download e modificarlo liberamente. La classe GenPoints per la generazione dei punti random implementa anche la creazione dei punti all’interno di un cerchio tramite coordinate polari (non utilizzata nell’esempio). Buon divertimento!

3*2^30 B ovvero 3 GB di RAM :-)

Thursday, January 24th, 2008

Wow, in tempi rapidissimi oggi mi sono arrivati i 2 GB di memoria RAM che ho comprato su ebay dalla Germania! Ho trovato un venditore fantastico, prezzi convenientissimi, spedizione rapida e un imballaggio super… basta vedere la foto per capire quant’erano protetti i due moduli con un sistema di scatole cinesi! Adesso finalmente ho occupato i due slot liberi della mia mobo, naturalmente in dual channel per viaggiare al doppio della velocità! Così in tutto mi ritrovo con 3 GB disponibili e ho già le idee ben chiare su come sfruttarli al massimo… guai a chi osa pensare che ho upgradato il pc per installare quel macigno di Windows Vista! Ma nemmeno per divertirmi col composite manager Compiz di Ubuntu… e allora a che mi serve tutta questa memoria? E’ presto detto… virtualizzazione! Già, perché ormai non si parla più di dual boot e riavvi continui, ormai si lavora in contemporanea su più sistemi virtualizzati!

Scatola memoria RAM

Premetto che non sono un fanatico di Windows, Linux o Mac e per me l’uso di un determinato sistema operativo deve essere legato alla produttività e ai vantaggi del momento, quindi non ho problemi a passare dall’uno all’altro a seconda delle esigenze. Sta di fatto che ci dev’essere comunque un sistema operativo di base sul quale poi si virtualizzano gli altri… e la mia scelta è ricaduta in maniera del tutto naturale su Debian GNU/Linux Etch, ovvero l’attuale release stable, ma potremmo anche dire il sistema operativo per eccellenza! Per anni ho usato Windows e spesso provavo Linux in svariate distribuzioni, a cominciare da SuSE, Red Hat, l’allora Mandrake e le prime live tipo Knoppix… tutte mi attiravano ma ancora mancavano dei tasselli troppo importanti per la mia produttività, non esistevano infatti né OpenOffice né Firefox che considero ormai due pilastri dei sistemi GNU. Konqueror e AbiWord & Co non erano ancora sufficienti ai miei scopi, ma anche molti altri software erano troppo immaturi e in uno stato embrionale e così tornavo irrimediabilmente a Windows. Finalmente nel 2005 Ubuntu ha segnato una svolta e mi è subito piaciuto, ma ancora non mi convincevano alcune scelte sulla gestione degli utenti e dei driver… troppo instabile e ogni sei mesi una release che costringeva (e costringe ancora) a troppe sistemazioni! A me serve la massima stabilità e sicurezza, tutto il resto sono dettagli… ho provato quasi casualmente Debian visto che Ubuntu ne è una derivata, e li ho finalmente trovato dopo eoni di ricerche il sistema operativo che fa per me! Bene, una lunga parentesi solo per comunicare a tutti che faccio anch’io parte della famiglia dei Debianizzati e ne sono orgoglioso :-) Debian logo Ormai ho installato Debian dappertutto… desktop, laptop e minipc (di cui racconterò prossimamente in un post dedicato!). Ad Ubuntu va comunque il merito di avermi instradato verso Debian! Windows continuo ad usarlo in taluni casi e anche per mantenermi aggiornato sulla sua evoluzione (o involuzione?).

Ok, ora non mi resta che completare l’hardware con un bel disco rigido SCSI ad alta affidabilità (qualche marca/modello da consigliarmi?) per gestire separatamente la root… così i miei tre attuali dischi SATA da 160 GB li utilizzerei tutti quanti per la partizione home… due in raid1 (mirroring) e il terzo per il classico backup settimanale su frame removibile… naturalmente avevo già previsto da tempo questa soluzione ed infatti i dischi sono tutti uguali, dei mirabolanti Western Digital che costano il doppio rispetto ai dischi normali ma valgono il triplo! Che dire, una soluzione quasi maniacale ma il terrore di perdere dati importanti credo sia un po’ l’incubo di tutti gli informatici, no? Beh io voglio dormire sonni tranquilli e non mi basta la sicurezza software di Debian e del backup settimanale, ma neanche la sicurezza hardware del raid1… e così ho previsto anche il backup hardware separato di tutto quello che scrivo con un bel keylogger hardware da 2 MB! (beh, serve anche ad altro…)

Ok, per oggi fine delle pazzie :-D Alla prossima puntata!

100 kg di bench press finalmente!

Monday, January 21st, 2008

Ok, ok… avevo detto che non avrei parlato molto di me… ma non capita tutti i giorni di migliorare il proprio massimale in palestra! :-)

Oggi finalmente dopo quasi due anni di tentativi sono riuscito a sollevare 100 kg di massimale sulla bench press alias panca piana… e pensare che già 8 anni fa avevo raggiunto i 98 kg ma poi a causa degli intensi allenamenti di atletica non ero più riuscito a tornare a dei livelli decenti con i pesi! Una bella soddisfazione anche se il vero obbiettivo della stagione per me resta il fatidico one arm chin-up, ovvero trazioni alla sbarra con un braccio solo! Qui potete farvi un’idea della scrupolosa preparazione che richiede! Per ora riesco a raggiungere sovraccarichi di 40 kg a corpo libero e supero facilmente i 120 kg alla lat machine… ma la strada è ancora lunga e dovrò aspettare di essere in fase di definizione tra qualche mese per dimagrire un paio di chiletti!

Peccato non aver immortalato il massimale, in compenso ho salvato una vecchia foto di quando mi allenavo con Sandro (ehi quando torni in palestra? ti aspetto!) due anni fa, eccomi infatti mentre sollevo 90 kg:

90 kg alla bench press

Benji… reloaded!

Thursday, January 17th, 2008

ReloadEbbene rieccomi! Dopo un anno esatto il mio blog passa direttamente dal dicembre 2006 al gennaio 2008… inutile ripetere che questa rinascita potrebbe durare ben poco, ma per il momento godiamocela assieme :-)

Circa il 2007 posso solo dire che per me è stato un anno importante e ricco di piccoli grandi cambiamenti, piccoli o addirittura invisibili agli occhi degli altri ma molto grandi e significativi per me. Sin dall’inizio di questo blog però mi sono prefissato di parlare il meno possibile di me ed infatti non mi dilungherò oltre, anche se spesso mi piacerebbe urlare al mondo i miei pensieri più profondi… ma tant’è, ci vorrebbe un nuovo blog totalmente anonimo dove nessuno mi conosca nel mondo reale! E chissà che non l’abbia già realizzato… ;-)

Happy reboot!