有没有办法让scipy curve_fit确定?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法让scipy curve_fit确定?相关的知识,希望对你有一定的参考价值。
尝试使用curve_fit(scipy API,用于拟合sigmoid)和固定种子用于numpy,但结果仍然有所不同。有没有办法让它完全确定?
根据评论中的要求,这是一个最小的工作示例:
from scipy.optimize import curve_fit
import numpy as np
def sigmoid(x, b, mu, max_kr):
if isinstance(x, list) or isinstance(x, np.ndarray):
return [sigmoid(xx, b, mu, max_kr) for xx in x]
else:
return max_kr/(1+10**(mu*(-x+b)))
def fit_sigmoid(points):
xs, ys = list(zip(*points))
err = None
popt, pcov = curve_fit(sigmoid, xs, ys, bounds=([-np.inf, 0, 0], [np.inf, np.inf, 1]), ftol=len(xs)*1e-6)
b, mu, max_kr = popt
return mu
np.random.seed = 12
points1 = [(4.0, 1.0), (1.0, 8.340850913002296e-05), (3.0, 0.9793319563421965), (0.0, 8.340850913002296e-05), (-1.0, 0.0), (2.0, 0.010306481917677357)]
points2 = [(4.0, 1.0), (-1.0, 0.0), (3.0, 0.9793319563421965), (0.0, 8.340850913002296e-05), (1.0, 8.340850913002296e-05), (2.0, 0.010306481917677357)]
print(fit_sigmoid(points1))
print(fit_sigmoid(points2))
似乎点的顺序很重要。出于好奇,这背后的原因是什么?
答案
如果在运行曲线拟合算法之前按x对数据进行排序,则可获得可重现的结果:
from scipy.optimize import curve_fit
import numpy as np
def sigmoid(x, b, mu, max_kr):
if isinstance(x, list) or isinstance(x, np.ndarray):
return [sigmoid(xx, b, mu, max_kr) for xx in x]
else:
return max_kr/(1+10**(mu*(-x+b)))
def fit_sigmoid(points):
points = points[points[:, 0].argsort()]
popt, pcov = curve_fit(sigmoid, points[:, 0], points[:, 1], bounds=([-np.inf, 0, 0], [np.inf, np.inf, 1]), ftol=len(points)*1e-6)
b, mu, max_kr = popt
return mu
points1 = np.array([
(4.0, 1.0),
(1.0, 8.340850913002296e-05),
(3.0, 0.9793319563421965),
(0.0, 8.340850913002296e-05),
(-1.0, 0.0),
(2.0, 0.010306481917677357)
])
points2 = np.array([
(4.0, 1.0),
(-1.0, 0.0),
(3.0, 0.9793319563421965),
(0.0, 8.340850913002296e-05),
(1.0, 8.340850913002296e-05),
(2.0, 0.010306481917677357)
])
print(fit_sigmoid(points1))
print(fit_sigmoid(points2))
# 15.110203876634552
# 15.110203876634552
以上是关于有没有办法让scipy curve_fit确定?的主要内容,如果未能解决你的问题,请参考以下文章
Scipy.Optimise Curve_fit 的指数拟合不起作用
为啥 scipy.optimize.curve_fit 不适合数据?
scipy.optimize.curve_fit 的替代方案
scipy.optimize.curve_fit ValueError:具有多个元素的数组的真值不明确