Czy istnieje wzór na krzywą w kształcie litery S z dziedziną i zakresem [0,1]

10

Zasadniczo chcę przekształcić miary podobieństwa w wagi, które są używane jako predyktory. Podobieństwa będą dotyczyć [0,1], a ja ograniczę wagi również do [0,1]. Chciałbym funkcji paramterycznej, która wykonuje to mapowanie, które prawdopodobnie zoptymalizuję za pomocą spadku gradientu. Wymagania są takie, że 0 map do 0, 1 map do 1 i będzie się stale zwiększać. Doceniana jest również prosta pochodna. Z góry dziękuję

Edycja: Dzięki za dotychczasowe odpowiedzi, są bardzo pomocne. Aby wyjaśnić mój cel, zadaniem jest przewidywanie. Moje obserwacje to bardzo rzadkie wektory z jednym wymiarem do przewidzenia. Moje wymiary wejściowe służą do obliczania podobieństwa. Moje przewidywanie jest wówczas ważoną sumą wartości innych obserwacji dla predyktora, gdzie waga jest funkcją podobieństwa. Dla uproszczenia ograniczam swoje wagi do [0,1]. Mam nadzieję, że teraz jest oczywiste, dlaczego potrzebuję 0, aby zmapować do 0, 1, aby zmapować do 1, i aby ściśle rosła. Jak zauważył whuber, użycie f (x) = x spełnia te wymagania i faktycznie działa całkiem dobrze. Jednak nie ma parametrów do optymalizacji. Mam wiele obserwacji, więc mogę tolerować wiele parametrów. Będę ręcznie kodować spadek gradientu, stąd moja preferencja dla prostej pochodnej.

Na przykład wiele podanych odpowiedzi jest symetrycznych względem .5. Przydałby się parametr do przesuwania w lewo / w prawo (np. Z rozkładem wersji beta)

użytkownik117053
źródło
4
f(x)=x spełnia wszystkie Twoje wymagania.
whuber
Dodałem trochę w odpowiedzi na twoją edycję dotyczącą sterowania przesunięciem lewo-prawo. Wszystkie trzy przykładowe rodziny na moim zdjęciu mają bezpośredni sposób na kontrolowanie tego.
Glen_b

Odpowiedzi:

8

Tutaj jest jeden:

y=11+(x1x)β

gdzie jestβ>0

[! [] [1]] 2

Ismam Huda
źródło
Czy jest to standardowa funkcja jak od ? Jestem zainteresowany zidentyfikowaniem tego na ślubie, ale nie mogłem. Czy możesz podać referencje? tanhsin
Darkmoor
Cześć Darkmoor, dostałem to równanie, grając z „funkcją odwrotnego logowania”. Widać, że przypomina y = odwrotny logit (x) = 1 / (1 + e ^ -x) Ponieważ logit odwzorowuje na (0,1) imgur.com/a/H0kGF
Ismam Huda
2
Możesz dodać dodatkowy poziom regulacji, aby dostroić pozycję, w której funkcja jest równa .5, używając y = 1 / (1+ (x ^ r / (1-x ^ r)) ^ - b) . Następnie, aby osiągnąć y = .5 przy x0, ustaw r = -log (2) / log (x0). Lub jeśli chcesz upewnić się, że y = k dla pewnego k pomiędzy 0 a 1 przy x = x0, to ustaw r = -log ((1 / k - 1) ^ (1 / b) +1) / log (x0)
wmsmith
7

Jak już skomentował @whuber, funkcja spełnia trzy wymienione przez ciebie wymagania (tj. 0 map do 0, 1 map do 1, a funkcja ściśle się zwiększa). W tytule twojego pytania wydajesz się wskazywać, że interesuje Cię również funkcja w kształcie litery S, jak w krzywej Sigmoid / Logistic. Czy to jest poprawne? W takim przypadku z pewnością powinieneś wypróbować następującą funkcję logistyczną, która w przybliżeniu spełni wszystkie 4 określone kryteria: .f(x)=x

11+ek(x0.5)

w równaniu będzie kontrolować nachylenie swojej krzywej. Zmiana będzie również pozwalają kontrolować, jak blisko i są na 0 i 1, odpowiednio. Na przykład w przypadku , i .kkf(0)f(1)k=20f(0)=4.539787e05f(1)=0.9999546

