天天看点

趋势预测方法(二)其他函数拟合_函数拟合其它函数拟合

其它函数拟合

a基本原理:

给出公式的大致情况,自动去拟合出最优的参数。这里的其它指的是除多项式以外的拟合情况,包括三角函数、对数,以及一些复杂的复合函数。

b拟合原理:

总体思路类似于最小二乘法的拟合思路的,只是要给出函数的大致情况,类似于多项式中的几次多项式拟合。

c方法优缺点:

优点:

  1. 思想简单,实现容易。建模迅速,对于小数据量、简单的关系很有效。
  2. 解决回归问题,拥有很好的解释性。
  3. 是很多非线性模型的基础。

缺点:

  1. 对于非线性数据或者数据特征间具有相关性多项式回归难以建模。
  2. 当样本特征n非常大的时候会变的很耗时,难以很好的表达复杂的数据。
  3. 需要了解待拟合函数的大致情况。

d算法入口:

scipy.optimize.curve_fit(func,x,y,p0,*args)

func需要拟合的函数形式,

趋势预测方法(二)其他函数拟合_函数拟合其它函数拟合

x  数据x

y  数据y

p0   给函数的参数确定一个初始值来减少计算机的计算量,数据比较简单时可以没有

输出的第一个是残差最小的时候参数值,第二个是估计的协方差。

e实例参考:

# -*- coding: utf-8 -*-
'''
    其他函数拟合,这里的例子为拟合一个三角函数
'''

from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt


def func(x, a1, a2, a3, a4):  # 原函数
    return a1 * np.sin(a2 * np.pi * x + a3) - a4


def myfit(function, x, y, p=None):
    return curve_fit(function, x, y, p0=p)


# 作图,其中y1为原始数据,y2为拟合出来的数据
def PLT(x1, y1, x2, y2, p):
    plt.scatter(x1, y1, color='blue')
    plt.plot(x1, func(x1, p[0], p[1], p[2], p[3]), color='yellow', label='real')
    plt.plot(x2, y2, color='red', label='fit')
    plt.legend()
    plt.show()


if __name__ == '__main__':
    # 在[0,2.5*pi]上生成200个时序坐标点(x,y),其中前160个为拟合点,后40个为预测点
    x = np.linspace(0, 2.5 * np.pi, 200)
    pp = [2, 1, 1.5, 0.5]
    y = func(x, pp[0], pp[1], pp[2], pp[3])
    y += np.random.randn(200) * 0.2  # 加上噪音

    p = [1, 1, 1, 1]  # 随便给出个初始值
    ff, _ = myfit(func, x[:160], y[:160], p=p)  # 生成拟合出来的a0,a1,a2,a3
    print(ff)

    PLT(x, y, x, func(x, ff[0], ff[1], ff[2], ff[3]), p=pp)
           

运行结果如下

趋势预测方法(二)其他函数拟合_函数拟合其它函数拟合

f参考文献:

python数据分析之曲线拟合(2):三角函数sin/cos拟合

https://blog.csdn.net/kaever/article/details/109659367

知乎scipy.optimize.curve_fit函数用法解析

https://zhuanlan.zhihu.com/p/144353126