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函数外边,会报错,不知道有没有什么别的好方法。