在R中找出S形曲线上的最小和最大梯度范围

时间:2014-07-19 18:17:06

标签: r gradient derivative

首先,这是我的第一个Stack Overflow问题,所以我为违反和礼仪道歉。其次,我意识到这将是非常微不足道的,但我很难过。我试图弄清楚如何在S形曲线上找到最小和最大梯度。

我有一个函数可以生成一个y值的向量,形成一个S形曲线:

#function to generate Sigmoid curves - works better with enough Xs to be smooth
genSigmoid = function(a, b, c, theta){ 

    y = c + ((1-c) / (1 + exp(-a*(theta-b))))
    return(y)

}

x<-c(1:100)

y<-genSigmoid(.25, .50, 0, x)

plot(x, y, type="n")

lines(x, y)

我想要做的是找到此曲线中渐变最小或为零的点以及渐变最大的点。我的最终目标是根据沿曲线的渐变强度,用不同的线条样式绘制此曲线的不同部分。我可以通过“盯着眼球”来产生这些不同的风格。它可以很好地拥有可以更精确地做到这一点的东西。

1 个答案:

答案 0 :(得分:0)

您可以使用包grad(...)中的numDeriv功能执行此操作。

genSigmoid = function(theta,pars){  
  y <- with(pars,c + ((1-c) / (1 + exp(-a*(theta-b)))))
  return(y)
}
x<-c(1:100)
pars <- list(a=0.25, b=0.50, c=0.0)
y<-genSigmoid(x, pars)
plot(x, y, type="l", ylim=c(0,1), col="blue")

library(numDeriv)
z<-grad(genSigmoid,x,pars=pars)
lines(x,z,col="red")

此处zgenSigmoid(...)相对于theta的导数的向量。

我重新定义了你的函数,使调用序列更简单(将参数组合成一个命名列表,并颠倒了参数的顺序)。

用不同的线条样式绘制曲线段有点棘手:

lt <- as.integer(3*(z-min(z))/diff(range(z))+1)
df <- data.frame(x,y,z,lt)
plot(x,y,type="n")
lapply(split(df,df$lt),function(df)with(df,lines(x,y,lty=lt)))

因此,这会根据导数的值创建线型(1,2,3或4)的矢量,然后根据线型拆分数据,并绘制线段。