天天看點

趨勢預測方法(一) 多項式拟合(最小二乘法)_函數拟合多項式拟合(最小二乘法)

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

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