PDA

Visualizza la versione completa : [ALGORITMO] Proporzionare una serie numerica


jimbo0
06-09-2014, 17:18
salve, ho un insieme di numeri che possono avere range molto variabile:
A={3,5,7}
B={350,158,7}
C={125,7,1258}

Mi servirebbe un metodo per "proporzionare" l'insieme (specifico che è sempre UN solo insieme) da questo range variabile ad un range fisso del tipo A={10<x<50} (da 10 a 50)
Per proporzionare ovviamente non intendo un semplice ordinamento, esempio: nello stesso insieme esistono i valori 1,100 e 1000 l'output che mi interessa è 10, 25, 50, non 10,11,12 :)

minomic
06-09-2014, 20:27
Ciao,
ammetto che non mi è molto chiara la domanda. Perché {1, 100, 1000} dovrebbero dare come output {10, 25, 50}? Cioè... 10 e 50 li posso anche capire se sono il tuo minimo e massimo. Però come hai calcolato il 25?

jimbo0
06-09-2014, 20:46
scusami, infatti non ha senso

è 1,500,1000 che deve dare come output 10, 25, 50.

minomic
06-09-2014, 20:51
Ok, questo avrebbe anche senso perché per passare da 1000 a 50 devi dividere per 20. Quindi prendi il 500, lo dividi per 20 e ottieni 25.

Però se ti trovi un insieme di numeri casuali, tipo {15, 20, 30} cosa fai? Se vuoi portare il 15 a 10 devi dividere per 1.5, però se vuoi che il 30 diventi 50 devi moltiplicare per 1.66. Quindi?

Il problema, secondo me, è che una cosa come quella che intedi tu non si può fare. Invece si può fare una "normalizzazione", cioè portare uno dei valori a 1 e vedere cosa accade agli altri. Ad esempio, nel caso di {15, 20, 30} otterresti {1, 1.33, 2}.
Se imponi tu che il valore più piccolo debba corrispondere a 10 e il più grande a 50 allora perdi la proporzionalità...

jimbo0
06-09-2014, 23:20
ok quindi dal tuo discorso tu dici che non posso imporre min e max, ma solo min?uhm come ho detto può capitare che abbia {1,1000}, in questa maniera il range in output è cmq troppo grande:confused:

anche se come vorrei fare io io non capisco perché dici si perde la proporzionalità, facciamo un esempio banale:
input={1,2,500,1000}
output={10, 10.decimali, 25, 50}

no?
il problema è che, sarò anche arrugginito, ma non riesco a pensare ad una formula

minomic
07-09-2014, 15:07
anche se come vorrei fare io io non capisco perché dici si perde la proporzionalità, facciamo un esempio banale:
input={1,2,500,1000}
output={10, 10.decimali, 25, 50}

no?
Secondo me no: nell'input il terzo valore (500) è pari a 500 volte il primo (1). Nell'output il terzo valore (25) è pari a due volte e mezza il primo (10). Così facendo, secondo me, non hai mantenuto la proporzionalità!
Comunque non è un errore tuo: semplicemente non credo si possa fare. Cioè non puoi imporre sia il limite superiore che quello inferiore e poi pretendere che tutti i valori all'interno mantengano la proporzionalità sia con uno che con l'altro.

M.A.W. 1968
07-09-2014, 20:57
Dovresti cercare di spiegare esattamente cosa cerchi di ottenere e che tipo di precisione numerica ti aspetti dal risultato. Il calcolatore può manipolare, per costruzione, solamente un insieme finito di valori interi e l'uso di floating point è soggetto a molte precondizioni ed errori di approssimazione, troncamento eccetera.

Dal punto di vista analitico, fisico e ingegneristico, è letteralmente una bambinata rimappare un qualsiasi intervallo reale arbitrario su un altro intervallo, per la controintuitiva densità dell'insieme numerico R, tale che qualsiasi intervallo reale (es. [0, 1]) contiene già Aleph-1 valori, ossia il medesimo ordine di infinito dell'intera classe numerica a cui appartiene (peraltro superiore all'infinità detta "numerabile" dei numeri interi, relativi e razionali). Il povero Georg Cantor è morto in manicomio per aver appuntato troppo a lungo la sua attenzione su questioni del genere... le "proporzioni" in casi del genere perdono totalmente di significato.

Dal punto di vista computazionale, invece, la questione assume tutt'altro aspetto, derivante appunto dalla precisione e dalla granularità richieste, nonché dalla classe numerica con la quale ci si attende di operare (moltissimi problemi possono essere brillantemente risolti usando approssimazioni razionali, i.e. frazioni con numeratore e denominatore interi).

jimbo0
07-09-2014, 21:28
ho allegato quello che ho attualmente (con una libreria grafica js).
in breve: il nodo radice è un argomento qualsiasi, i figli rappresentano il numero di articoli su quell'argomento raggruppati per anno.
Ora i nodi hanno tutti uguale dimensioni (diametro). Quel che vorrei è avere nodi con dimensione proporzionale al numero di articoli.
Quindi la precisione non mi interessa molto, l'importante è il "colpo d'occhio", i nodi devono avere dimensioni diverse. Ma devo controllare i valori dati in output: ad esempio un nodo di dimensione 100 coprirebbe tutto il grafo e come ho detto può capitare di avere 1 articolo in un anno e 100 in un altro anno. I valori "validi" per le dimensioni del nodo sono più o meno compresi in un range 10 e 40

M.A.W. 1968
07-09-2014, 22:15
In tal caso, ti accontenterai delle approssimazioni di default e la formuletta diventa decisamente puerile.

24567

Ove ovviamente x1, x2 sono gli estremi dell'intervallo di partenza, x3 e x4 quelli dell'intervallo di destinazione, xp il nuovo valore per un qualsiasi xn di partenza, ovviamente intermedio tra 1 e 2.

jimbo0
09-09-2014, 20:23
uhm ho seguito pedissequamente la tua formula:
size=(((numero_articoli-minIN)/maxIN-minIN)*(40)+10)
minIN=5 (x_1)
maxIN=72 (x_2)
minOUT=10 (x_3)
minOUT=50 (x_4)

ma questo è il log dei risultati


num articoli nodo 0: 5
size: -190

num articoli nodo 1: 54
size: -162.77777777777777

num articoli nodo 2: 40
size: -170.55555555555557

num articoli nodo 3: 39
size: -171.11111111111111

num articoli nodo 4: 50
size: -165

num articoli nodo 5: 53
size: -163.33333333333331

num articoli nodo 6: 60
size: -159.44444444444443

num articoli nodo 7: 33
size: -174.44444444444443

num articoli nodo 8: 33
size: -174.44444444444443

num articoli nodo 9: 72
size: -152.77777777777777

num articoli nodo 10: 61
size: -158.88888888888889

edit: facendo a mano i conti escono risultati che sembrano corretti, quindi mi sa che è un problema javascript (qualche intero è trattato da stringa)

riedit: infatti era quello il problema (oltre alla mancanza di parentesi al denominatore)
ho esplicitato tutte le parentesi (per forzare le operazioni matematiche ed evitare il concatenamento di variabili che javascript fa con "+") e funziona
size=parseInt(((((nodes[i].numarticoli-minIN)/(maxIN-minIN))*(maxOUT-minOUT))+minOUT))

ora dimmi, quella formuletta "puerile" (come dici) l'hai prodotta tu?:)
anche se è effettivamente semplice, non è così banale per me produrla da 0..

Loading