python调用curve_fit拟合,函数参量可变(第一个传参是变量)

python拟合


菜鸟的笔记
函数curve_fit(f, x, y)

from scipy.optimize import curve_fit

def power_func(x, a, b):
	return x**a + b
popt, pcov = curve_fit(power_func, x, y)
print(*popt)
yvals = [power_func(i, *popt) for i in x]

参考此文
power_func 是用户自定义的拟合的函数形式(例子中是指数函数)
popt是返回的最优化的函数系数(a,b的值)
yvals是拟合后的值
x,y是原始数据
接下来我想通过自定义不同的func传入curve_fit来实现多种拟合形式。一开始尝试增加一个参数choice(通过控制choice取值“power”、“expotential”等等来实现传不同的参数)

import numpy as np
from scipy.optimize import curve_fit
def fitting(x, y, choice):
	def power(x, a, b):
		return x**a + b
	def expotential(x, a, b, c):
		return a * np.exp(-b * x) + c
	popt, pcov = curve_fit(choice, x, y)
	print(*popt)
	yvals = [choice(i, *popt) for i in x]

但是choice传入的时候只能以字符串形式,而curve_fit需要的参数是函数。突然想到if这个万能工具。

import numpy as np
from scipy.optimize import curve_fit
def fitting(x, y, choice):
	def power(x, a, b):
		return x**a + b
	def expotential(x, a, b, c):
		return a * np.exp(-b * x) + c
	if choice=='power':
		func = power
	elif choice=='expotential':
		func = expotential
	popt, pcov = curve_fit(func, x, y)
	print(*popt)
	yvals = [func(i, *popt) for i in x]

其实很简单的思路有时候就是想不到。。。
顺便提一句,自定义的power、expotential函数不能写到fitting函数外边,会报错,不知道有没有什么别的好方法。

你可能感兴趣的:(拟合)