很多业务场景中,我们希望通过一个特定的函数来拟合业务数据,以此来预测未来数据的变化趋势。(比如用户的留存变化、付费变化等)
本文主要介绍在 Python 中常用的两种曲线拟合方法:多项式拟合 和 自定义函数拟合。
多项式拟合 np.polyfit
通过多项式拟合,我们只需要指定想要拟合的多项式的最高项次是多少即可。
import numpy as np
import matplotlib.pyplot as plt
x = [10,20,30,40,50,60,70,80]
x = np.array(x)
print('x is :\n',x)
num = [174,236,305,334,349,351,342,323]
y = np.array(num)
print('y is :\n',y)
# f1 为各项的系数,3 表示想要拟合的最高次项是多少。
f1 = np.polyfit(x, y, 3)
# p1 为拟合的多项式表达式
p1 = np.poly1d(f1)
print('p1 is :\n',p1)
plt.plot(x, y, 's',label='original values')
yvals = p1(x) #拟合y值
plt.plot(x, yvals, 'r',label='polyfit values')
运行结果:
image.png
自定义函数拟合 curve_fit
对于自定义函数拟合,不仅可以用于直线、二次曲线、三次曲线的拟合,它可以适用于任意形式的曲线的拟合,只要定义好合适的曲线方程即可。
from scipy.optimize import curve_fit
x = [20,30,40,50,60,70]
x = np.array(x)
num = [453,482,503,508,498,479]
y = np.array(num)
# 这里的函数可以自定义任意形式。
def func(x, a, b,c):
return a*np.sqrt(x)*(b*np.square(x)+c)
# popt返回的是给定模型的最优参数。我们可以使用pcov的值检测拟合的质量,其对角线元素值代表着每个参数的方差。
popt, pcov = curve_fit(func, x, y)
a = popt[0]
b = popt[1]
c = popt[2]
yvals = func(x,a,b,c) #拟合y值
plot1 = plt.plot(x, y, 's',label='original values')
plot2 = plt.plot(x, yvals, 'r',label='polyfit values')
运行结果:
image.png
网友评论