直线方程拟合
a基本原理:
- 设一条直线为y=kx+b,使用最小二乘法(least square method)来拟合出最优的k(斜率)。
- 设定一个阈值k0(k0>0),若|k|>k0则认为趋势有明显变化。当k>k0时,则认为 有上升的趋势;当k<-k0时,则认为有下降的趋势。
- |k|<=k0时可以视情况考虑是否要进行趋势稳定性检测。
b拟合函数原理:
假设需要拟合的函数为y=kx+b
那么最小二乘法的本质是要使每一个点到y=kx+b的垂直距离平方和最小,从而算出k和b
具体实现步骤:
c方法优缺点:
优点:
该方法比较简单,易于理解解释。
缺点:
- 要求的趋势需要是线性的。
- 数据波动不能太大。
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