Esiste una formula per una curva a forma di S con dominio e intervallo [0,1]


10

Fondamentalmente voglio convertire le misure di somiglianza in pesi che sono usati come predittori. Le somiglianze saranno su [0,1] e limiterò anche i pesi su [0,1]. Vorrei una funzione parametrica che esegue questa mappatura che probabilmente ottimizzerò usando la discesa gradiente. I requisiti sono 0 mappe su 0, 1 mappe su 1 ed è strettamente crescente. Un derivato semplice è anche apprezzato. Grazie in anticipo

Modifica: grazie per le risposte finora, quelle sono molto utili. Per rendere più chiaro il mio scopo, il compito è la previsione. Le mie osservazioni sono vettori estremamente radi con un'unica dimensione su cui prevedere. Le mie dimensioni di input vengono utilizzate per calcolare la somiglianza. La mia previsione è quindi una somma ponderata del valore di altre osservazioni per il predittore in cui il peso è una funzione di somiglianza. Sto limitando i miei pesi su [0,1] per semplicità. Si spera ora ovvio perché ho bisogno di 0 per mappare a 0, 1 per mappare a 1 e che sia strettamente crescente. Come ha sottolineato whuber, usare f (x) = x soddisfa questi requisiti e in realtà funziona abbastanza bene. Tuttavia non ha parametri da ottimizzare. Ho molte osservazioni, quindi posso tollerare molti parametri. Codificherò a mano la discesa del gradiente, quindi la mia preferenza per un derivato semplice.

Ad esempio, molte delle risposte fornite sono simmetriche su 0,5. Sarebbe utile avere un parametro per spostare sinistra / destra (come con la distribuzione beta)


4
soddisfa tutti i tuoi requisiti. f(x)=x
whuber

Ho aggiunto un po 'in risposta alla tua modifica sul controllo dello spostamento da sinistra a destra. Tutte e tre le famiglie di esempio nella mia foto hanno un modo diretto per controllarlo.
Glen_b

Risposte:


8

Eccone uno:

y=11+(x1x)β

dove è > 0β>0

[! [] [1]] 2


È una funzione standard come la di s i n ? Sono interessato a identificarlo nel matrimonio ma non ci sono riuscito. Potresti per favore fornire un riferimento? tanhsin
Darkmoor

Ciao Darkmoor, ho ottenuto questo equoion giocando con la "funzione inversa logit". Puoi vedere che assomiglia a y = inverso logit (x) = 1 / (1 + e ^ -x) Perché il logit è mappato a (0,1) imgur.com/a/H0kGF
Ismam Huda

2
È possibile aggiungere un ulteriore livello di regolazione in modo da poter regolare la posizione in cui la funzione è uguale a 0,5 utilizzando y = 1 / (1+ (x ^ r / (1-x ^ r)) ^ - b) . Quindi, per ottenere y = .5 su x0 impostare r = -log (2) / log (x0). Oppure, se vuoi assicurarti che y = k per qualche k tra 0 e 1 su x = x0, imposta r = -log ((1 / k - 1) ^ (1 / b) +1) / log (x0)
wmsmith

7

f(x)=x

11+ek(x0.5)

kkf(0)f(1)k=20f(0)=4.539787e05f(1)=0.9999546

kek(x0.5)(1+ek(x0.5))2

Questa funzione non mappa 1 -> 1. In effetti, f -> 1 come x -> ∞. A seconda di k il valore di f in x = 1 può essere piuttosto piccolo, ma non sarà mai esattamente 0. In realtà, questo è il motivo principale per usare e ^ ... nel denominatore, cioè in modo che il dominio pertinente sia [0, ∞) invece di [0,1].
wmsmith

7

Lascia che ti offra la soluzione più generale coerente con i requisiti: che ti darà la massima flessibilità di scelta e ottimizzazione.

Possiamo interpretare "a forma di S" come una curva monotonicamente crescente (perché la trasformazione dovrebbe essere una a una) costituita da una parte che è concava verso l'alto e un'altra parte che è concava verso il basso. Possiamo concentrarci sul rendere la metà sinistra concava verso il basso, perché l'altro tipo (con la metà sinistra concava verso l'alto) si ottiene capovolgendo tali trasformazioni.

ff

f

Questo secondo derivato può fare praticamente qualsiasi cosa : tutto ciò di cui abbiamo bisogno è quello

  • è integrabile,

  • [0,k)

  • (k,1]

f

f

f(x)=0xf(t)dt

e

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

fff(0)f(1)=CfC


f

figura

f[0,k)(k,1]R

ffff

fff

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")

7

Quello per cui stai cercando di usarlo non è particolarmente chiaro per me, quindi non posso dire se abbia senso farlo, ma soddisfare tutti i tuoi criteri sembra essere abbastanza banale.

  • curva a forma di s

  • funzione parametrica

  • 0 mappe su 0, 1 mappe su 1, in forte aumento

  • derivato semplice

Quindi perché non prendere semplicemente una famiglia specifica conveniente di distribuzioni unimodali * continue su [0,1] il cui pdf è "semplice"? Questo sembra soddisfare ogni parte di ciò che elenchi lì.

* (la cui modalità è delimitata dagli endpoint)

  • curva a forma di s - garantita da unimodalità (con modalità non agli endpoint)

  • parametrico: fornendo una famiglia specifica con parametri

  • Da 0 a 0, da 1 a 1 strettamente crescente, ecco cosa fanno le funzioni di distribuzione su [0,1]; hai solo bisogno che la densità sia> 0 in (0,1)

  • derivata semplice - questo è il pdf, quindi se il pdf è "semplice" per qualunque criterio ti si adatti, il gioco è fatto.

Ci sono (come ha affermato Alex R) un numero infinito di questi. La beta che menziona è ovvia, ma il cdf è la funzione beta incompleta, quindi avresti bisogno di qualcosa per valutarla --- è una funzione standard in molti pacchetti (compresi quasi tutti i pacchetti di statistiche decenti), quindi dubito che lo farà essere difficile. Si noti tuttavia che non tutti i beta sono unimodali (con modalità non alle estremità), quindi la famiglia comprende anche file PDF che non sono a "s".

Ecco le foto di tre famiglie ragionevolmente semplici:

inserisci qui la descrizione dell'immagine

Ci sono molte altre scelte e quelle nuove possono essere facilmente costruite.

-

In risposta alla modifica alla domanda:

c=12μαβαα+β12

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.