Pochodną tej funkcji można łatwo obliczyć jako: Więcej informacji na temat tej funkcji można można znaleźć na https://en.wikipedia.org/wiki/Logistic_function

kek(x0.5)(1+ek(x0.5))2
użytkownik3487564
źródło
Ta funkcja nie odwzorowuje 1 -> 1. W rzeczywistości f -> 1 jako x -> ∞. W zależności od k wartość f przy x = 1 może być dość mała, ale nigdy nie będzie dokładnie równa 0. W rzeczywistości jest to główny powód używania e ^ ... w mianowniku, tj. Tak, że odpowiednią domeną jest [0, ∞) zamiast [0,1].
wmsmith
7

Pozwól, że przedstawię najbardziej ogólne rozwiązanie zgodne z wymaganiami: zapewni Ci największą elastyczność w wyborze i optymalizacji.

Możemy interpretować „w kształcie litery S” jako monotonicznie rosnącą krzywą (ponieważ transformacja powinna być jeden do jednego) składająca się z jednej części wklęsłej w górę i drugiej części wklęsłej w dół. Możemy skupić się na uczynieniu lewej połowy wklęsłym, ponieważ drugi typ (z lewą połówką wklęsłą do góry) uzyskuje się poprzez odwrócenie takich przekształceń.

Ponieważ transformacja ma być różniczkowalna, musi zatem mieć malejącą pochodną w lewej połowie i rosnącą pochodną w prawej połowie. Niezależnie od tego pochodna musi być nieujemna i może wynosić zero tylko w izolowanym punkcie (jeśli w ogóle: minimalna wartość pochodnej daje najmniejszy spadek transformacji).ff

Nie jest wymagane, aby pochodna była różniczkowalna, ale w praktyce możemy przypuszczać, że jest różniczkowalna prawie wszędzie z pochodną . f

Ta druga pochodna może zrobić praktycznie wszystko : potrzebujemy tylko tego

  • jest całkowalne,

  • jest mniejsze lub równe zero dla wszystkich wartości w pewnym przedziale po lewej stronie , i[0,k)

  • jest większe lub równe zero dla wszystkich wartości w prawym przedziale .(k,1]

Takie funkcje (i ich odwrotności) parametryzują zestaw wszystkich rozwiązań. f (Istnieje pewna redundancja: zajmuje się nią ostatni etap normalizacji opisany poniżej.)

Fundamentalne twierdzenie rachunku całkowego pozwala nam odzyskać z dowolnej takiej specyfikacji. To jest,f

f(x)=0xf(t)dt

i

f(x)=0xf(t)dt.

Warunki na gwarancji, że wzrasta monotonicznie od jego minimim do pewnego maksymalnego . Wreszcie, normalizacja przez podzielenie wartości poprzedniego całki przez .fff(0)f(1)=CfC


Oto ilustracja rozpoczynająca się od wersji losowego przejścia dla drugiej pochodnej. W nim pochodne nie zostały znormalizowane, ale transformacja została.f

Postać

Aby zastosować to podejście, możesz zacząć od wyrażenia analitycznego dla , być może zróżnicowanego o skończoną liczbę parametrów. Możesz to również określić, podając punkty na wykresie i interpolując między nimi - pod warunkiem, że interpolator przestrzega ujemności wartości na i dodatniej na . do wygenerowania ilustracji. Odpowiedni kod (poniżej) zawiera szczegóły obliczeń.f[0,k)(k,1]R

Takie podejście pozwala zaprojektować dowolną transformację. Możesz zacząć od szkicowania krzywej S, oszacowania jej (względnych) nachyleń , a następnie oszacowania jej nachyleń. Określ aby dopasować to ostatnie zdjęcie, a następnie przejdź do obliczenia a następnie .ffff

Zauważ, że które są najpierw wklęsłe w górę, a następnie wklęsłe w dół, można również uzyskać, negując na początku . Krytycznym warunkiem utworzenia krzywej w kształcie litery S jest to, że (poza możliwymi skokami na zbiorze miary zero) może faktycznie przekroczyć zero.fff

