我正在使用scipy的curvefit模块拟合函数,并想知道是否有办法告诉它唯一可能的输入是整数而不是实数?关于另一种方法有什么想法吗?
最佳答案
一般而言,整数编程问题是NP难的(请参阅here)。有一些有效的启发式算法或近似算法可以解决此问题,但不能保证精确的最优解。
在scipy中,您可以对整数系数实现网格搜索,并在给定的整数系数的实参上使用curve_fit
。至于网格搜索。 scipy具有 brute
功能。
例如,如果y = a * x + b * x^2 + some-noise
必须为整数,则这可能有效:
a
和a = 5
生成一些测试数据:coef, n = [5, - 1.5], 50
xs = np.linspace(0, 10, n)[:,np.newaxis]
xs = np.hstack([xs, xs**2])
noise = 2 * np.random.randn(n)
ys = np.dot(xs, coef) + noise
b = -1.5
方法给定整数系数的函数适合实际系数:def optfloat(intcoef, xs, ys):
from scipy.optimize import curve_fit
def poly(xs, floatcoef):
return np.dot(xs, [intcoef, floatcoef])
popt, pcov = curve_fit(poly, xs, ys)
errsqr = np.linalg.norm(poly(xs, popt) - ys)
return dict(errsqr=errsqr, floatcoef=popt)
def errfun(intcoef, *args):
xs, ys = args
return optfloat(intcoef, xs, ys)['errsqr']
curve_fit
最小化errfun
以找到最佳整数系数,并使用优化的整数系数调用scipy.optimize.brute
以找到最佳实数系数:from scipy.optimize import brute
grid = [slice(1, 10, 1)] # grid search over 1, 2, ..., 9
# it is important to specify finish=None in below
intcoef = brute(errfun, grid, args=(xs, ys,), finish=None)
floatcoef = optfloat(intcoef, xs, ys)['floatcoef'][0]
使用这种方法,我获得了最佳系数的
optfloat
,它对于整数系数是精确的,而对于实数系数则足够接近。关于python-3.x - 整数输入的曲线拟合Python 3.3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22850489/