首先,这是我的第一个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)
我想要做的是找到此曲线中渐变最小或为零的点以及渐变最大的点。我的最终目标是根据沿曲线的渐变强度,用不同的线条样式绘制此曲线的不同部分。我可以通过“盯着眼球”来产生这些不同的风格。它可以很好地拥有可以更精确地做到这一点的东西。
答案 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")
此处z
是genSigmoid(...)
相对于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)的矢量,然后根据线型拆分数据,并绘制线段。