Existe uma fórmula para uma curva em forma de s com domínio e intervalo [0,1]

10

Basicamente, quero converter medidas de similaridade em pesos que são usados ​​como preditores. As semelhanças estarão em [0,1], e restringirei os pesos para também estar em [0,1]. Gostaria de uma função paramétrica que faça esse mapeamento que provavelmente otimizarei usando a descida de gradiente. Os requisitos são que 0 mapeie para 0, 1 mapeie para 1 e esteja aumentando estritamente. Um derivado simples também é apreciado. desde já, obrigado

Edit: Obrigado pelas respostas até agora, essas são muito úteis. Para deixar meu objetivo mais claro, a tarefa é previsão. Minhas observações são vetores extremamente esparsos com uma única dimensão para prever. Minhas dimensões de entrada são usadas para calcular a similaridade. Minha previsão é então uma soma ponderada do valor de outras observações para o preditor em que o peso é uma função da similaridade. Estou limitando meus pesos em [0,1] por simplicidade. Espero que seja óbvio agora porque eu exijo que 0 seja mapeado para 0, 1 para mapeado para 1 e que ele seja estritamente aumentado. Como o whuber apontou, usar f (x) = x atende a esses requisitos e realmente funciona muito bem. No entanto, não possui parâmetros para otimizar. Tenho muitas observações para poder tolerar muitos parâmetros. Vou codificar manualmente a descida do gradiente, daí a minha preferência por uma derivada simples.

Por exemplo, muitas das respostas dadas são simétricas em torno de 0,5. Seria útil ter um parâmetro para mudar para esquerda / direita (como na distribuição beta)

user117053
fonte
4
f(x)=x satisfaz todos os seus requisitos.
whuber
Adicionei um pouco em resposta à sua edição sobre como controlar a mudança da esquerda para a direita. Todas as três famílias de exemplos na minha foto têm uma maneira direta de controlar isso.
Glen_b -Reinstala Monica

Respostas:

8

Aqui está um:

y=11+(x1x)β

onde é > 0β>0

[! [] [1]] 2

Ismam Huda
fonte
Essa é uma função padrão como a de s i n ? Estou interessado em identificá-lo no casamento, mas não consegui. Poderia, por favor, dar uma referência? tanhsin
Darkmoor
Oi Darkmoor, eu consegui essa equação brincando com a "função de logit inversa". Você pode ver que ele se assemelha a y = logit inverso (x) = 1 / (1 + e ^ -x) Como o logit é mapeado para (0,1) imgur.com/a/H0kGF
Ismam Huda
2
Você pode adicionar um nível extra de ajuste para ajustar a posição na qual a função é igual a 0,5 usando y = 1 / (1+ (x ^ r / (1-x ^ r)) ^ - b) . Então, para atingir y = 0,5 em x0, defina r = -log (2) / log (x0). Ou, se você deseja garantir que y = k para alguns k entre 0 e 1 em x = x0, defina r = -log ((1 / k - 1) ^ (1 / b) +1) / log (x0)
Wmsmith
7

Como já comentado por @whuber, a função atende aos três requisitos mencionados (ou seja, 0 mapeia para 0, 1 mapeia para 1 e a função está aumentando estritamente). No título da sua pergunta, você parece indicar que também está interessado na função em forma de S, como na curva Sigmoide / Logística. Isso está correto? Nesse caso, você certamente deve tentar a seguinte função logística, que atenderá aproximadamente aos quatro critérios especificados: 1f(x)=x .

11+ek(x0.5)

O nesta equação controlará a inclinação da sua curva. Alterar k também irá permitir que você controle o quão perto f ( 0 ) e f ( 1 ) estão a 0 e 1, respectivamente. Por exemplo, para k = 20 , F ( 0 ) = 4,539787 E - 05 e f ( 1 ) = 0,9999546 .kkf(0)f(1)k=20f(0)=4.539787e05f(1)=0.9999546

A derivada dessa função é facilmente calculada como:

kek(x0.5)(1+ek(x0.5))2
user3487564
fonte
Esta função não mapeia 1 -> 1. De fato, f -> 1 como x -> ∞. Dependendo de k, o valor de f em x = 1 pode ser bem pequeno, mas nunca será exatamente 0. Na verdade, essa é a principal razão para usar e ^ ... no denominador, ou seja, para que o domínio relevante seja [0, ∞) em vez de [0,1].
Wmsmith 13/05/19
7

Deixe-me oferecer a solução mais geral consistente com os requisitos: isso lhe dará mais flexibilidade para escolher e otimizar.

Podemos interpretar "em forma de S" como uma curva monotonicamente crescente (porque a transformação deve ser individual), consistindo em uma parte que é côncava para cima e outra que é côncava para baixo. Podemos nos concentrar em tornar a metade esquerda côncava para baixo, porque o outro tipo (com a metade esquerda côncava para cima) é obtido através da inversão de tais transformações.

ff

f

Essa segunda derivada pode fazer praticamente qualquer coisa : tudo o que precisamos é que

  • é integrável,

  • [0,k)

  • (k,1]

f

f

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

e

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

fff(0 0)f(1 1)=CfC


f

Figura

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

ffff

fff

Aliás, a solução surge configurando ff(x)=xf(x)=0 0ff1 10 0ff(x)=1 1-x

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
fonte
7

O que você está tentando usar isso não está particularmente claro para mim, então não posso dizer se faz sentido fazer, mas cumprir todos os seus critérios parece ser bastante trivial.

  • curva em forma de s

  • função paramétrica

  • 0 mapas para 0, 1 mapas para 1, aumentando estritamente

  • derivada simples

Então, por que não pegar uma família específica conveniente de distribuições unimodais * contínuas em [0,1] cujo pdf é "simples"? Isso parece cumprir todas as partes do que você lista lá.

* (cujo modo é delimitado dos pontos finais)

  • curva em forma de s - garantida pela unimodalidade (com o modo fora dos pontos finais)

  • paramétrico - fornecendo qualquer família específica que possua parâmetros

  • 0 mapeia para 0, 1 mapeia para 1 aumentando estritamente - é o que as funções de distribuição em [0,1] fazem; você só precisa que a densidade seja> 0 in (0,1)

  • derivada simples - esse é o pdf; portanto, se o pdf for "simples" de acordo com o critério que melhor lhe convier, estará pronto.

Existem (como Alex R afirmou) um número infinito deles. A versão beta que ele menciona é óbvia, mas o cdf é a função beta incompleta, então você precisa de algo para avaliar isso - é uma função padrão em muitos pacotes (incluindo quase todos os pacotes de estatísticas decentes), por isso duvido que seja difícil. Observe, no entanto, que nem todos os betas são unimodais (com o modo não nas extremidades); portanto, a família também abrange cdfs que não têm o formato "s".

Aqui estão fotos de três famílias razoavelmente simples:

insira a descrição da imagem aqui

Existem muitas outras opções e novas podem ser facilmente construídas.

-

Em resposta à edição da pergunta:

c=1 12μα-βαα+β-1 12

Glen_b -Reinstate Monica
fonte