¿Existe una fórmula para una curva en forma de s con dominio y rango [0,1]


10

Básicamente quiero convertir las medidas de similitud en pesos que se usan como predictores. Las similitudes estarán en [0,1], y restringiré los pesos para que también estén en [0,1]. Me gustaría una función paramterica que haga este mapeo que probablemente optimizaré usando el descenso de gradiente. Los requisitos son que 0 se asigne a 0, 1 se asigne a 1 y aumente estrictamente. También se aprecia una derivada simple. Gracias por adelantado

Editar: Gracias por las respuestas hasta el momento, son muy útiles. Para aclarar mi propósito, la tarea es la predicción. Mis observaciones son vectores extremadamente dispersos con una sola dimensión para predecir. Mis dimensiones de entrada se utilizan para calcular la similitud. Mi predicción es entonces una suma ponderada del valor de otras observaciones para el predictor donde el peso es una función de similitud. Estoy limitando mis pesos en [0,1] por simplicidad. Es de esperar que ahora sea obvio por qué necesito 0 para mapear a 0, 1 para mapear a 1, y para que sea estrictamente creciente. Como whuber ha señalado, el uso de f (x) = x cumple con estos requisitos y en realidad funciona bastante bien. Sin embargo, no tiene parámetros para optimizar. Tengo muchas observaciones para poder tolerar muchos parámetros. Codificaré manualmente el descenso del gradiente, de ahí mi preferencia por una derivada simple.

Por ejemplo, muchas de las respuestas dadas son simétricas acerca de .5. Sería útil tener un parámetro para desplazarse hacia la izquierda / derecha (como con la distribución beta)


44
satisface cada uno de sus requisitos. f(x)=x
whuber

He agregado un poco en respuesta a su edición sobre el control del desplazamiento de izquierda a derecha. Las tres familias de ejemplo en mi foto tienen una forma directa de controlar eso.
Glen_b: reinstala a Monica

Respuestas:


8

Aquí hay uno:

y=11+(x1x)β

donde es > 0β>0

[! [] [1]] 2


tanhsin

Hola Darkmoor, obtuve esta ecuación jugando con la "función de logit inverso". Puede ver que se parece a y = logit inverso (x) = 1 / (1 + e ^ -x) Debido a que logit se asigna a (0,1) imgur.com/a/H0kGF
Ismam Huda

2
Puede agregar un nivel adicional de ajuste para poder ajustar la posición en la que la función es igual a .5 usando y = 1 / (1+ (x ^ r / (1-x ^ r)) ^ - b) . Luego, para lograr y = .5 en x0, configure r = -log (2) / log (x0). O, si desea asegurarse de que y = k para alguna k entre 0 y 1 en x = x0, configure 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

Esta función no asigna 1 -> 1. De hecho, f -> 1 como x -> ∞. Dependiendo de k, el valor de f en x = 1 puede ser bastante pequeño, pero nunca será exactamente 0. De hecho, esa es la razón principal para usar e ^ ... en el denominador, es decir, para que el dominio relevante sea [0, ∞) en lugar de [0,1].
wmsmith

7

Permítame ofrecerle la solución más general consistente con los requisitos: eso le dará la mayor flexibilidad para elegir y optimizar.

Podemos interpretar "en forma de S" como una curva monotónicamente creciente (porque la transformación debe ser de uno a uno) que consiste en una parte cóncava hacia arriba y otra parte cóncava hacia abajo. Podemos centrarnos en hacer que la mitad izquierda sea cóncava hacia abajo, porque el otro tipo (con la mitad izquierda cóncava hacia arriba) se obtiene invirtiendo tales transformaciones.

ff

f

Esta segunda derivada puede hacer prácticamente cualquier cosa : todo lo que necesitamos es que

  • es integrable

  • [0,k)

  • (k,1]

f

f

f(x)=0xf(t)dt

y

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

Para qué está tratando de usar esto no me resulta particularmente claro, así que no puedo decir si tiene sentido hacerlo, pero cumplir con todos sus criterios parece ser bastante trivial.

  • curva en forma de s

  • función paramétrica

  • 0 mapas a 0, 1 mapas a 1, aumentando estrictamente

  • derivada simple

Entonces, ¿por qué no simplemente tomar cualquier familia específica conveniente de distribuciones continuas * unimodales en [0,1] cuyo pdf es "simple"? Eso parece cumplir con cada parte de lo que enumeras allí.

* (cuyo modo está limitado desde los puntos finales)

  • curva en forma de s: garantizada por unimodalidad (con modo no en puntos finales)

  • paramétrico: al proporcionar cualquier familia específica que tenga parámetros

  • 0 asigna a 0, 1 asigna a 1 estrictamente en aumento: eso es lo que hacen las funciones de distribución en [0,1]; solo necesita que la densidad sea> 0 in (0,1)

  • derivada simple: ese es el pdf, por lo que si el pdf es "simple" según el criterio que le convenga, ya está.

Hay (como dijo Alex R) un número infinito de estos. La versión beta que menciona es obvia, pero el cdf es la función beta incompleta, por lo que necesitaría algo para evaluar eso: es una función estándar en muchos paquetes (incluidos casi todos los paquetes de estadísticas decentes), así que dudo que eso sea ser dificil. Sin embargo, tenga en cuenta que no todas las versiones beta son unimodales (con el modo no en los extremos), por lo que la familia también incluye archivos cdf que no tienen forma de "s".

Aquí hay fotos de tres familias razonablemente simples:

ingrese la descripción de la imagen aquí

Hay muchas otras opciones y se pueden construir fácilmente otras nuevas.

-

En respuesta a la edición de la pregunta:

c=12μαβαα+β12

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.