2010-08-11 16 views
11

To powinno być łatwe.Skaluj listę liczb od -1.0 do 1.0

Mam listę numerów. Jak skalować wartości listy między -1.0 i 1.0 w celu uzyskania min = -1 i max = 1.0?

+1

To zależy. Czy chcesz, aby 0 pozostało równe 0 w ostatecznym wyniku? –

+1

@Alex: To może nie być możliwe, jeśli 0 nie znajduje się w zakresie. – relet

+7

Co chcesz zrobić w zdegenerowanym przypadku, w którym wszystkie liczby są takie same? – Hammerite

Odpowiedz

16

znaleźć min i max

następnie dla każdej skali numer x do 2 * (x - min)/(max - min) - 1

prostu sprawdzić -

  1. wag min -1
  2. i maksymalnej wagi do 1

Jeśli jest to długa lista precomputing c = 2/(max - min) i skalowanie z c * x - 1 jest dobrym pomysłem.

+0

Po drugie, uwaga na temat przetwarzania wstępnego, o ile to możliwe. Twój kompilator może nie być na tyle inteligentny, aby automatycznie wykonać tę optymalizację, jeśli użyjesz powyższego formularza (prawdopodobnie nie będzie próbował przełączyć "2" i licznika, aby zgrupować stałe razem). – bta

+0

Wystarczy, że zanotuję przykład (używając danych użytych w mojej odpowiedzi dla porównania), wierzę, że lista [-5, -3, -1, 0, 2, 4] zostanie odwzorowana na [-1, -0.55555, -0,11111, 0,11111, 0,55555, 1]. To ilustruje, co mam na myśli, gdy pytam, czy chcemy, aby 0 było nadal równe 0 w wynikach. –

+0

@Alex Tak, ale dlaczego miałbyś oczekiwać 0, aby odwzorować na 0? – deinst

5

To jest podpisana normalizacja

1 - uzyskać minimalne i maksymalne wartości na liście (MINVAL, MAXVAL)

2 - Konwersja każdy numer używając tego wyrażenia signedNormal = (((originalNumber - Minimum)/(maksymalna - minimalna)) * 2.0) - 1,0

ja celowo to nieefektywne, aby być jasne - bardziej efektywne byłoby

double min = myList.GetMinimum(); 
double max = myList.GetMaximum(); 
double signedRangeInverse = 1.0/(max - min); 
for(int i = 0;i < myList.NumberOfItems();i++) 
    myList[i] = (((myList[i] - min) * signedRangeInverse) * 2.0) - 1 

Nie ma sensu w zakres każdym razem przeliczania sensu zakres podziału, mult jest szybsza

1

Jeśli chcesz 0 do nadal równe 0 w efekcie końcowym:

  1. Znajdź liczbę o największej wielkości. Spowoduje to zmianę na 1 lub -1.
  2. Sprawdź, na czym polega pomnożenie przez 1 lub -1.
  3. Pomnożyć wszystkie liczby w kolekcji przez ten czynnik.

Np

[ -5, -3, -1, 0, 2, 4] 

Numer z największych wielkości wynosi -5. Możemy to uzyskać równe -1 przez pomnożenie przez 0,2 (-1/-5). (Uważaj na dzielenie przez 0s, jeśli twoje liczby są zerowe.)

Pomnożyć wszystkie elementy przez 0,2.Dałoby to:

[-1, -0.6, -0.2, 0, 0.4, 0.8] 

Chociaż uwaga że

[ -5, -5, -5 ] -> [ -1, -1, -1 ] 

i

[ 5, 5, 5 ] -> [ 1, 1, 1 ] 

i

[ 0, 0, 0 ] -> [ 0, 0, 0 ] 

które mogą lub nie mogą być, co chcesz. Dzięki @Hammerite za podpowiadanie mnie tym z jego bardzo pomocnym komentarzem :)