View Full Version : Di una serie di valori eleggere il più probabile
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
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.
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.
ma su cosa verte la domanda ? Ti serve un consiglio su quale linguaggio di programmazione usare ?
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 ?)
hai linkato male l'immagine, uppala su un sito esterno come http://imgur.com/ e re-pubblicala.
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
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.
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).
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
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
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.