Nawiasem mówiąc, rozwiązanie powstaje przez ustawienie prawie wszędzie, co powoduje, że stała i dodatnia, skąd jest liniowy; normalizacja zapewnia, że ​​nachylenie wynosi a punkt przecięcia wynosi . (Ustawienie stałej stałą i ujemną daje rozwiązanie .)f(x)=xf(x)=0ff10ff(x)=1x

n <- 51                      # Number of interpolation points
k.1 <- floor(n * 2/3)        # Width of the left-hand interval
k.2 <- n - k.1               # ............ right-hand interval
x <- seq(0, 1, length.out=n) # x coordinates
set.seed(17)

# Generate random values of the second derivative that are first negative,
# then positive.  Modify to suit.
y.2 <- (c(runif(k.1, -1, 0), 0.5*runif(k.2, 0, 1))) * abs(cos(3*pi * x)) + 
  c(rep(-.1, k.1), rep(.5,k.2))

# Recover the first derivative and then the transformation.  Control the 
# minimum slope of the transformation.
y.1 <- cumsum(y.2)
y.1 <- y.1 - min(y.1) + 0.005 * diff(range(y.1))
y <- cumsum(y.1)
y <- (y - y[1]) / (y[n] - y[1]) # Normalize the transformation

#
# Plot the graphs.
par(mfrow=c(1,3))
plot(x, y.2, type="l", bty="n", main="Second derivative")
points(x, y.2, pch=20, cex=0.5)
abline(h=0, col="Red", lty=3)
plot(x, y.1, type="l", bty="n", lwd=2, main="First derivative")
abline(h=0, col="Red", lty=3)
plot(x, y, type="l", lwd=2, main="Transformation")
Whuber
źródło
7

To, czego próbujesz użyć, nie jest dla mnie szczególnie jasne, więc nie mogę powiedzieć, czy to ma sens, ale spełnienie wszystkich twoich kryteriów wydaje się dość trywialne.

  • krzywa w kształcie litery S.

  • funkcja parametryczna

  • 0 map do 0, 1 map do 1, ściśle rosnących

  • prosta pochodna

Dlaczego więc nie wziąć żadnej wygodnej konkretnej rodziny ciągłych dystrybucji unimodalnych * na [0,1], którego pdf jest „prosty”? Wydaje się, że spełnia każdą część tego, co tam wymienisz.

* (którego tryb jest ograniczony od punktów końcowych)

  • Krzywa w kształcie litery S - gwarantowana przez jednomodalność (z trybem nie w punktach końcowych)

  • parametryczny - przez podanie dowolnej konkretnej rodziny, która ma parametry

  • 0 mapuje na 0, 1 mapuje na 1 ściśle rosnący - to właśnie robią funkcje dystrybucji na [0,1]; wystarczy, że gęstość będzie wynosić> 0 cali (0,1)

  • prosta pochodna - to jest pdf, więc jeśli pdf jest „prosty” według dowolnego kryterium, które Ci odpowiada, to koniec.

Istnieje (jak stwierdził Alex R) nieskończona ich liczba. Wersja beta, o której wspomina, jest oczywista, ale cdf jest niekompletną funkcją beta, więc musisz coś ocenić, to --- jest to standardowa funkcja w wielu pakietach (w tym prawie we wszystkich pakietach z przyzwoitymi statystykami), więc wątpię, aby być trudne. Zauważ jednak, że nie wszystkie bety są jednomodalne (z trybem nie na końcach), więc rodzina obejmuje również pliki cdf, które nie mają kształtu „s”.

Oto zdjęcia trzech stosunkowo prostych rodzin:

wprowadź opis zdjęcia tutaj

Istnieje wiele innych opcji, a nowe można łatwo zbudować.

-

W odpowiedzi na edycję pytania:

Zauważ, że wszystkie trzy rodziny, które narysowałem, mają prosty sposób na uzyskanie przesunięć w lewo-prawo (i) dla rozkładu trójkątnego, parametr bezpośrednio przesuwa krzywą w lewo lub w prawo (tj. Kontroluje stopień asymetrii, jest przypadkiem symetrycznym); dla logitnormal parametr steruje asymetrią; dla dystrybucji beta kontroluje go znak (równoważnie znak ).c=12μαβαα+β12

Glen_b - Przywróć Monikę
źródło