Jak reprezentować niezwiązaną zmienną jako liczbę między 0 a 1

28

Chcę reprezentować zmienną jako liczbę z przedziału od 0 do 1. Zmienna jest nieujemną liczbą całkowitą bez nieodłącznego wiązania. Odwzorowuję 0 na 0, ale co mogę odwzorować na 1 lub liczby od 0 do 1?

Mógłbym użyć historii tej zmiennej, aby podać limity. Oznaczałoby to, że muszę powtórzyć stare statystyki, jeśli maksimum wzrośnie. Czy muszę to zrobić, czy są inne sztuczki, o których powinienem wiedzieć?

Russell Gallop
źródło
6
Ponieważ dowolna funkcja nieodkręcania od załatwi sprawę , masz dużą elastyczność. Ale niektóre metody będą lepsze niż inne, w zależności od aplikacji. Jaki jest twój cel w poszukiwaniu takiego ponownego wyrażenia? [0,)[0,1]
whuber
1
Mierzę zawartość w wielu różnych wymiarach i chcę być w stanie dokonać porównań pod względem znaczenia danego fragmentu treści. Ponadto chcę wyświetlać wartości w tych wymiarach, które są zrozumiałe i łatwe do zrozumienia.
Spencer,
1
@Spencer Dokładnie jak mierzysz zawartość i „trafność”? Np. W dowolnych skalach, takich jak liczby, proporcje, częstotliwości wyświetleń, korelacje z inną treścią itp. Itp. Różne rodzaje pomiarów korzystają z różnego rodzaju powtórzeń.
whuber
1
Mierzę je w dowolnych skalach. Ile lat ma treść. Ile „punktów” otrzymuje część treści. Zgłaszane „zainteresowanie” w dziedzinie treści.
Spencer
2
Jedną z najprostszych transformacji, których można użyć, jest konwersja danych na wyniki kwantylowe.
charles.y.zheng

Odpowiedzi:

34

Bardzo popularną sztuczką (np. W modelowaniu łącznikowym) jest użycie hiperbolicznej stycznej tanh jako „funkcji zgniatania”. Automatycznie dopasowuje wszystkie liczby do przedziału od -1 do 1. Co w twoim przypadku ogranicza zakres od 0 do 1. W ri matlabdostajesz to przez tanh().

Inną funkcją zgniatania jest funkcja logistyczna (dzięki Simonowi za nazwę), zapewniona przez , która ogranicza zakres od 0 do 1 (z 0 zamapowanymi na. 5). Musisz więc pomnożyć wynik przez 2 i odjąć 1, aby dopasować swoje dane do przedziału od 0 do 1.f(x)=1/(1+ex)

Oto prosty kod R przedstawiający obie funkcje (tanh na czerwono, logistycznie na niebiesko), dzięki czemu można zobaczyć, jak obie squash:

x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")
Henrik
źródło
Dzięki za odpowiedź. To rozwiązuje problem ograniczania się. W przypadku moich danych wartość ta bardzo szybko spada do 1, więc myślę, że następną rzeczą, którą muszę zrobić, jest skalowanie tych informacji, aby skoncentrować się na interesującym zakresie, który mógłbym zrobić na podstawie ich historii bez obawy, że opuścisz granicę, po prostu osiągam limit.
Russell Gallop
25

Jak często moim pierwszym pytaniem było „ dlaczego chcesz to zrobić”, potem zobaczyłem, że odpowiedziałeś już na to w komentarzach do pytania: „ Mierzę zawartość w wielu różnych wymiarach i chcę być jestem w stanie dokonać porównań pod względem trafności danego fragmentu treści. Ponadto chcę wyświetlać wartości w tych wymiarach, które są zrozumiałe i łatwe do zrozumienia ”.

Nie ma powodu, aby znormalizować dane, aby maksimum wynosiło 1, a min było zero, aby to osiągnąć, i moim zdaniem jest to ogólnie zły pomysł . Wartości maksymalne lub minimalne mogą bardzo łatwo być wartościami odstającymi , które nie są reprezentatywne dla rozkładu populacji. @osknows rozstanie się z uwagą na temat korzystania wyników Z jest znacznie lepszym pomysłemz . Wyniki (znane również jako standardowe wyniki) normalizują każdą zmienną przy użyciu odchylenia standardowego, a nie zakresu. Na odchylenie standardowe mniej mają wpływ wartości odstające. Aby użyćzzz- wyniki, najlepiej, aby każda zmienna miała mniej więcej normalny rozkład lub przynajmniej miała mniej więcej symetryczny rozkład (tzn. nie jest poważnie przekrzywiony), ale w razie potrzeby możesz najpierw zastosować odpowiednią transformację danych , aby to osiągnąć; którą transformację zastosować, można znaleźć poprzez znalezienie najlepiej pasującej transformacji Box – Cox .

