smmoidal曲线与semilogx SciPy / Python

时间:2014-12-03 23:36:13

标签: python numpy matplotlib scipy

我一直致力于为一组数据拟合负斜率的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()

2 个答案:

答案 0 :(得分:1)

你的两个代码片有很多问题 - 其中一些是Ajean所暗示的。让我们仔细检查一下是什么以及导致什么问题。

第一个代码块

  • 丢弃前两行并仅使用:

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import curve_fit
    

    现在,您需要拨打poly1d,而不是np.poly1d;而不是semilogx()它是plt.semilogx(); plotxlabelylabelshow成为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')
    

    输出将是这样的:

    output 1

第二个代码块

  • import matplotlib.pyplot as plt就足够了。现在,用pylab.

  • 替换plt.次出现
  • 然而,所有不起作用的是linspace命令。如果你试试

    x = np.arange(0.000001, 0.1, 0.000001)
    

    相反,你会得到这个输出

    output 2


但是,这两种方法都表明您的拟合并不适合数据。但这可能是一个不同的问题。

答案 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()