精华内容
下载资源
问答
  • 4个lstm做数据预测的案例源代码,包括比特币行情预测、天气预报等
  • BP神经网络做数据预测的matlab源代码,可以直接运行,神经网络预测过程是用详细程序实现的,而没有调用工具箱,便于初学者了解神经网络的工作原理!代码简洁易懂,希望对matlab爱好者有帮助!
  • 目标:用python实现数据的快捷处理,并输出预测值 在我的工作中,有一部分内容要涉及到年销售的预测并制定相应的订铺补计划 当然,相信很多涉及到销售行业的都会有这方面的需要,根据预测值制定分解任务指标 简单的...

    目标:用python实现数据的快捷处理,并输出预测值

    在我的工作中,有一部分内容要涉及到年销售的预测并制定相应的订铺补计划
    当然,相信很多涉及到销售行业的都会有这方面的需要,根据预测值制定分解任务指标

    简单的归纳下:

    1. 对数据进行处理回正:数据并不是拿到手就能使用的,因为人为的误差,或者可能是节假日、气象灾害的影响,或者商品交付上出现延期、返单,或者其他的意外原因,需要对数据进行修正才能使用(当然,不同的数据出现的误差也不一样,不在这里赘述)
    2. 按照分析目标对数据进行处理:在这里我的目标是,用前三年的历史销售数据,来预测第四年的销售情况,并按照第四年可能的销售情况,结合自身的经营情况制定一整年并分割到月的部署

    所以这里反馈的内容,就是利用Python来跑数据预测的公式,如果只是短期预测,那么Excel能简单做到,但是如果数据颗粒度达到每天,时间长度拉长到三五十年,那么处理和查漏也要花一点点小时间来完成。

    步骤分解:
    1.解析需要涉及到的公式:
    #基于周期性变化的分析:因为商品具有季节性,所以并不能简单直接用几年的数据进行回归,得到的公式用起来不实际,所以考虑数据的周期性变化,因为365天、或者52个星期、或者12个月会包含全年的销售情况,所以按照周期T的滚动合计值,应该是符合简单线性变化的 → → →参数T
    那么这里需要两个函数段:一个实现数据的滚动合计,一个实现数据的回归预测

    #自定义滚动合计函数
    def SUM_T_yidong(Y,T):                            #Y为需要处理的数据列表,T为数据周期
        SUM_T = []                                    #定义一个空列表用来装载计算出来的滚动合计值
        for num_1 in list(range(1, len(Y) + 1 - T)):  #从Y的第2个数据开始,到合计范围涵盖最后一个数据即第一个倒数第T个为之
            Sum_1 = sum(Y[num_1:num_1 + T])           #进行滚动求和
            SUM_T.append(Sum_1)                       #把求和值放入列表
        return SUM_T                                  #返回装有求和值的列表
    
    #单数据回归预测返回函数(一元线性回归方程的程序表示)
    def oneline_huigui_only_Y_yuce(Y,yuce_after_num): #根据Y列表输出后面几位的预测值
        X=list(range(1,len(Y)+1))                     #单列表只有Y数据,自动生成一个对应的序数列表
        X_pingjun = sum(X) / len(Y)                   #求X平均
        Y_pingjun = sum(Y) / len(Y)                   #求Y平均
        Sum_1 = []  # 放Xi*Yi
        Sum_2 = []  # 放Xi*Xi
        for n in list(range(0, len(Y))):              #计算Xn*Yn和Xn*Xn,并求b,a系数
            sum_1 = X[n] * Y[n]
            Sum_1.append(sum_1)
            sum_2 = X[n] * X[n]
            Sum_2.append(sum_2)
        b = (sum(Sum_1) - len(Y) * X_pingjun * Y_pingjun) / (sum(Sum_2) - len(Y) * X_pingjun * X_pingjun)
        a = Y_pingjun - b * X_pingjun
        print('一元线性回归公式:Y='+str(b)+'X+'+str(a))#显示一下回归公式方便自查
        Yuce = list(range(len(Y)+1,len(Y)+yuce_after_num+1))
        Yucezhi = []
        for yuce_X_num in Yuce:                       #根据回归公式和需要预测的时间段返回预测值
            Y_yuce = b*yuce_X_num+a
            Yucezhi.append(Y_yuce)
        return Yucezhi
    

    根据移动求和和求和项的回归预测,可以得到预测年的移动求和回归预测值
    即求和的最后一项为预测年全年,求和的倒数第二项为全年少最后一个期数据多去年最后一个期数据……
    也就是说,按照求和的预测值对前面的各期数据进行递减即可得到预测年的各期预测值

    这里产生了第三个程序段:

    #4.根据未来一年的移动求和值反向递减出未来一年每个周期的值
    meiyue = []
    for a in weilai_one_year:        #这里不能用=号,会改变原先列表的数据,试错之后,用遍历复制一个列表单独使用
        meiyue.append(a)
    for i in range(1,T):                              #先减去去年
        meiyue[i-1] = meiyue[i-1]-sum(sannian[-T+i:])
    #print(meiyue)
    for i in list(range(1,T)):                       #再减去预测年每月累加值
        meiyue[i] = meiyue[i]- sum(meiyue[:i])
    

    那么,一套下来,我们就由原先的数据得到了未来的简单线性预测值,因为还没学python直接制图,所以这里导出后用Excel制表
    一般来说,数据颗粒度越小越准确,但是图表上由于颗粒度对比全年的比例变小了,反而看不出明显的波动差异

    最后,把整个程序用 pyinstaller -F 打包成.exe小应用,就可以方便使用了,不论数据量有多大,在回正好数据之后,导入应用就能快捷的输出预测值,节省了大量机械重复的工作时间。
    由于工作操守,不对数据进行展示,但是预测值对数据的误差在可接受范围

    效果:
    在这里插入图片描述
    `那么再来看下按照52周和12个月的预测情况
    在这里插入图片描述
    在这里插入图片描述
    #变成月数据之后就能很明显的看到全年的季节性变化了

    展开全文
  • python时间序列数据预测教程之 arima

    千次阅读 热门讨论 2020-04-14 23:27:01
    目前关于时间序列数据分析预测大致有三种主流方法: 1、ARIMA系列方法 2、facebook开源的Prophet模型 3、LSTM时间序列预测 本系列将用python进行实现并做出总结。 首先,本文项目中所用数据为近一段时间内,间隔30...

    最近接触时间序列较多,在借鉴很多人的知识之后,特此总结一下。目前关于时间序列数据分析预测大致有三种主流方法:
    1、ARIMA系列方法
    2、facebook开源的Prophet模型
    3、LSTM时间序列预测

    本系列希望在项目和实践的角度,用python实现上述三种方法并做出对比总结。如有不足之处,感谢指出,虚心改正。
    所需环境: win10/ubuntu均可,python3.6.x,pandas,numpy,tensorflow2.0,statsmodels,pmdarima…

    (1)项目简介
    本文项目中所用数据为近一段时间内,间隔30分钟采样的气象数据(包括温度、湿度、风速、风向等数据)。在本文的理解中,arima方法仅支持单变量预测,也就是需要单独取出某列进行该列的预测。若想要多变量输入多变量输出,arima方法要拟合多个模型,再整合输入输出。
    (2)数据介绍
    数据是我从某气象网站爬取到的气象数据,已经做好数据清洗,提供一组测试数据放在文末,需要自取哈,举例如下:

    表中单位:温度(华氏度),湿度%,风向可转换角度,风速(mph)
    读取csv数据,数据清洗:

        def read_temperature():
            # 以首列的日期时间作为时间戳 此处要转换成pandas的DatetimeIndex格式
            data = pd.read_csv('data/test_2020.csv', usecols=[0, 1, 2, 3, 4])
            data['Date Time'] = pd.to_datetime(data['Date Time'])
            data.set_index('Date Time', inplace=True)
            data = data['Temperature']  # DatetimeIndex对象
            # 华氏度转摄氏度
            for i in range(len(data)):
                data[i] = round(5 / 9 * (data[i] - 32))
            # 时间频率重采样
            data = data.resample('30T').mean()  # 更新频率30分钟,缺省值用临近的后一值补充
            data = data.fillna(data.bfill())
    		# 显示数据
            data.plot(figsize=(15, 12))
            plt.show()
            return data
    

    当前数据图:

    (3) 平稳性检验
    arima时间序列数据预测首先要保证数据的平稳性,肉眼可以看到当前数据可能有一定上升趋势。但还是要有数据量化这个平稳性,这里我们使用ADF平稳性检验,基于statsmodels库实现:

        def adf_stability_test(self, data):
            # ADF单位根检验:不存在单位根,表示数据平稳。且不能是白噪声数据(随机数)
            x = data
            res = ts.adfuller(x)
            lb_res = lb_test(x, None, True)[1]
    
            tag = False
            for i in range(len(lb_res)):
                if lb_res[i] < 0.05:
                    continue
                else:
                    print('序列为白噪声!')
                    tag = True
                    break
            if res[0] < res[4]['1%'] and res[0] < res[4]['5%'] and res[0] < res[4]['10%'] and res[1] < 0.05 and not tag:
                print('平稳序列!非白噪声')
                # plt.plot(lb_test(x, None, True)[1])
                # plt.ylabel('p-Value')
                # plt.show()
                return True
            else:
                return False
    

    adfuller方法返回值:

    (-6.260374222209651, 4.237742412839035e-08, 5, 906, {'1%': -3.4375883271133243, '5%': -2.8647353885968214, '10%': -2.568471435365895}, 1615.9162778870964)
    

    ADF单位根检验,如果序列平稳,就不存在单位根;否则,就会存在单位根。该检验先假设序列不平稳,存在单位根。如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设 ->序列平稳。
    adfuller的返回值意义:

    adf:Test statistic,T检验,假设检验值。
    p-value:假设检验结果。
    usedlag:使用的滞后阶数。
    nobs:用于ADF回归和计算临界值用到的观测值数目。
    icbest:如果autolag不是None的话,返回最大的信息准则值。
    resstore:将结果合并为一个dummy。
    

    具体原理我也不是很懂,只需知道adf值,也就是本文的-6.260374222209651 均小于(10%,5%,1%)三个置信度的值,且p-value < 0.05时能够较好的拒绝原假设,表示序列平稳。
    若序列不平稳,需要对序列连续差分,直到序列平稳,对差分后的序列进行预测,再将预测结果逆差分,得到我们需要的值。

        def stability_test(self):
            count = 0
            flag = False
            if not self.adf_stability_test(self.data):
                while not self.adf_stability_test(self.data):
                    count += 1
                    self.data = self.data.diff(count)			# 差分
                    self.data = self.data.fillna(self.data.bfill())	# 缺省值用后一值补充
                    flag = True
            print('经过{}次差分,序列平稳'.format(count)) 
            return count, flag
    

    count是让序列变平稳的差分次数,也就是ARIMA(p,d,q)中的d,记录count值便于后面调pdq参数。flag记录是否经过差分,便于后期作逆差分还原数据。
    差分操作很容易理解:原数列的后一项减去前一项得到的一组差数列。
    相当于序列整体后移,空出第一位是空NAN,再与原序列做差

    0 1 2 3 4 5 6
    3 6 7 8 9 10 12 
    # 一阶差分
    0 	 1 2 3 4 5 6
    NAN  3 1 1 1 1 2  
    

    我们知道arima或者是seasonal arima最重要的是(p,d,q)和(P,D,Q,S)这四个参数的确定。
    而相对准确的方法是计算acf,pacf图,通过观察自相关图和偏相关图,确定拖尾还是截尾等什么鬼的…我到现在还似懂非懂。总之了解下来是要肉眼观察参数,不能自动化调参…
    但我们的数据是实时变化的,参数可能变动很大。自动化训练参数很有必要:
    (4) 模型参数训练
    目前了解两种自动确定参数方法:
    1)网格搜索的方法:
    感觉就是暴力搜索,用一些模型评价标准确定最优的参数,计算量很大复杂度高。不在乎效率也值得一试,此处用AIC准则评价模型,找出AIC评分最小的模型参数

        def temp_param_optimization(self, data):
            paramBest = []
            warnings.filterwarnings("ignore")
            p = q = range(0, 3)		# 限制pq范围
            pdq = [(x[0], self.d, x[1]) for x in list(itertools.product(p, q))]	# 此处的d我们已经得到
            seasonal_pdq = [(x[0], self.d, x[1], s) for x in list(itertools.product(p, q))]		# 此处的s是季节性参数,可根据数据指定,变化不大
            
            for param in pdq:
                for param_seasonal in seasonal_pdq:
                    try:
                        mod = sm.tsa.statespace.SARIMAX(data,
                                                        order=param,
                                                        seasonal_order=param_seasonal,
                                                        enforce_stationarity=False,
                                                        enforce_invertibility=False)
    
                        results = mod.fit()
                        paramBest.append([param, param_seasonal, results.aic])
                        print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
                    except:
                        continue
            # print('paramBest:', paramBest)
            minAic = sys.maxsize
            for i in np.arange(len(paramBest)):
                if paramBest[i][2] < minAic:
                    minAic = paramBest[i][2]
            # print("minAic:", minAic)
            for j in np.arange(len(paramBest)):
                if paramBest[j][2] == minAic:
                    return paramBest[j][0], paramBest[j][1]
    

    2)pmdarima
    了解过时间序列发现,很多用R语言作时间序列预测的。因为R提供自动训练参数的库auto_arima。也是在项目后期才发现python也有类似的开源库pmdarima,貌似就是模仿R而来的。
    直接pip install pmdarima -i https://pypi.tuna.tsinghua.edu.cn/simple
    ,pip安装要记得换源

        def auto_parameters(self, data, s_num):
            kpss_diff = arima.ndiffs(data, alpha=0.05, test='kpss', max_d=s_num)
            adf_diff = arima.ndiffs(data, alpha=0.05, test='adf', max_d=s_num)
            d = max(kpss_diff, adf_diff)
            D = arima.nsdiffs(data, s_num)
            
            stepwise_model = auto_arima(data, start_p=1, start_q=1,
                                        max_p=9, max_q=9, max_d=3, m=s_num,
                                        seasonal=True, d=d, D=D, trace=True,
                                        error_action='ignore',
                                        suppress_warnings=True,
                                        stepwise=True)
            print("AIC: ", stepwise_model.aic())
            print(stepwise_model.order)		# (p,d,q)
            print(stepwise_model.seasonal_order)	# (P,D,Q,S)
            print(stepwise_model.summary())		# 详细模型
            return stepwise_model.order, stepwise_model.seasonal_order
    

    十分方便的库,arima.ndiffs(),arima.nsdiffs()可以方便的求出最合适的d,和D参数。代码中s_num是自己指定的季节性参数。

    auto_arima(data, start_p=1, start_q=1,
    		     max_p=9, max_q=9, max_d=3, m=s_num,
    		     seasonal=True, d=d, D=D, trace=True,
    		     error_action='ignore',
    		     suppress_warnings=True,
    		     stepwise=True)
    

    start_p,start_q设置初始p,q参数,max_p,max_q最大值。stepwise=True貌似会直接选择最优参数。参数还有很多,请查阅官方api:https://alkaline-ml.com/pmdarima/index.html
    对比网格搜索的方法,本文觉得两种方法确定的参数几乎相同,但auto_arima训练参数特别快。同样的数据auto_arima要快一半以上。
    (5)模型预测

        def model_prediction(self, data, param, s_param, n_steps, flag):
            mod = sm.tsa.statespace.SARIMAX(data,
                                            order=param,
                                            seasonal_order=s_param,
                                            enforce_stationarity=False,
                                            enforce_invertibility=False)
            results = mod.fit()
    
            pred_uc = results.get_forecast(steps=n_steps)		# n_steps可指定预测的步数(多少时间间隔)
            pred_ci = pred_uc.conf_int()
    
            if flag:  # 还原差分
                pred_res = pd.Series([data[0]], index=[data.index[0]]).append(pred_uc.predicted_mean).cumsum()
                print("预测结果(℃):  ", pred_res)
                return pred_res
            else:
                print("预测结果(℃):  ", pred_uc.predicted_mean)
                return pred_uc.predicted_mean
    

    传入参数param,s_param分别对应(pdq)(PDQS)
    测试数据预测结果:


    4.21更新
    感觉对于数据的季节性参数设置可能有点迷。比如文中提到的网格搜索的参数s和auto_arima的参数m都是要自己设置的,当然要根据所用数据的频率间隔来设置季节性。我的理解是数据规律的周期性呈现方式。比如,我用的是每30分钟的观测数据,一个月的数据。就可以设置为日周期性30*48=1440,一天共48个间隔,m或者s参数设置为48可能比较合适,但还是要针对数据具体分析。
    如果各位同学可以科学上网的话,https://robjhyndman.com/hyndsight/seasonal-periods/ 这位博主关于季节性参数写的比较好!
    针对一般情况的设置:
    在这里插入图片描述

    链接:https://pan.baidu.com/s/1QiXhYYCOti2PiNcTTrraBg
    提取码:w2di
    但有些数据单位需要转换哈,像温度是华氏度

    展开全文
  • 数据预测建模概述

    千次阅读 2019-03-11 20:08:41
    2,一般拿到的数据为一个矩阵,一行对应一个观测,一列对应一个变量。一般自变量(解释变量)会有多个(x1, x2, …, xp),因变量(被解释变量)只有一个(y)。在预测过程中可以看成是发生在p+1为空间中的事件。 3...

    1,输入变量可以是数值型或分类型,输出变量也可以是数值型或分类型。如果输出为分类型,则称为分类预测模型;反之,则为回归预测模型。

    2,一般拿到的数据为一个矩阵,一行对应一个观测,一列对应一个变量。一般自变量(解释变量)会有多个(x1, x2, …, xp),因变量(被解释变量)只有一个(y)。在预测过程中可以看成是发生在p+1为空间中的事件。

    3,建模过程其实就在找p个x与一个y之间的关系,并将这种关系用一个模型表示出来(线性或非线性)。模型确定后,对于给定的新的p个x值,就可以预测出 y ^ \hat{y} y^

    4,对于分类预测模型,实际上是找到p维的超平面,使得位于超平面同侧的点更接近;而对于回归预测模型,也要找到一个p维的超平面,使得预测得到的值位于这个超平面上。

    5,对分类预测模型的评价

    在这里插入图片描述
    ROC曲线是很好的评价方式,参考ROC曲线

    TPR(真阳性率) = TP/(TP+FN),也叫查全率、敏感性;
    FPR(假阳性率) = FP/(FP+TN) = 1 - TN/(FP+TN),其中TN/(FP+TN)叫做真阴性率,又叫特异性;
    查准率 = TP/(TP+FP);

    由于查准率(Precision)和查全率(Recall)无法同时大,可以基于查准率和查全率的调和平均数定义F1值,F1越大预测结果越准确。
    1/F1 = 1/2 * (1/Precision + 1/Recall),即 F 1 = 2 ∗ P ∗ R / ( P + R ) F1 = 2*P*R/(P+R) F1=2PR/(P+R)

    准确性(Accuracy) = (TP+TN)/(TP+TN+FP+FN)

    6,对回归预测模型的评价

    可以计算均方误差去评价回归模型:
    在这里插入图片描述
    其实在进行回归建模时,就是要找到一系列参数使得均方平方和最小。

    7,统计建模、机器学习与深度学习

    7.1 统计建模数据量一般小,机器学习和深度学习大;
    7.2 统计建模对模型的关注度更大,先假定数据的概率分布,再选择模型,接着对参数进行估计,然后对数据进行解释;而机器学习更关注从数据到数据的预测准确性,选定好算法后,不断优化参数,使模型达到理想结果;深度学习更像是一个黑匣子,喂给它数据,它能自己学习出最佳的参数。

    展开全文
  • 二、时空交通数据预测 2.1 时空栅格数据预测 时空栅格数据预测的主要挑战主要是怎么样同时去捕获栅格数据的时空相关性,即在某一个时刻,某一个地点它的交通量跟它的邻近节点是有相关性的。另外,前一时刻各种不同...

    ⬆⬆⬆ 点击蓝字

    关注我们

    AI TIME欢迎每一位AI爱好者的加入!

    2020年9月25-26日,2020年中国科技峰会系列活动青年科学家沙龙将迎来新的一期—“人工智能学术生态与产业创新”。本次活动由中国科学技术协会主办,清华大学计算机系、AI TIME、智谱·AI承办;大会完整视频报告,请在B站关注“AI Time论道”,或点击下方“阅读原文”。

    9月26日上午,大会邀请到北京交通大学计算机与信息技术学院万怀宇副教授做了名为《时空交通数据预测方法及应用》的主题演讲。

    对于时空交通数据的应用AI Time在KDD 2020顶会论文分享中分享了《基于时空孪生神经网络的轨迹识别》点击查看,它通过时空交通数据进行出租车驾驶员身份识别,可以应用到本次分享中提到的时空轨迹数据。

    在演讲中,万怀宇老师介绍了时空交通网络的概念,分别介绍了他在时空栅格数据和时空图数据方面的研究成果,最后分享了这些研究在实际应用中的一些实例。

    万老师个人主页:http://faculty.bjtu.edu.cn/8793/

    万怀宇,博士,副教授,博士生导师,现任计算机与信息技术学院计算机科学系副主任。2012年博士毕业于北京交通大学;2013年至2014年在清华大学计算机系从事博士后研究工作(合作导师:唐杰)。中国中文信息学会社会媒体处理(SMP)专委会常务委员、秘书,中国计算机学会(CCF)会员,中国人工智能学会(CAAI)会员,IEEE member。期刊《Data Intelligence》编委。主要研究方向为数据挖掘与信息抽取,具体研究兴趣包括时空数据挖掘、社交网络分析与挖掘、用户行为分析、文本信息抽取等。已在AAAI、ICDE、ECML PKDD等会议和IEEE TITS、KBS、JAMIA等期刊发表学术论文30余篇。

    本文是AI Time对报告主要内容的简单整理:

    一、什么是时空交通数据

    首先简单了解时空交通数据是什么。交通是一个属于国民生产生活中特别大的行业,比如铁路的交通网络、公路的交通网络、民航航线的交通网络、城市中与交通相关的网络,包括轨道交通,甚至说移动通信领域各个基站组成的蜂窝网络都可以看成是一种交通场景。从这些例子可以看到,交通领域中空间节点、边以及它们之间的空间相关性是非常复杂的。

    在面对不同的交通网络的时候,可以采取不同的形式化描述方式。比如,对于城市区域的人口密度、车辆密度、交通拥堵状态等数据,我们可以用热力图做形式化描述。当采用热力图做分析时,由于其空间是连续的,通常会采用一些方法来做分割,例如进行栅格分割获得比较规则的栅格数据。而在另外一些情况下,比如公路、铁路或者航线网络,天然就是一种图结构,很适合使用图来描述这些交通网络的空间结构。

    还有一些交通数据是由具体的用户或者交通对象,比方说人、车辆或者某些传感器,在运动过程中产生的轨迹数据。轨迹数据在空间维度上看,是由节点之间的转移关系,形成的路径或者轨迹。

    如果把刚才列举的这些空间栅格、空间图和空间轨迹,再加上时间轴,就会形成不同类型的时空交通数据。那么为什么要分出时空栅格数据、时空图数据和时空轨迹数据呢?因为不同的数据类型要做预测,需要采用不同的方法。例如时空栅格数据是比较规则的欧氏数据,欧氏数据可以通过基于矩阵或者张量的方法进行描述。但是对于节点之间的关系不规则的时空图数据,它是一种非欧氏数据,那就需要一些基于图的方法表示和预测。对于时空轨迹数据,是在时空维度上的序列数据,这可以采用基于序列的方法来做预测。接下来介绍一些我们在时空网格数据和时空图数据方面做的一些工作,最后简单介绍一下我们跟交通领域的一些单位或企业合作过程中的一些实际应用场景。

    总体上来看,时空交通数据预测过程中面临着一些比较共性的挑战。首先,交通数据可以看成时间序列数据,时间序列数据存在时间序列性,包括邻近性、周期性、趋势性等。所谓临近性,就是交通数据一般不会突变(除非发生偶然事件),例如早晚高峰的堵车,这是一个逐渐变化的过程,不会突然跟上一时刻相比发生断崖式的变化。还有一定的周期性,比如天周期性,周周期性还有节假日的特有周期性等,此外还有整体上的趋势性。时空交通数据在空间维度上存在异质性,也就是说,不同的区域或者位置的交通模式是不一样的。以堵车为例,比如北京的双清路的堵法和西直门的堵法是不一样的。最后从时间和空间两个维度来看,交通网络既在时间维度有相关性,在空间维度上也有相关性,同时这两个维度混合在一块叫时空相关性。要做交通数据的预测,就是要去考虑这些时间序列性,空间的异质性和时空相关性这些特质,怎么在模型中同时捕获这些性质。

    二、时空交通数据预测

    2.1

    时空栅格数据预测

    时空栅格数据预测的主要挑战主要是怎么样同时去捕获栅格数据的时空相关性,即在某一个时刻,某一个地点它的交通量跟它的邻近节点是有相关性的。另外,前一时刻各种不同的节点对当前时刻的某个节点之间也是有相关性的。更远一点的时间点,它的交通量对于当前时刻的交通量也都可能存在一定的相关性。上图显示的结构,显然有点像一种三维的立体结构,由此我们想到,可以把计算机视觉领域的相关3D处理方法,引入时空交通数据预测。

    上图是ST-3DNet (Spatio-Temporal 3D Convolutional Neural Network )  模型框架。对于时空栅格数据而言,直接采用二维卷积,或者在二维卷积的基础上加上时间维,这样形成一个假的三维卷积,也就是二维卷积的堆叠,这些方式不能真正从时间、空间维度同时捕捉数据的时空相关性。如果采用三维卷积,从空间维度上分别从经度和纬度,从时间维度上再加一个时间轴,这样是一种天然的三维结构,这样就能够把这种三维卷积引入到时空网格的预测,同时捕获时空的相关性。

    基于这样一种基本的三维卷积结构,可以对它进行进一步的堆叠,形成深度的时空三维卷积网络。然后,我们再沿着时间轴形成一个很长的时空数据,再分别在时间轴上比较邻近的和比较远的地方构建这种时空三维卷积组件,最后把各个组件结果进行融合做预测。我们在模型里面,通过三维卷积捕获时空相关性,通过类似于注意力机制的结构捕获时空异质性,最后通过模型的融合来捕获周期性。这样在整个模型中就能够把时空栅格数据的各种特性都能捕获到。

    本节相关论文:S. Guo, Y. Lin, S. Li, Z. Chen, H. Wan. Deep Spatial-Temporal 3D Convolutional Neural Networks for Traffic Data Forecasting. IEEE Trans. on ITS , 2019.

    2.2

    时空图数据预测

    在我们的生活中,一些实际的场景中,不规则的数据远远要比规则数据更普遍。在这种交通网络结构上,面临的挑战同样是怎么样去对时空相关性做建模。比方说在空间维度上需要处理同一个时刻,不同的节点之间的相互影响。在时间维度上,同一个节点、同一条道路或者同一个站点,它的历史数据对未来数据会造成什么样的影响。在时空维度,一些邻近的节点,甚至相远的节点,他们对当前节点未来数据也是有一定的影响,这种影响跨越了时间和空间维度,我们怎么样建模过程中考虑它,这是我们在时空图数据预测中所面临的挑战。

    大家最近也会发现,深度学习领域的图神经网络非常流行。关于图神经网络方法在交通数据领域的应用,目前也有很多的学者做了这方面的工作,我们在2019年也做了一些这样的探索。首先我们在空间维度上用图卷积的方式捕获空间相关性,在每一个时间点上,同一个时刻先用空间的图卷积捕获空间关系,捕获到空间关系之后沿着时间轴排列起来,在时间维度上采用其他方式,例如一维卷积,或者循环神经网络,或者注意力机制来从时间维度进行建模。我们当时直接采用了一维卷积来捕获时间维度的信息。也就是首先从空间维度进行图卷积,然后在时间维度进行一维卷积,这样我们就可以构建一个能捕获时空相关性的结构或模块。

    上图是ASTGCN (Attention based Spatial-Temporal Graph Convolution Networks)  模型的架构。通过堆叠时空图卷积模块加深模型的深度,并且在时间轴上的不同位置建立不同的组件,比如近期组件用来捕获数据的邻近性,日周期组件和周周期组件用来捕获数据的周期性。总的来说,我们通过图卷积捕获空间相关性,通过一维标准卷积和多组件组合方式捕获时间维度的相关性,通过时空注意力机制捕获时空动态性,也就是异质性,这样我们的模型就会对整个时空图数据的各种特性有一个比较完整的建模,也在预测方面也取得了不错的效果。

    本节相关论文:S. Guo, Y. Lin, N. Feng, C. Song, H. Wan. Attention Based Spatial-Temporal Graph Convolutional Networks for Traffic Flow Forecasting. AAAI , 2019.

    但是上述模型在获取时空同步依赖方面仍然是有缺陷的,它的做法是先对空间维度进行建模,然后再时间维度进行建模,这样不能同步地捕获时空依赖。因此我们对之前的方法进行了改进,建立一种局部时空子图。上图是STSGCN (Spatial-Temporal Synchronous Graph Convolutional Networks)  模型架构。时空子图同时囊括了当前时刻、前一时刻和后一时刻共三个时刻的局部图结构,在这个图结构上构建一个新的局部时空子图的邻接矩阵。在这样新的邻接矩阵上做图卷积操作,我们就得到一种新的时空同步图卷积网络结构,这个模型也进一步提升了时空图数据的预测性能。

    本节相关论文:C. Song, Y. Lin, S. Guo, H. Wan. Spatial-Temporal Synchronous Graph Convolutional Networks: A New Framework for Spatial-Temporal Network Data Forecasting. AAAI, 2020.

    三、时空交通数据预测应用实例

    最后给大家分享几个我们在时空交通数据研究过程中的应用实例。

    我们跟一家航空公司合作,把时空图数据的预测模型应用于航班的需求预测。我们知道,一个航班在离起飞时间很早之前,会提前好几个月就开始售票,人们开始订票,整个过程中需求是有起伏的。因为航空公司之间面临着激烈的竞争,民航市场价格也是相对开放的,航空公司会有收益管理员负责航班的定价和放舱。什么时候该放舱,也就是把产品摆到货架上,什么时候该涨价或者打折,以前都是依靠收益管理员的经验,如果对航班需求变化曲线有一个比较准确的预测,就可以辅助收益管理员进行收益管理的相关决策。

    这是时空数据预测在高速公路上的一则应用。广东的虎门大桥非常拥堵,于是建了虎门二桥,也就是南沙大桥,但是虎门二桥改怎么收费需要做出决策。收多了民众不满意,就不走这儿过了,起不到分流的作用,收少了又收不回成本,在这样需求的情况下,我们通过对道路上车辆流量进行预测,并且对不同收费标准下的车流量进行仿真,最终给出一个合理的建议。

    另外,我们还跟滴滴合作,也做了一些探索。对于滴滴而言,通过用户的历史打车记录,能否预测出用户在未来一两天、两三天之内,某一个时间段范围内是不是存在某些OD(出发地-目的地对)的出行需求。这种预测主要为了促进共享出行,比如拼车的推荐,以及针对性营销,比如优惠券的精准发放。如果能够进行准确的OD预测,就可以把这个业务做得更好。

    另外,我们还尝试跟阿里菜鸟也了一些合作研究,去预测快递员在揽件或者派件过程中的路径。不同的快递员有不同的做法,有的很有经验,有的是新手,做路径预测可以给后台的订单分配提供依据。比方说新来一个订单,如果这个订单正好在某个快递员的揽收路径上,那么把这个新订单分配给这个快递员可能就比较合理,这样从时间上和成本上就会得到改善。

    总的来说,我感觉时空数据挖掘在智慧交通领域的应用前景非常广阔,值得我们去进行更多的探索。

    整理:闫昊

    审稿:万怀宇

    排版:田雨晴

    本周直播预告:

    AI Time欢迎AI领域学者投稿,期待大家剖析学科历史发展和前沿技术。针对热门话题,我们将邀请专家一起论道。同时,我们也长期招募优质的撰稿人,顶级的平台需要顶级的你,请将简历等信息发至yun.he@aminer.cn!

    微信联系:AITIME_HY

     

    AI Time是清华大学计算机系一群关注人工智能发展,并有思想情怀的青年学者们创办的圈子,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法、场景、应用的本质问题进行探索,加强思想碰撞,打造一个知识分享的聚集地。

    更多资讯请扫码关注

    (点击“阅读原文”查看直播回放)

    展开全文
  • 基于麻雀搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录基于麻雀搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立4.基于麻雀...
  • 神经网络故障诊断和数据预测的matlab程序;故障诊断运用的是BP神经网络,数据预测运用的是RBF神经网络,已经程序测试,成功运用
  • 利用BP神经网络进行数据预测(附工程源码)

    万次阅读 多人点赞 2018-12-29 16:41:00
     DataPrediction.py ------数据预测  ModelTrain.py ------模型训练 接下来解释每个文件的内容。 main.py import DataLoad as dataload import ModelTrain as modeltrain import DataPrediction ...
  • LSTM算法+数据预测

    万次阅读 多人点赞 2018-11-06 20:43:20
     本例程实现简单的数据预测,只考虑到股票最高值的单一变量,其实还有很多影响因素需要考虑。另外历程中对用的tensorflow中的调用函数及代码功能做了较为详细的注解。  运行的结果:蓝色的线为之前的数据,红色...
  • 【Matlab学习手记】BP神经网络数据预测

    万次阅读 多人点赞 2018-08-11 09:50:55
    目的:利用BP神经网络进行数据预测。 原理 代码 clear; clc; TestSamNum = 20; % 学习样本数量 ForcastSamNum = 2; % 预测样本数量 HiddenUnitNum=8; % 隐含层 InDim = 3; % 输入层 OutDi...
  • Matlab搭建BP神经网络实现数据预测

    千次阅读 2020-05-27 22:26:32
    Matlab搭建bp神经网络实现数据预测写自定义目录标题BP神经网络介绍matlab程序实现运行结果总结 BP神经网络介绍 BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照...
  • import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import statsmodels.api as sm from statsmodels.graphics.api ...#读取数据,进行处理 dta = [10930,10318,...
  • 怎样通过历史数据预测未来?

    万次阅读 2019-01-08 10:51:46
    很多人或许都看过火影忍者,你是否对蛤蟆丸口中的预言之子感到很神奇,这个老蛤蟆预言了很多事情,...那么哪些事情是可以预测的呢,比如预测天气、预测股票,预测世界杯或NBA,预测疾病,事故,公司明年的销量,未来...
  • BP神经网络数据预测

    千次阅读 2019-12-01 09:37:28
    能通过对输入的样本数据的学习训练,获得隐藏在数据内部的规律,并利用学习到的规律来预测未来的数据。 p=[20.55 22.44 25.37 27.13 29.45 30.1 30.96 34.06 36.42 38.09 39.13 39.99 41.93 44.59 47.30 52.89 ...
  • 使用TensorFlow搭建基本的网络,使用one-hot对于数据进行预处理,通过神经网络对数据进行训练,最终取得较好的分类效果,accuracy&gt;97%. 1.数据来源 数据来源于可穿戴传感器健康老年人动作识别,在网站注册...
  • SPSS 做数据预测方法

    千次阅读 2018-11-17 08:54:28
    在做logistics回归之前,我们要先对你要做预测的变量做个相关分析,找出和你因变量相关的自变量。我这里就不做了,直接用我处理之后的数据。打开我们要分析的数据,单击“分析”,选择“回归”,然后选择“二元...
  • 高斯回归进行数据预测

    千次阅读 2018-12-05 20:41:42
    上篇博客:使用高斯函数进行散点拟合预测:https://mp.csdn.net/postedit/84840449 其中的quex缺陷是,在训练数据x的shul数量超过几百后,求解速度回很慢。所以我们使用基于低秩加对角近似的FITC进行求解。模型是...
  • 数据预测之BP神经网络

    千次阅读 2019-04-16 16:07:50
    BP神经网络用于预测主要有两种利用方法: 根据自身已有的数据预测未来的数据; 根据已知的属性,预测未知的属性。
  • 机器学习入门04——糖尿病数据预测

    千次阅读 2019-04-16 13:50:09
    数据说明: Pima Indians Diabetes Data Set(皮马印第安人糖尿病数据集) 根据现有的医疗信息预测5年内皮马印第安人糖尿病发作的概率。 数据链接:https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes ...
  • 目前有某个产品每天的销量数据,想通过这些数据看这个产品的销量趋势 2. 原理3. 代码import numpy from scipy.optimize import leastsq import pylab def zuixiaoerchen(arrayY, picTitle): print(f"arrayY: {...
  • 对一组数据进行预测

    2017-11-10 20:35:55
    使用keras,tensorflow来.搭建LSTM实现对一组数据进行预测的的Demo
  • 本文demo源码、实验数据:传送门 https://gitee.com/orayang_admin/ARMA_prediction/tree/master 引言 前面我有分享两篇关于时间序列模型的文章,一篇是 Holt-Winters模型原理分析及代码实现(python...
  • Python实现经典机器学习案例 良/恶性性乳腺癌肿瘤完整数据预测 首先我们介绍一个概念,监督学习。 监督学习 “机器学习中监督学习模型的任务是根据已有经验知识对未知样本的目标/标签进行预测。根据目标预测变量的...
  • 引言这篇博客衔接上一篇博客: Holt-Winters模型原理分析及代码实现(python),我们在三次指数平滑的基础上,来进一步讨论下对时序数据预测。LSTM原理分析(参考博文:Understanding LSTM Networks)Long Short ...
  • MATLAB使用BP神经网络进行数据预测

    万次阅读 多人点赞 2018-02-13 07:32:24
    P=[93 260.5 -52 -0.07 1.216 3621 139 29 6.142 100 252.45 -48 -0.04 0.925 ... %输入数据 a=premnmx(a); %归一化 b=sim(net,a); c=postmnmx(b,mint,maxt); % 反归一化 c c = 2.0072e+03 具体见 这篇 博客。
  • keras中首先是训练神经网络模型,在训练好一个不错神经网络模型之后如何对数据进行预测呢? 这里就需要先保存训练好的...接下来的代码展示了如何保存model的结构与训练好的参数,以及如何重构模型用于之后的数据预测
  • 用BP神经网络做数据预测有两种形式: 1.根据自身已有的数据预测未来的数据。  比如:根据2000-2012年已知GDP的值预测2013年GDP的值。 求解:用2000,2001,2002的值作为输入,2003作为输出;然后以此类推...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 673,565
精华内容 269,426
关键字:

数据预测