我一直致力于为一组数据拟合负斜率的S形趋势线。我只在python上工作了一个星期,对于草率的代码感到抱歉。我有两组产生数据的代码,但是,我也无法获得sigmoid曲线输出。
from numpy import *
from matplotlib.pyplot import *
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def sigmoid(x, x0, k):
y = 1 / (1 + np.exp(-(-k*(x-x0))))
return y
x = [0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001]
y = [0.649097038, 0.682633434, 0.705470344, 0.749350609, 0.989377822, 0.972679201]
coefficients = np.polyfit(x, y, 2)
polynomial = poly1d(coefficients)
xs = arange(0.000001, 0, 0.1)
ys = polynomial(xs)
curve_fit(sigmoid, x, y)
semilogx()
np.polyfit(x, y, 3, rcond=None, full=False, w=None, cov=False)
plot(x, y, 'o')
plot(xs, ys)
ylabel('Cell Viability')
xlabel('Concentration mM')
show()
import numpy as np
import pylab
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def sigmoid(x, x0, k):
y = 1 / (1 + np.exp(-(-k*(x-x0))))
return y
xdata = np.array([0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001])
ydata = np.array([0.649097038, 0.682633434, 0.705470344, 0.749350609, 0.989377822, 0.972679201])
popt, pcov = curve_fit(sigmoid, xdata, ydata)
print popt
x = np.linspace(-10, 1, 50)
y = sigmoid(x, *popt)
semilogx()
pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()
答案 0 :(得分:1)
你的两个代码片有很多问题 - 其中一些是Ajean所暗示的。让我们仔细检查一下是什么以及导致什么问题。
第一个代码块
丢弃前两行并仅使用:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
现在,您需要拨打poly1d
,而不是np.poly1d
;而不是semilogx()
它是plt.semilogx()
; plot
,xlabel
,ylabel
和show
成为plt.plot
等。
接下来,您使用arange
会返回一个空数组。相反,试试这个:
np.arange(0.000001, 0.1, 0.000001)
从curvefit
开始,你应该存储回报,正如你的第二个代码所做的那样:
popt, pcov = curve_fit(sigmoid, x, y)
接下来,使用sigmoid
生成新的y
- 值:
ysig = sigmoid(x,*popt)
如果现在在底部包含一个额外的情节陈述,例如:
plt.plot(x,ysig,'g')
输出将是这样的:
第二个代码块
import matplotlib.pyplot as plt
就足够了。现在,用pylab.
plt.
次出现
然而,所有不起作用的是linspace
命令。如果你试试
x = np.arange(0.000001, 0.1, 0.000001)
相反,你会得到这个输出
但是,这两种方法都表明您的拟合并不适合数据。但这可能是一个不同的问题。
答案 1 :(得分:-1)
这就是我对代码块1所拥有的。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def sigmoid(x, x0, k):
y = 1 / (1 + np.exp(-(-k*(x-x0))))
return y
x = [0.1, 0.01, 0.001, 0.0001, 0.00001, 0.000001]
y = [0.649097038, 0.682633434, 0.705470344, 0.749350609, 0.989377822, 0.972679201]
coefficients = np.polyfit(x, y, 3)
polynomial = np.poly1d(coefficients)
popt, pcov = curve_fit(sigmoid, x, y)
ysig = sigmoid(x, *popt)
plt.semilogx()
np.arange(0.000001, 0.1, 0.000001)
np.polyfit(x, y, 3, rcond=None, full=False, w=None, cov=False)
plt.plot(x, y, 'o')
plt.plot(x, ysig, 'g')
plt.ylabel('Cell Viability')
plt.xlabel('Concentration mM')
plt. show()