jeden przystanek
źródło
więc nie ma to nic wspólnego z narzucaniem danych do i ogólnie zgadzam się ze standaryzacją, jeśli autor naprawdę tego szuka :) Odpowiedziałem przed pojawieniem się dyskusji, więc prawdopodobnie usuwam moją odpowiedź, jeśli ta jest poprawne :)[0,1]
Dmitrij Celov
1
Jeśli martwisz się wartościami odstającymi, możesz rozważyć zastosowanie mediany bezwzględnego odchylenia (od mediany) zamiast odchylenia standardowego. W R użyj mad()funkcji. A jeśli martwisz się skośnością, możesz użyć szeregów danych zamiast oryginalnych obserwacji. W R, to byłoby rank(), ale jeśli ktoś ma zamiar to wykorzystać na nowych danych, ecdf()byłoby lepszym rozwiązaniem ( ecdf(x)powraca nowa funkcja, która w zasadzie daje wartość dla -quantile od , na przykład 0 (naprawdę ) do najniższej wartości , do najwyższej wartości, 0,5 do mediany itp.)p x 1 / n x 1ppx1/nx1
Karl Ove Hufthammer
10

Każda funkcja sigmoidalna będzie działać:

Simon Byrne
źródło
erf nie jest bardzo przydatną funkcją, pod warunkiem, że nie chcesz raczej używać go jako pochodnej.
Skończyło się na użyciu prostej funkcji logistycznej z kilkoma drobnymi poprawkami: (1 / (1 + java.lang.Math.exp (-1 * (czynnik * i))) - 0,5) * 2. Wybrałem współczynnik 0,05, który wydaje się działać dobrze dla i od 0 do kilkuset.
Jilles van Gurp
1,0 / (1,0 + exp (-1,69897 * (x-średnia (x)) / sd (x))) jest bliskim przybliżeniem do pnorma
Chris
3

Oprócz dobrych sugestii Henrika i Simona Byrne, możesz użyć f (x) = x / (x + 1). Dla porównania, funkcja logistyczna wyolbrzymia różnice, gdy x rośnie. Oznacza to, że różnica między f (x) i f (x + 1) będzie większa przy funkcji logistycznej niż przy f (x) = x / (x + 1). Możesz lub nie chcesz tego efektu.


źródło
1

Aby dodać do innych odpowiedzi sugerujących pnorm ...

Dla potencjalnie optymalnej metody wyboru parametrów sugeruję to przybliżenie dla pnorm.

1.0/(1.0+exp(-1.69897*(x-mean(x))/sd(x)))

dziwne

Jest to zasadniczo normalizacja Softmax.

Odwołaj Pnorm w mgnieniu oka

Chris
źródło
1

Są dwa sposoby realizacji tego, z których często korzystam. Zawsze pracuję z danymi w czasie rzeczywistym, więc zakłada to ciągłe wprowadzanie danych. Oto pseudo-kod:

Używając trenowalnego minmax:

define function peak:
    // keeps the highest value it has received

define function trough:
    // keeps the lowest value it has received

define function calibrate:
    // toggles whether peak() and trough() are receiving values or not

define function scale:
    // maps input range [trough.value() to peak.value()] to [0.0 to 1.0]

Ta funkcja wymaga, abyś albo przeprowadził wstępną fazę szkolenia (przy użyciu calibrate()), albo abyś ponownie trenował w określonych odstępach czasu lub zgodnie z określonymi warunkami. Wyobraź sobie na przykład taką funkcję:

define function outBounds (val, thresh):
    if val > (thresh*peak.value()) || val < (trough.value() / thresh):
        calibrate()

wartości szczytowe i minimalne zwykle nie przyjmują wartości, ale jeśli outBounds()otrzyma wartość, która jest ponad 1,5 razy większa niż aktualny pik lub mniejsza niż bieżąca wartość dolna podzielona przez 1,5, wówczas calibrate()wywoływana jest funkcja, która pozwala na automatyczną ponowną kalibrację funkcji.

Używając historycznego minmax:

var arrayLength = 1000
var histArray[arrayLength]

define historyArray(f):
    histArray.pushFront(f) //adds f to the beginning of the array

define max(array):
    // finds maximum element in histArray[]
    return max

define min(array):
    // finds minimum element in histArray[]
    return min

define function scale:
    // maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]

main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element
taras
źródło
Wszystko to można zaimplementować w Max / MSP / Jitter za pomocą obiektów [szczyt] i [koryto] w pierwszym przykładzie oraz za pomocą [jit.3m] w drugim przykładzie.
taras
0

Bardzo prostą opcją jest podzielenie każdej liczby w danych przez największą liczbę w danych. Jeśli masz wiele małych liczb i kilka bardzo dużych, może to źle przekazać informacje. Ale to stosunkowo łatwe; jeśli uważasz, że znaczące informacje zostaną utracone podczas przedstawiania takich danych na wykresach, możesz wypróbować jedną z bardziej wyrafinowanych technik sugerowanych przez innych.

DanB
źródło