精华内容
下载资源
问答
  • 背景任何事物在两个不同时刻都不可能保持完全相同的状态,但很多变化往往存在着一定的规律,例如 24 小时日出日落,潮起潮落,这些现象通常称为「周期」。周期性,指时间序列中呈现出来的围绕长期趋...

    背景

    任何事物在两个不同时刻都不可能保持完全相同的状态,但很多变化往往存在着一定的规律,例如 24 小时日出日落,潮起潮落,这些现象通常称为「周期」

    周期性,指时间序列中呈现出来的围绕长期趋势的一种波浪形或振荡式变动。准确提取周期信息,不仅能反映当前数据的规律,应用于相关场景,还可以预测未来数据变化趋势。

    时间序列示例

    一般而言,时间序列周期性分为三种:

    • 「符号性周期」,例如序列 fbcnfkgbfopsf 周期为 4;

    • 「部分周期性」,例如序列 ansdcdmncdcacdascdmccd 周期为 4;

    • 「分段周期性」,例如上面给定的时间序列即为分段周期性;

    针对时间序列的周期性检测问题,这篇文章主要介绍「傅里叶变换」「自相关系数」两种方法及其在实际数据中的效果;

    傅里叶变换

    傅里叶变换是一种将时域、空域数据转化为频域数据的方法,任何波形(时域)都可以看做是不同振幅、不同相位正弦波的叠加(频域),详细介绍可以参考:An Interactive Guide To The Fourier Transform,???????? 此处放上经典图镇场!

    傅里叶变换

    对于一条具备周期性的时间序列,它本身就很接近正弦波,所以它包含一个显著的正弦波,周期就是该正弦波的周期,而这个正弦波可以通过傅里叶变换找到,它将时序数据展开成三角函数的线性组合,得到每个展开项的系数,就是傅里叶系数。傅里叶系数越大,表明它所对应的正弦波的周期就越有可能是这份数据的周期。

    自相关系数

    自相关系数(Autocorrelation Function)度量的是同一事件不同时间的相关程度,不同相位差(lag)序列间的自相关系数可以用 Pearson 相关系数计算。其数学表达如下:

    其中 表示相位 的数据延迟 「lag operator」

    自相关系数

    当序列存在周期性时,遍历足够多的相位差,一定可以找到至少一个足够大的自相关系数,而它对应的相位差就是周期。所以对于检测时序周期来说,只需找到两个自相关系数达到一定阈值的子序列,它们起始时间的差值就是我们需要的周期。

    实例说明

    为了保证结果的可靠性,可以将傅里叶分析和自相关系数结合起来判断周期性。主要思路是:先通过傅里叶变换找到可能的周期,再用自相关系数做排除,从而得到最可能的周期。

    给定一份周期性数据,时间间隔为 5 min。从这份数据中可以看出数据大体上具有周期为 1 day。

    示例数据

    下面使用傅里叶变换估计周期,代码如下所示

    from scipy.fftpack import fft, fftfreq
    
    fft_series = fft(data["value"].values)
    power = np.abs(fft_series)
    sample_freq = fftfreq(fft_series.size)
    
    pos_mask = np.where(sample_freq > 0)
    freqs = sample_freq[pos_mask]
    powers = power[pos_mask]
    
    top_k_seasons = 3
    # top K=3 index
    top_k_idxs = np.argpartition(powers, -top_k_seasons)[-top_k_seasons:]
    top_k_power = powers[top_k_idxs]
    fft_periods = (1 / freqs[top_k_idxs]).astype(int)
    
    print(f"top_k_power: {top_k_power}")
    print(f"fft_periods: {fft_periods}")
    

    取 top-3 振幅值为top_k_power: [ 614.8105282 890.33273899 1831.167168 ] 及其对应的周期 fft_periods: [ 72 278 292] 。???? 数据间隔为 5 min 所以真实周期应为 288,从傅里叶变换即可看出估计值 292 已经非常接近真实值。

    现在来计算自相关系数,代码如下所示:

    from statsmodels.tsa.stattools import acf
    
    # Expected time period
    for lag in fft_periods:
        # lag = fft_periods[np.abs(fft_periods - time_lag).argmin()]
        acf_score = acf(data["value"].values, nlags=lag)[-1]
        print(f"lag: {lag} fft acf: {acf_score}")
    
    
    expected_lags = np.array([timedelta(hours=12)/timedelta(minutes=5), timedelta(days=1)/timedelta(minutes=5), timedelta(days=7)/timedelta(minutes=5)]).astype(int)
    for lag in expected_lags:
        acf_score = acf(data["value"].values, nlags=lag, fft=False)[-1]
        print(f"lag: {lag} expected acf: {acf_score}")
    
    

    对应的输出如下:

    lag: 72 fft acf: 0.07405431832776994
    lag: 278 fft acf: 0.7834457453491087
    lag: 292 fft acf: 0.8259822269757922
    lag: 144 expected acf: -0.5942986094704665
    lag: 288 expected acf: 0.8410792774898174
    lag: 2016 expected acf: 0.5936030431473589
    

    通过自相关系数来得到显著分数最大值对应的周期,得出的结果为 292;

    此处实验补充了预设的三个周期值:12 hour、1 day、7 day,发现算出来还是周期 288 对应的相关分数最大,但是傅里叶变换没有估计出周期值 ????

    综上,这个小故事告诉我们:你算出来的还不如我预设的值呢!直接根据先验知识「预设周期」然后计算自相关系数就行了!


    建议阅读:

    高考失利之后,属于我的大学本科四年

    【资源分享】对于时间序列,你所能做的一切.

    【时空序列预测第一篇】什么是时空序列问题?这类问题主要应用了哪些模型?主要应用在哪些领域?

    【AI蜗牛车出品】手把手AI项目、时空序列、时间序列、白话机器学习、pytorch修炼

    公众号:AI蜗牛车
    
    保持谦逊、保持自律、保持进步
    
    
    
    个人微信
    备注:昵称+学校/公司+方向
    如果没有备注不拉群!
    拉你进AI蜗牛车交流群
    
    
    
    
    展开全文
  • 这是当初刚进公司时,leader给的一个独立练手小项目,关于时间序列预测,情景比较简单,整个过程实现下来代码也仅100多行,但完成过程中踩了很多坑,觉的有必要分(tu)享(cao)一下。完整代码和样例数据放到了我的...

    这是当初刚进公司时,leader给的一个独立练手小项目,关于时间序列预测,情景比较简单,整个过程实现下来代码也仅100多行,但完成过程中踩了很多坑,觉的有必要分(tu)享(cao)一下。完整代码和样例数据放到了我的github上(文章仅粘贴部分): https://github.com/scarlettgin/cyclical_series_predict

    1、背景

    公司平台上有不同的api,供内部或外部调用,这些api承担着不同的功能,如查询账号、发版、抢红包等等。日志会记录下每分钟某api被访问了多少次,即一个api每天会有1440条记录(1440分钟),将每天的数据连起来观察,有点类似于股票走势的意思。我想通过前N天的历史数据预测出第N+1天的流量访问情况,预测值即作为合理参考,供新一天与真实值做实时对比。当真实流量跟预测值有较大出入,则认为有异常访问,触发报警。

    2、数据探索

    我放了一份样例数据在data文件夹下, 看一下数据大小和结构

    data = pd.read_csv(filename)
    print('size: ',data.shape)
    print(data.head())
    复制代码

    数据大小: 共10080条记录,即10080分钟,七天的数据。 字段含义: date:时间,单位分钟 count:该分钟该api被访问的次数

    画图看一下序列的走势:(一些画图等探索类的方法放在了test_stationarity.py 文件中,包含时间序列图,移动平均图,有兴趣的可以自己尝试下)。

    def draw_ts(timeseries):
        timeseries.plot()
        plt.show()
    
    data = pd.read_csv(path)
    data = data.set_index('date')
    data.index = pd.to_datetime(data.index)
    ts = data['count']
    draw_ts(ts)
    复制代码

    看这糟心的图,那些骤降为0的点这就是我遇到的第一个坑,我当初一拿到这份数据就开始做了。后来折腾了好久才发现,那些骤降为0的点是由于数据缺失,ETL的同学自动补零造成的,沟通晚了(TДT)。

    把坑填上,用前后值的均值把缺失值补上,再看一眼:

    发现这份数据有这样几个特点,在模型设计和数据预处理的时候要考虑到:

    1、这是一个周期性的时间序列,数值有规律的以天为周期上下波动,图中这个api,在每天下午和晚上访问较为活跃,在早上和凌晨较为稀少。在建模之前需要做分解。

    2、我的第二个坑:数据本身并不平滑,骤突骤降较多,而这样是不利于预测的,毕竟模型需要学习好正常的序列才能对未知数据给出客观判断,否则会出现频繁的误报,令气氛变得十分尴尬( ´Д`),所以必须进行平滑处理。

    3、这只是一个api的序列图,而不同的api的形态差距是很大的,毕竟承担的功能不同,如何使模型适应不同形态的api也是需要考虑的问题。

    3、预处理

    3.1 划分训练测试集

    前六天的数据做训练,第七天做测试集。

    class ModelDecomp(object):
        def __init__(self, file, test_size=1440):
            self.ts = self.read_data(file)
            self.test_size = test_size
            self.train_size = len(self.ts) - self.test_size
            self.train = self.ts[:len(self.ts)-test_size]
            self.test = self.ts[-test_size:]
    复制代码

    3.2 对训练数据进行平滑处理

    消除数据的毛刺,可以用移动平均法,我这里没有采用,因为我试过发现对于我的数据来说,移动平均处理完后并不能使数据平滑,我这里采用的方法很简单,但效果还不错:把每个点与上一点的变化值作为一个新的序列,对这里边的异常值,也就是变化比较离谱的值剃掉,用前后数据的均值填充,注意可能会连续出现变化较大的点:

    def _diff_smooth(self, ts):
        dif = ts.diff().dropna() # 差分序列
        td = dif.describe() # 描述性统计得到:min,25%,50%,75%,max值
        high = td['75%'] + 1.5 * (td['75%'] - td['25%']) # 定义高点阈值,1.5倍四分位距之外
        low = td['25%'] - 1.5 * (td['75%'] - td['25%']) # 定义低点阈值,同上
    
        # 变化幅度超过阈值的点的索引
        forbid_index = dif[(dif > high) | (dif < low)].index 
        i = 0
        while i < len(forbid_index) - 1:
            n = 1 # 发现连续多少个点变化幅度过大,大部分只有单个点
            start = forbid_index[i] # 异常点的起始索引
            while forbid_index[i+n] == start + timedelta(minutes=n):
                n += 1
            i += n - 1
    
            end = forbid_index[i] # 异常点的结束索引
            # 用前后值的中间值均匀填充
            value = np.linspace(ts[start - timedelta(minutes=1)], ts[end + timedelta(minutes=1)], n)
            ts[start: end] = value
            i += 1
    
    self.train = self._diff_smooth(self.train)
    draw_ts(self.train)
    复制代码

    平滑后的训练数据:

    3.3 将训练数据进行周期性分解

    采用statsmodels工具包:

    from statsmodels.tsa.seasonal import seasonal_decompose
    
    decomposition = seasonal_decompose(self.ts, freq=freq, two_sided=False)
    # self.ts:时间序列,series类型; 
    # freq:周期,这里为1440分钟,即一天; 
    # two_sided:观察下图2、4行图,左边空了一段,如果设为True,则会出现左右两边都空出来的情况,False保证序列在最后的时间也有数据,方便预测。
    
    self.trend = decomposition.trend
    self.seasonal = decomposition.seasonal
    self.residual = decomposition.resid
    decomposition.plot()
    plt.show()
    复制代码

    第一行observed:原始数据;第二行trend:分解出来的趋势部分;第三行seasonal:周期部分;最后residual:残差部分。 我采用的是seasonal_decompose的加法模型进行的分解,即 observed = trend + seasonal + residual,另还有乘法模型。在建模的时候,只针对trend部分学习和预测,如何将trend的预测结果加工成合理的最终结果?当然是再做加法,后面会详细写。

    4、模型

    4.1 训练

    对分解出来的趋势部分单独用arima模型做训练:

    def trend_model(self, order):
        self.trend.dropna(inplace=True)
        train = self.trend[:len(self.trend)-self.test_size]
        #arima的训练参数order =(p,d,q),具体意义查看官方文档,调参过程略。
        self.trend_model = ARIMA(train, order).fit(disp=-1, method='css')
    复制代码

    4.2 预测

    预测出趋势数据后,加上周期数据即作为最终的预测结果,但更重要的是,我们要得到的不是具体的值,而是一个合理区间,当真实数据超过了这个区间,则触发报警,误差高低区间的设定来自刚刚分解出来的残差residual数据:

    d = self.residual.describe()
    delta = d['75%'] - d['25%']
    self.low_error, self.high_error = (d['25%'] - 1 * delta, d['75%'] + 1 * delta)
    复制代码

    预测并完成最后的加法处理,得到第七天的预测值即高低置信区间:

            def predict_new(self):
                '''
                预测新数据
                '''
                #续接train,生成长度为n的时间索引,赋给预测序列
                n = self.test_size
                self.pred_time_index= pd.date_range(start=self.train.index[-1], periods=n+1, freq='1min')[1:]
                self.trend_pred= self.trend_model.forecast(n)[0]
                self.add_season()
    
    
            def add_season(self):
                '''
                为预测出的趋势数据添加周期数据和残差数据
                '''
                self.train_season = self.seasonal[:self.train_size]
                values = []
                low_conf_values = []
                high_conf_values = []
                
                for i, t in enumerate(self.pred_time_index):
                    trend_part = self.trend_pred[i]
                    
                    # 相同时间点的周期数据均值
                    season_part = self.train_season[
                    	self.train_season.index.time == t.time()
                    	].mean()
        
                    # 趋势 + 周期 + 误差界限
                    predict = trend_part + season_part
                    low_bound = trend_part + season_part + self.low_error
                    high_bound = trend_part + season_part + self.high_error
                    
                    values.append(predict)
                    low_conf_values.append(low_bound)
                    high_conf_values.append(high_bound)
    
                # 得到预测值,误差上界和下界
                self.final_pred = pd.Series(values, index=self.pred_time_index, name='predict')
                self.low_conf = pd.Series(low_conf_values, index=self.pred_time_index, name='low_conf')
                self.high_conf = pd.Series(high_conf_values, index=self.pred_time_index, name='high_conf')
    复制代码

    4.3 评估:

    对第七天作出预测,评估的指标为均方根误差rmse,画图对比和真实值的差距:

    	md = ModelDecomp(file=filename, test_size=1440)
    	md.decomp(freq=1440)
    	md.trend_model(order=(1, 1, 3)) # arima模型的参数order
    	md.predict_new() 
    	pred = md.final_pred
    	test = md.test
    
    	plt.subplot(211)
    	plt.plot(md.ts) # 平滑过的训练数据加未做处理的测试数据
    	plt.title(filename.split('.')[0])
    
    	plt.subplot(212)
    	pred.plot(color='blue', label='Predict') # 预测值
    	test.plot(color='red', label='Original') # 真实值
    	md.low_conf.plot(color='grey', label='low') # 低置信区间
    	md.high_conf.plot(color='grey', label='high') # 高置信区间
    
    	plt.legend(loc='best')
    	plt.title('RMSE: %.4f' % np.sqrt(sum((pred.values - test.values) ** 2) / test.size))
    	plt.tight_layout()
    	plt.show()
    复制代码

    可以看到,均方根误差462.8,相对于原始数据几千的量级,还是可以的。测试数据中的两个突变的点,也超过了置信区间,能准确报出来。

    5、结语

    前文提到不同的api形态差异巨大,本文只展示了一个,我在该项目中还接触了其他形态的序列,有的有明显的上升或下降趋势;有的开始比较平缓,后面开始增长... ... ,但是都属于典型的周期性时间序列,它的核心思想很简单:做好分解,做好预测结果的还原,和置信区间的设置,具体操作可根据具体业务逻辑做调整,祝大家建模愉快:-D。

    展开全文
  • 3.3时间序列分析 3.3.1时间序列概述 1. 基本概念 1一般概念:系统中某一变量的观测值按时间顺序时间间隔相同排列成一个数值序列,展示研究对象在一定时期内的变动过程,从中寻找和分析事物的变化特征、发展趋势和...

    3.3时间序列分析 3.3.1时间序列概述 1. 基本概念 1一般概念:系统中某一变量的观测值按时间顺序时间间隔相同排列成一个数值序列,展示研究对象在一定时期内的变动过程,从中寻找和分析事物的变化特征、发展趋势和规律。

    它是系统中某一变量受其它各种因素影响的总结果。

    2研究实质:通过处理预测目标本身的时间序列数据,获得事物随时间过程的演变特性与规律,进而预测事物的未来发展。

    它不研究事物之间相互依存的因果关系。

    3假设基础:惯性原则。

    即在一定条件下,被预测事物的过去变化趋势会延续到未来。

    暗示着历史数据存在着某些信息,利用它们可以解释与预测时间序列的现在和未来。

    近大远小原理时间越近的数据影响力越大和无季节性、无趋势性、线性、常数方差等。

    4研究意义:许多经济、金融、商业等方面的数据都是时间序列数据。

    时间序列的预测和评估技术相对完善,其预测情景相对明确。

    尤其关注预测目标可用数据的数量和质量,即时间序列的长度和预测的频率。

    2. 变动特点 1趋势性:某个变量随着时间进展或自变量变化,呈现一种比较缓慢而长期的持续上升、下降、停留的同性质变动趋向,但变动幅度可能不等。

    2周期性:某因素由于外部影响随着自然季节的交替出现高峰与低谷的规律。

    3随机性:个别为随机变动,整体呈统计规律。

    4综合性:实际变化情况一般是几种变动的叠加或组合。

    预测时一般设法过滤除去不规则变动,突出反映趋势性和周期性变动。

    3. 特征识别 认识时间序列所具有的变动特征,以便在系统预测时选择采用不同的方法。

    1随机性:均匀分布、无规则分布,可能符合某统计分布。

    用因变量的散点图和直方图及其包含的正态分布检验随机性,大多数服从正态分布。

    2平稳性:样本序列的自相关函数在某一固定水平线附近摆动,即方差和数学期望稳定为常数。

    样本序列的自相关函数只是时间间隔的函数,与时间起点无关。

    其具有对称性,能反映平稳序列的周期性变化。

    特征识别利用自相关函数ACF:ρk=γk/γ0 其中γk是yt的k阶自协方差,且ρ0=1、-1 平稳过程的自相关系数和偏自相关系数都会以某种方式衰减趋近于0,前者测度当前序列与先前序列之间简单和常规的相关程度,后者是在控制其它先前序列的影响后,测度当前序列与某一先前序列之间的相关程度。

    实际上,预测模型大都难以满足这些条件,现实的经济、金融、商业等序列都是非稳定的,但通过数据处理可以变换为平稳的。

    4. 预测类型 1点预测:确定唯一的最好预测数值,其给出了时间序列未来发展趋势的一个简单、直接的结果。

    但常产生一个非零的预测误差,其不确定程度为点预测值的置信区间。

    2区间预测:未来预测值的一个区间,即期望序列的实际值以某一概率落入该区间范围内。

    区间的长度传递了预测不确定性的程度,区间的中点为点预测值。

    3密度预测:序列未来预测值的一个完整的概率分布。

    根据密度预测,可建立任意置信水平的区间预测,但需要额外的假设和涉及复杂的计算方法。

    5. 基本步骤 1分析数据序列的变化特征。

    2选择模型形式和参数检验。

    3利用模型进行趋势预测。

    4评估预测结果并修正模型。

    3.3.2随机时间序列 系统中某一因素变量的时间序列数据没有确定的变化形式,也不能用时间的确定函数描述,但可以用概率统计方法寻求比较合适的随机模型近似反映其变化规律。

    自变量不直接含有时间变量,但隐含时间因素 1. 自回归AR(p)模型 R:模型的名称 P:模型的参数自己影响自己,但可能存在误差,误差即没有考虑到的因素 1模型形式εt越小越好,但不能为0:ε为0表示只受以前Y的历史的影响不受其他因素影响 yt=φ1yt-1+φ2yt-2+……+φpyt-p+εt 式中假设:yt的变化主要与时间序列的历史数据有关,与其它因素无关; εt不同时刻互不相关,εt与yt历史序列不相关。

    式中符号:p模型的阶次,滞后的时间周期,通过实验和参数确定; yt当前预测值,与自身过去观测值yt-1、…、yt-p是同一序列不同时刻的随机变量,相互间有线性关系,也反映时间滞后关系; yt-1、yt-2、……、yt-p同一平稳序列过去p个时期的观测值; φ1、φ2、……、φp自回归系数,通过计算得出的权数,表达yt依赖于过去的程度,且这种依赖关系恒定不变; εt随机干扰误差项,是0均值、常方差σ2、独立的白噪声序列,通过估计指定的模型获得。

    2识别条件 当k>p时,有φk=0或φk服从渐近正态分布N(0,1/n)且|φk|>2/n1/2的个数≤4.5%,即平稳时间序列的偏相关系数φk为p步截尾,自相关系数rk逐步衰减而不截尾,则序列是AR(p)模型。

    实际中,一般AR过程的ACF函数呈单边递减或阻尼振荡,所以用PACF函数判别从p阶开始的所有偏自相关系数均为0。

    (3)平稳条件 一阶:|φ1|(4)模型意义 仅通过时间序列变量的自身历史观测值来反映有关因素对预测目标的影响和作用,不受模型变量相互独立的假设条件约束,所构成的模型可以消除普通回归预测方法中由于自变量选择、多重共线性等造成的困难。

    2. 移动平均MA(q)模型 1模型形式 yt=εt-θ1εt-1-θ2εt-2-……-θpεt-p (2)模型含义 用过去各个时期...

    展开全文
  • 文章目录读取数据并绘制时序图绘制自相关图和偏自相关图进行季节差分模型拟合 读取数据并绘制时序图 install.packages("astsa") ...通过对相同数据的分析,可尝试S=12为季度周期。 进行季节差分 #计算月度均值 e1x2m

    读取数据并绘制时序图

    install.packages("astsa")
    library(astsa)
    e1x2 <- ts(scan("C:/Users/l/Desktop/e1x2.dat")) #数据导入
    plot(e1x2, type="b") #画时序图
    

    在这里插入图片描述

    绘制自相关图和偏自相关图

    acf(e1x2)
    pacf(e1x2)
    

    在这里插入图片描述
    通过对相同数据的分析,可尝试S=12为季度周期。

    进行季节差分

    #计算月度均值
    e1x2m = matrix(e1x2, ncol=12,byrow=TRUE)
    col.means=apply(e1x2m,2,mean)
    plot(col.means,type="b", main="Monthly Means Plot for e1x2", xlab="Month",
    ylab="Mean")
    diffe12=diff(e1x2,12)#进行季节 s=12 差分
    plot(diffe12)
    acf2(diffe12,48)
    

    在这里插入图片描述
    对每个月的数据进行平均之后,可以看出数据已经没有了周期性。
    在这里插入图片描述
    在这里插入图片描述

    经过S=12的季节差分之后,数据的周期性几乎已经除去。图4中,偏自相关图1阶结尾,而自相关图拖尾,因此可以考虑p=1, q=0。另外,偏自相关图似乎具有以12为周期的拖尾现象,故可以考虑Q=1。总之,可以从模型ARIMA(1,0,0) × \times ×(0,0,1) 12 _{12} 12开始进行参数的尝试。

    模型拟合

    sarima(e1x2, 1,0,1,0,1,1,12)#****
    sarima(e1x2, 1,0,1,1,1,1,12)#12 阶以后小于 0.05***
    sarima(e1x2, 1,0,1,1,1,0,12)#**
    sarima(e1x2, 1,0,0,0,1,1,12)#***
    sarima(e1x2, 1,0,1,1,0,1,12)#****
    

    在这里插入图片描述

    通过对残差序列的检验,可知残差已经没有相关性,并且数据分布接近于正态。

    展开全文
  • 把坑填上,用前后值的均值把缺失值补上,再看一眼: 填充好缺失值的序列 发现这份数据有这样几个特点,在模型设计和数据预处理的时候要考虑到: 1、这是一个周期性时间序列,数值有规律的以天为周期上下波动,图...
  • 二、判断序列是否可以使用时间序列预测 首先从时间的角度可以把一个序列基本分为3类: 1.纯随机序列(白噪声序列),这时候可以停止分析,因为就像预测下一次硬币哪一面朝上一样毫无规律。 2.平稳非白噪声序列,...
  • 如果一个时间序列含有以下任一部分都可判定为非平稳的:趋势性部分、季节性部分、可预测周期性部分。 2. 借助平滑技术探索序列非平稳的原因。 移动平均法:t时点的轮廓值是由周围几个值做加权平均得到的。 核...
  • 通常判断数据周期性的方法是对数据进行傅里叶变换。采用是傅立叶变换,该方法快速且计算效率高,但在存在多季节性模式时效果不佳。 2. 代码示例 代码位置: https://github.com/lilihongjava/aiops def is_...
  • 离散时间复指数序列周期性质

    万次阅读 多人点赞 2018-07-18 23:00:42
    离散时间复指数序列的基波周期和基波频率 成谐波关系的周期离散时间复指数信号   序言 写这篇博文的目的有两个: 其一是为了下一篇博文:离散周期序列的傅里叶级数做准备,以及以后的信号处理学习打下基础。 ...
  • 时间序列的平稳、随机检验 在拿到时间序列数据后,首先要对数据的随机和平稳进行检测, 这两个检测是时间序列预测的重要部分。根据不同检测结果需要采取不同的分析方法。 为什么时间序列要求平稳呢?平稳...
  • 虽然连续时间信号与离散时间信号有许多相似之处,但是也存在一些重要的差别。我们首先来看下离散时间指数信号。
  • ejωte^{j\omega t}ejωt的性质 ...周期性(0到pi) 周期 任意ω\omegaω都有周期 满足ωN=2πm\omega N=2\pi mωN=2πm ω\omegaω 的影响 cos(πt/8)cos(\pi t/8)cos(πt/8) cos[(πt/8+2π)t]cos[(\pi t/8+2...
  • 时间序列相似

    万次阅读 2017-10-11 14:59:17
    对于两个序列来说,如果要比较两个波形的相似程度,可以使用DWT(动态时间规整)的方法...DTW通过把时间序列进行延伸和缩短,来计算两个时间序列性之间的相似。 1,两个要进行匹配的数据A=[A1,A2,...An]和B=[B1,B
  • 季节ARIMA:时间序列预测

    万次阅读 2019-02-17 15:22:36
    SARIMAX (seasonal autoregressive integrated moving average with exogenous regressor)是一种常见的时间序列预测方法,可以分为趋势部分和周期性部分;每个部分又可以分为自回归、差分和平滑部分。 趋势稳定性...
  • 时间序列

    千次阅读 2018-09-02 00:33:43
    时间序列的定义 所谓时间序列就是按照时间的顺序记录的一列有序数据。对时间序列进行观察、研究、找寻他发展变化的规律,预测他将来的走势就是时间序列分析,时间序列分析方法只适用于近期与短期的预测。 相关特征...
  • 序列分解1、非季节性时间序列分解 移动平均MA(Moving Average)①SAM(Simple Moving Average) 简单移动平均,将时间序列上前n个数值做简单的算术平均。 SMAn=(x1+x2+…xn)/n②WMA(Weighted Moving Average) ...
  • 周期函数f(x),其周期为T,角频率为,则该函数可展开为下面三角形式的傅里叶级数(展开条件等这里略过): 二、R中forecast::fourier用法 library(forecast) y=c(1,2,3,4,1,2,3,4) y=ts(y,frequency=4) res=...
  • 时间序列分析

    千次阅读 2018-10-29 21:15:51
    时间序列 时间序列(简称为时序)是指同一现象在不同时间上的相继观测值排列而成的数列,一个按时间顺序排列的数列,形式上由现象所属的时间和现象在不同时间上的观测值两部分组成,排列的时间可以是年份、季度、...
  • 时间序列的平稳检验方法汇总

    千次阅读 2021-10-28 00:23:04
    上文我们已经知道了什么是时间序列的平稳,也见到了一些平稳时间序列和非平稳的时间序列,那么当我们有一个新的时间序列数据时,怎么判断它是否是平稳的呢?时间序列平稳检验方法,可分为三类:图形...
  • 时间序列分析教程(一):基本性质

    千次阅读 多人点赞 2019-11-03 15:10:36
    这个学期接触了时间序列分析,期末复习了几天,稍微总结一下写一个系列的文章,如果出现一些知识错误或者迷惑的地方,欢迎交流。 时间序列分析,其实就是和自然语言处理一样对序列数据进行分析,只是这里的序列...
  • 时间序列--平稳介绍

    千次阅读 2021-04-08 20:51:26
    平稳时间序列中最重要的概念之一。 一个平稳的序列意味着它的均值、方差和协方差不随时间变化。 图一:均值是变化的(增长),整体是向上增长的趋势。在- 个平稳的序列里,它不应该有任何的变化趋势。 图二:...
  • 非平稳时间序列确定因素分解

    千次阅读 2017-06-25 09:37:52
    在自然界中,由确定因素导致的非平稳通常显示出比较强的规律,比如有显示的趋势与或者固有的变化周期,而随机因素导致的波动则非常难以确定、分析。根据这种性质,传统的时序分析方法通常都把分析的重点放在确定...
  • ARIMA模型 ...基本判断方法:稳定的数据,总体上是没有上升和下降的趋势的,是没有周期性的,方差趋向于一个稳定的值。 ARIMA数学表达 ARIMA(p,d,q),其中p是数据本身的滞后数,是AR模型即自回归模型
  • 分解时间序列(季节数据)

    万次阅读 2017-11-20 20:02:22
    一个季节性时间序列中会包含三部分,趋势部分、季节部分和无规则部分。分解时间序列就是要把时间序列分解成这三部分,然后进行估计。 对于可以使用相加模型进行描述的时间序列中的趋势部分和季节部分,...
  • 用 Python 检验时间序列的平稳

    千次阅读 多人点赞 2020-10-27 08:40:00
    在做时间序列分析时,我们经常要对时间序列进行平稳检验,而我们常用的软件是SPSS或SAS,但实际上python也可以用来做平稳检验,而且效果也非常好,今天笔者就讲解一下如何用pyth...
  • 时间序列分析之:傅里叶变换找周期

    千次阅读 热门讨论 2021-01-27 11:10:18
    时间序列分析 万万没想到吧,信号处理的技术,能用在数据分析中。谁叫我是学通信出生的呢? 承接上一篇:函数分解 本节承接上文找函数的周期。 文章目录时间序列分析傅里叶变换一、傅里叶变换(FFT)是什么?二、...
  • 时间序列可预测度量

    千次阅读 2020-10-10 14:04:31
    时间序列可预测度量,讲解从序列长度到平稳,排序熵等指标
  • 离散信号的周期性判定,C++实现

    千次阅读 2018-12-19 17:34:08
    理论上,计算信号的自相关,如果是周期性信号,则其自相关序列依然为周期性信号切几乎不会衰减;否则,则会出现逐渐衰减至0。 实际情况下由于噪声的存在,偶尔自相关的最大值不出现在τ\tauτ=0处,而且如果τ\tauτ...
  • 时间序列分析:平稳时间序列建模

    千次阅读 2020-06-08 19:07:21
    时间序列分析:平稳时间序列分析一.录入数据1.读入数据2.转为时间序列数据二. 平稳时间序列建模1.建模步骤2.根据序列的时序图,自相关图和偏自相关图判断序列的平稳,随机2.1.时序图检验2.2.自相关图检验2.3判断...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,646
精华内容 24,258
关键字:

时间序列周期性判断

友情链接: knearest.rar