PDA

View Full Version : Di una serie di valori eleggere il più probabile


das
15-09-2014, 07:19
Ho una serie di numeri:
1
2
3
4
4.5
4.6
4.7
4.88
4.9
5
5.01
5.03
6
7
8
9
10
11
12
13
14
15

Come vedete i numeri vicini al 5 sono più probabili rispetto a tutti gli altri. Non posso fare la moda perchè comunque ogni valore ricorre una volta.

Esiste un metodo statistico che come output mi dia 5 ?

Grazie

Daidlup
15-09-2014, 08:36
Ciao, non esiste la moda, ma se intendi come valore più probabile il valore intero potresti far così: una volta preso in input il vettore di valori, scrivi un secondo vettore in cui ad ogni elemento sostituisci l'approssimazione per arrotondamento, così che successivamente su tale nuovo vettore puoi eseguire la moda, il tutto automatizzato da un ciclo for per esempio.

das
15-09-2014, 16:10
Ciao, non esiste la moda, ma se intendi come valore più probabile il valore intero potresti far così: una volta preso in input il vettore di valori, scrivi un secondo vettore in cui ad ogni elemento sostituisci l'approssimazione per arrotondamento, così che successivamente su tale nuovo vettore puoi eseguire la moda, il tutto automatizzato da un ciclo for per esempio.

Non intendo il valore intero, ma facendo ricerche su internet ho capito che il mio è un problema di clustering:
raggruppare tra loro i valori più vicini e poi fare la media del gruppo più numeroso.

Freaxxx
15-09-2014, 16:42
ma su cosa verte la domanda ? Ti serve un consiglio su quale linguaggio di programmazione usare ?

das
15-09-2014, 18:36
ma su cosa verte la domanda ? Ti serve un consiglio su quale linguaggio di programmazione usare ?

No, non sul linguaggio ma proprio sull'algoritmo.
Detto con un disegno la domanda è questa:
http://i.imgur.com/fYPIjAd.png?1
I puntini sono i miei numeri. Più sono lontani più rappresentano numeri lontani tra loro. Come puoi vedere dal disegno sono vicini tra loro a gruppetti:
1.1
1.2
1.3
1.4

3.4
3.5
3.6
3.9
4.2

4.9
5.0
5.3
5.5

7.9
8
8.2
8.3

10
10.2
10.3
10.6
10.55
10.553

Quindi li posso dividere in n sottoinsiemi che nel disegno ho rappresentato come cerchi.

Come faccio a fare questa divisione in cerchi ?
Come faccio ad individuare il cerchio blu ? (Cioè quello con più puntini al suo interno ?)

Freaxxx
15-09-2014, 19:30
hai linkato male l'immagine, uppala su un sito esterno come http://imgur.com/ e re-pubblicala.

das
15-09-2014, 21:45
hai linkato male l'immagine, uppala su un sito esterno come http://imgur.com/ e re-pubblicala.

Ma non so perchè non la mostra nonostante il tag . Va bè comunque c'è il link

[IMG]http://i.imgur.com/fYPIjAd.png?1

das
16-09-2014, 08:59
ti interessa semplicemente determinare il picco della distribuzione di probabilità empirica associata, che non coinciderà con il valore medio né con la moda della tua seria di dati, come hai già notato.

Solo che cercando su internet il problema sembrerebbe più complicato del previsto. All'inizio pensavo fosse solo una funzioncina di quattro righe.

VICIUS
16-09-2014, 10:39
Oltretutto hai già i numeri in ordine crescente. Per "raggrupparli" basta scorrere la lista e guardare se la differenza con il numero successivo è minore di un certo valore.

def find_cluster(list, lim)
cluster = []
candidate = []

for i in 0 ... list.size
candidate << list[i]

if candidate.size > cluster.size
cluster = candidate
end

if i < list.size - 1
unless (list[i + 1] - list[i]) < lim
candidate = []
end
end
end

cluster
end

list = [1, 2, 3, 4, 4.5, 4.6, 4.7, 4.88, 4.9, 5, 5.01, 5.03, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
lim = 0.1

puts find_cluster(list, lim)
Questo trova il gruppetto [4.88, 4.9, 5, 5.01, 5.03] in cui il valore centrale è proprio 5 (pura fortuna).

das
16-09-2014, 11:37
perché più complicato del previsto? definisci un intervallo associato ad ogni valore (es, per il valore X, da X-0.5 a X+0.5, e conta il numero di occorrenze che cadono all'interno di quell'intervallo)... se il numero di occorrenze è troppo elevato puoi ripetere il procedimento solamente su quell'intervallo raffinando la stima (usando un numero maggiore di punti in quell'intervallo e contando le occorrenze in ogni sottointervallo))

Oltretutto hai già i numeri in ordine crescente. Per "raggrupparli" basta scorrere la lista e guardare se la differenza con il numero successivo è minore di un certo valore.

def find_cluster(list, lim)
cluster = []
candidate = []

for i in 0 ... list.size
candidate << list[i]

if candidate.size > cluster.size
cluster = candidate
end

if i < list.size - 1
unless (list[i + 1] - list[i]) < lim
candidate = []
end
end
end

cluster
end

list = [1, 2, 3, 4, 4.5, 4.6, 4.7, 4.88, 4.9, 5, 5.01, 5.03, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
lim = 0.1

puts find_cluster(list, lim)
Questo trova il gruppetto [4.88, 4.9, 5, 5.01, 5.03] in cui il valore centrale è proprio 5 (pura fortuna).

Complicato perchè non conosco a prescindere un intervallo minimo o il numero di cluster. Deve essere auto-adattativo
Ho trovato un algoritmo che lo fa, si chiama Self-Organising -Map. Solo che me lo devo scrivere visto che non si trovano librerie che lo contengano mi pare

das
16-09-2014, 12:19
Complicato perchè non conosco a prescindere un intervallo minimo o il numero di cluster. Deve essere auto-adattativo
Ho trovato un algoritmo che lo fa, si chiama Self-Organising -Map. Solo che me lo devo scrivere visto che non si trovano librerie che lo contengano mi pare

A pensarci bene il mio caso è molto più semplice perchè ho una sola dimensione.
Sto elucubrando:

- se mi scelgo un punto a caso
- da lì faccio partire il raggio di un cerchio fino a quando non viene inglobato un altro punto
- creo un nuovo cerchio con centro nel baricentro dei due punti precedenti.
- lo allargo fino a trovare un altro punto
- valuto la deviazione standard delle distanze
- creo un nuovo cerchio con centro nel baricentro dei tre punti precedenti.
- e così via allargando il cerchio fino a quando la deviazione non supera una certa soglia

- riparto da un punto esterno al cerchio e mi trovo un altro gruppo

oppure di tutte le combinazioni possibili trovare quella per cui la deviazione standard in ogni gruppo è più simile possibile a quella degli altri gruppi

Boh, waiting for elucubrazioni/aiuto