5 python cluster-analysis machine-learning time-series dtw
我有10-20k个不同的时间序列(24维数据-一天中的每个小时的一列)之间的某个地方,我对聚类的时间序列表现出大致相同的活动模式感兴趣。
我最初开始实施动态时间规整(DTW),因为:
我使用DTW遇到的唯一问题是,它似乎无法很好地扩展- fastdtw在500x500的距离矩阵上花费了大约30分钟。
还有哪些其他方法可以帮助我满足条件2和3?
如果将时间序列分解为趋势,季节性和残差,ARIMA可以胜任。之后,使用K最近邻算法。但是,基本上由于ARIMA,计算成本可能很高。
在ARIMA中:
from statsmodels.tsa.arima_model import ARIMA
model0 = ARIMA(X, dates=None,order=(2,1,0))
model1 = model0.fit(disp=1)
decomposition = seasonal_decompose(np.array(X).reshape(len(X),),freq=100)
### insert your data seasonality in 'freq'
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid
Run Code Online (Sandbox Code Playgroud)
作为@Sushant注释的补充,您可以分解时间序列,并可以检查4个图中的一个或全部的相似性:数据,季节性,趋势和残差。
然后是一个数据示例:
import numpy as np
import matplotlib.pyplot as plt
sin1=[np.sin(x)+x/7 for x in np.linspace(0,30*3,14*2,1)]
sin2=[np.sin(0.8*x)+x/5 for x in np.linspace(0,30*3,14*2,1)]
sin3=[np.sin(1.3*x)+x/5 for x in np.linspace(0,30*3,14*2,1)]
plt.plot(sin1,label='sin1')
plt.plot(sin2,label='sin2')
plt.plot(sin3,label='sin3')
plt.legend(loc=2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
X=np.array([sin1,sin2,sin3])
from sklearn.neighbors import NearestNeighbors
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)
distances
Run Code Online (Sandbox Code Playgroud)
您将获得相似之处:
array([[ 0. , 16.39833107],
[ 0. , 5.2312092 ],
[ 0. , 5.2312092 ]])
Run Code Online (Sandbox Code Playgroud)