因为之前学习的神经网络的算法大多都是拟合非线性函数的,所以在某些具有连续性的预测方面,神经网络算法的函数拟合并没有简单函数好用。
今天学习一下关于曲线函数的拟合方式。
首先给定一组数据来对数据进行拟合,例如随便想一个函数 y=2x^3+x^2+1
接下来分别取x=[1,2,3,4,5]
对应的y就为y=[4,21,64,145,276]
上面的数据x和y就为基础的数据,然后我们需要通过x,y这些训练数据,得到一个f(x)来得到具体的函数转换器y=2x^3+x^2+1
所以现在我们吧x,y作为训练数据代入 则有以下的过程
import numpy as np #自动型最大幂次,减小计算量 maxn=20 #自动多项式函数拟合(计算量相对较大) def auto_ax_bfit(x,y): x=np.array(x) y=np.array(y) n=maxn if len(x)-1>maxn else len(x)-1 fit_coef=np.polyfit(x,y,n) alist=[] g_start=False minnum=1e-14 for one in fit_coef: if(not g_start): if(abs(one)>minnum): g_start=True alist.append(one) else: alist.append(one) alist=[round(one,9) for one in list(alist)] return fit_coef[-len(alist):],alist #靠猜最高幂次多项式拟合,n是最高幂次,这个需要靠猜n的大小,n越大计算量也就越大,同时也越准确(泰勒展开公式,最高幂次越大越逼近准确函数),同时n需要小于len(x),当太大时直接取正整数型,想方便时也直接用自动型就好了 def ax_bfit(x,y,n): x=np.array(x) y=np.array(y) fit_coef=np.polyfit(x,y,n) alist=[round(one,9) for one in list(np.polyfit(x,y,n))] return fit_coef[-len(alist):],alist #函数构建器 def func_general(fit_coef,predict_xlist): calculate_y = [round(one, 9) for one in list(np.polyval(fit_coef, predict_xlist))] return calculate_y
代入对应数据,并预测当x=[1,3,6]时,f(x)对应的值是多少(根据事先所想的函数,正确的值应该是[4,64,469]),下面我们代入数据看看结果
#数据列表 x=[1,2,3,4,5] y=[4,21,64,145,276] #需要预测的x值 calculate_x=[1,3,6] #期待值[4,64,469] # #拟合函数最高次幂(这部分可以靠猜,当为3时是准确值,计算量相对较小型) # n=3 # fit_coef,alist=ax_bfit(x,y,n) #自动型,计算量相对较大 fit_coef,alist=auto_ax_bfit(x,y) print("系数列表:",alist) print("calculate_x列表对应的预测值:",func_general(fit_coef,calculate_x))
最终结果如下:
可以看到预测出来的函数为: 与2x^3+x^2+1一致
预测值和期待值[4,64,469]一致
原文:https://www.cnblogs.com/halone/p/13363567.html