天天看点

趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合多项式拟合(最小二乘法)

多项式拟合(最小二乘法)

a基本原理:

趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合多项式拟合(最小二乘法)

b拟合函数原理:

趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合多项式拟合(最小二乘法)

c方法优缺点:

优点:

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

缺点:

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

d算法入口:

该方法主要用到的函数是np.polyfit(x,y,deg,*args)

1.deg为需要拟合函数的最高次数。当deg=0时,y=a0。

2.其他参数*args在这里目前不需要讨论。

3.np.polyfit函数的返回值是拟合好之后的参数,按(an,……,a1)排序

4.该函数缺少对应的惩罚函数,待思考研究。

可以使用np.ploy1d()来加载函数,方便生成对应的y

e实例参考:

# -*- coding: utf-8 -*-
'''
    多项式拟合(最小二乘法),这里的例子是三次方拟合
'''

import numpy as np
from matplotlib import pyplot as plt


def func(x):  # 原函数
    return x ** 3 - 3 * x + 1


def trendline(x, y, n):
    model = np.polyfit(x, y, deg=n)  # 拟合函数,输出参数
    return np.poly1d(model)


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


if __name__ == '__main__':
    # 生成300个时序坐标点(x,y),前250个点用于拟合,后50个点用于预测
    x = np.linspace(-3, 3, 300)
    y = func(x)
    y += np.random.randn(300) * 0.5  # 加上噪声

    ff = trendline(x[:250], y[:250], n=3)
    print(ff)

    PLT(x, y, x, np.poly1d(ff)(x))
           

运行结果如下

趋势预测方法(一) 多项式拟合(最小二乘法)_函数拟合多项式拟合(最小二乘法)

f参考文献:

机器学习--线性回归算法的原理及优缺点

https://www.cnblogs.com/lsm-boke/p/11746274.html

知乎 最小二乘法(least sqaure method)

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

知乎 多项式曲线拟合

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