天天看點

趨勢檢驗方法(一)直線方程拟合直線方程拟合

直線方程拟合

a基本原理:

  1. 設一條直線為y=kx+b,使用最小二乘法(least square method)來拟合出最優的k(斜率)。
  2. 設定一個門檻值k0(k0>0),若|k|>k0則認為趨勢有明顯變化。當k>k0時,則認為 有上升的趨勢;當k<-k0時,則認為有下降的趨勢。
  3. |k|<=k0時可以視情況考慮是否要進行趨勢穩定性檢測。

b拟合函數原理:

假設需要拟合的函數為y=kx+b 

那麼最小二乘法的本質是要使每一個點到y=kx+b的垂直距離平方和最小,進而算出k和b

趨勢檢驗方法(一)直線方程拟合直線方程拟合

具體實作步驟:

趨勢檢驗方法(一)直線方程拟合直線方程拟合

c方法優缺點:

優點:

該方法比較簡單,易于了解解釋。

缺點:

  1. 要求的趨勢需要是線性的。
  2. 資料波動不能太大。

d算法入口:

趨勢檢驗方法(一)直線方程拟合直線方程拟合
e執行個體參考:

import numpy as np
from matplotlib import pyplot as plt

# 生成100個時序坐标點(x,sinx)
x = np.linspace(0, 5 / 9 * np.pi, 100)
y = np.sin(x)
y +=np.random.randn(100) * 0.05  # 加上噪聲


def trendline(x, y, K):
    model = np.polyfit(x, y, deg=1)  # 拟合函數,輸出參數
    print('斜率為', model[-2])
    if model[-2] > K:
        print('趨勢上升')
    elif model[-2] < -K:
        print('趨勢下降')
    else:
        print('趨勢不明顯')
    return np.poly1d(model)


# 作圖,其中y1為原始資料,y2為拟合出來的資料
def PLT(x, y1, y2):
    plt.scatter(x, y1, color='blue')
    plt.plot(x, y2, color='red')
    plt.show()


if __name__ == '__main__':
    PLT(x, y, trendline(x, y, K=0.3)(x))  # 這裡的K值自定
           

最後生成的結果如下

趨勢檢驗方法(一)直線方程拟合直線方程拟合

f參考文獻:

知乎 線性回歸之最小二乘法 https://zhuanlan.zhihu.com/p/90073632

知乎 時序資料常用趨勢檢測方法https://zhuanlan.zhihu.com/p/112703276

最小二乘法原理及在拟合函數實際應用https://www.cnblogs.com/mrtop/p/10242545.html

時間序列資料趨勢分析 Cox-Stuart、Mann-Kendall、Dickey-Fuller

https://blog.csdn.net/qq_34356768/article/details/106559399