网站按关键词显示广告图片,宁河集团网站建设,外包公司和劳务派遣的区别,支付网站建设费入什么科目当大家面临着复杂的数学建模问题时#xff0c;你是否曾经感到茫然无措#xff1f;作为2021年美国大学生数学建模比赛的O奖得主#xff0c;我为大家提供了一套优秀的解题思路#xff0c;让你轻松应对各种难题。
希望这些想法对大家的做题有一定的启发和借鉴意义。 让我们来…当大家面临着复杂的数学建模问题时你是否曾经感到茫然无措作为2021年美国大学生数学建模比赛的O奖得主我为大家提供了一套优秀的解题思路让你轻松应对各种难题。
希望这些想法对大家的做题有一定的启发和借鉴意义。 让我们来看看MathorCup的B题
问题重述
这是一个电商零售商家需求预测及库存优化问题的描述。这个问题涉及到电商平台上的上千个商家它们将商品放在不同的仓库中而电商平台需要进行供应链管理以降低库存成本并保证按时交货。主要问题包括需求预测和库存优化。
问题一使用历史出货量数据附件1和相关附件中的信息需要预测各商家在各仓库的商品在2023年5月16日至2023年5月30日的需求量。预测的结果需要填写在结果表1并上传至竞赛平台。同时需要对模型的预测性能进行评价并讨论如何对这些时间序列进行分类以找到相似特征。
问题二有一些新的商家仓库商品维度出现附件5需要根据历史数据附件1找到相似序列并预测这些新维度在2023年5月16日至2023年5月30日的需求量。预测结果需要填写在结果表2并上传至竞赛平台。
问题三每年6月有大型促销给需求预测和履约带来挑战。附件6提供了去年双十一期间的需求量数据需要参考这些数据并给出2023年6月1日至2023年6月20日的需求量预测值填写在结果表3中并上传至竞赛平台。
问题一
问题一涉及对各商家在各仓库的商品需求进行预测此题我们使用ARIMA模型来进行预测。
步骤1数据预处理 首先对历史出货量数据进行预处理包括数据清洗、缺失值处理等以确保数据的质量和一致性。对附件2-4的信息也进行必要的数据关联以便使用商品、商家和仓库的特征信息。
步骤2时间序列分类 根据问题描述需要对不同商家、仓库和商品的时间序列进行分类以找到相似的特征。这可以通过以下步骤来实现
a. 对每个商家在各仓库的商品需求量序列进行聚类分析例如使用K均值聚类。
b. 对聚类后的序列进行统计特征提取如平均值、标准差、季节性等。
c. 基于提取的特征使用聚类结果将序列分为不同的类别。
步骤3需求预测
对于每个时间序列类别使用ARIMA模型进行需求预测。
步骤4模型评价 评估模型的性能可以使用各种指标如1-wmapeMAERMSE等。1-wmape在问题描述中已经给出可以计算每个序列的预测误差并汇总为模型整体性能。
ARIMA模型
ARIMAAutoRegressive Integrated Moving Average模型是一种经典的时间序列分析方法用于对时间序列数据进行建模和预测。它结合了自回归AR、差分I和滑动平均MA三个组成部分用于处理具有趋势和季节性的时间序列数据。ARIMA模型旨在捕捉数据中的自相关性和移动平均性从而生成未来时间点的预测。
下面是ARIMA模型的核心概念 自回归AR部分ARIMA模型中的AR代表自回归。这部分考虑了时间序列中的自相关性即过去时间点的观测值对当前时间点的影响。AR部分表示为p它表示在模型中考虑多少期的过去观测值。例如ARIMA(p, d, q)中的p。 差分I部分ARIMA模型中的I代表差分。这部分用于处理非稳定的时间序列即具有趋势和季节性的序列。通过差分可以将非稳定序列转化为稳定的序列。d表示差分的次数。例如ARIMA(p, d, q)中的d。 滑动平均MA部分ARIMA模型中的MA代表滑动平均。这部分考虑了时间序列中的滑动平均性即过去时间点的预测误差对当前时间点的影响。MA部分表示为q它表示在模型中考虑多少期的滑动平均误差。例如ARIMA(p, d, q)中的q。
ARIMA模型的建模步骤通常包括以下几个关键步骤 观察时间序列数据首先分析时间序列数据检查是否存在趋势、季节性以及自相关性。 差分操作如果时间序列数据不是稳定的需要进行差分操作直到数据变得稳定。差分的次数由参数d决定。 模型识别通过观察自相关函数ACF和偏自相关函数PACF的图表确定ARIMA模型的阶数p、d、q。 拟合ARIMA模型使用选定的参数拟合ARIMA模型到时间序列数据。 模型诊断检查模型的残差确保其是白噪声没有自相关性。 预测使用拟合好的ARIMA模型生成未来时间点的预测。
在问题一中使用ARIMA模型的主要原因是针对历史出货量数据进行需求预测。原因在于 存在趋势和季节性ARIMA模型适用于具有趋势和季节性的时间序列数据这在电商领域通常是普遍存在的情况。历史出货量数据往往受季节性促销、市场趋势等因素的影响因此需要模型来捕捉这些影响。 稳定性处理ARIMA模型中的差分I部分用于将非稳定的时间序列数据转化为稳定的序列。这对于处理数据中的趋势和季节性非常重要以便模型能够准确预测未来需求。 自相关性和滑动平均性ARIMA模型的自回归AR和滑动平均MA部分分别考虑了时间序列数据中的自相关性和滑动平均性从而更好地捕捉数据的内在模式。 参数调整ARIMA模型的参数p、d、q可以根据时间序列数据的特点进行调整以获得更准确的预测。这使得ARIMA模型非常灵活适应不同类型的时间序列。
因为它可以帮助预测各商家在各仓库的商品需求考虑了历史趋势、季节性和自相关性有助于更好地管理库存和满足客户需求。此外ARIMA模型的参数可以根据不同商家、仓库和商品的需求模式进行调整从而提高预测的准确性。 代码如下
import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller# 读取历史出货量数据
historical_data pd.read_csv(附件1.csv)
# 假设历史数据按日期升序排列
historical_data[date] pd.to_datetime(historical_data[date])# 定义检测时间序列稳定性的函数
def test_stationarity(timeseries):# 进行滚动统计检验Rolling Statisticsrolmean timeseries.rolling(window30).mean() # 选择合适的窗口大小rolstd timeseries.rolling(window30).std()# 绘制滚动统计检验结果orig plt.plot(timeseries, colorblue, label原始数据)mean plt.plot(rolmean, colorred, label滚动均值)std plt.plot(rolstd, colorblack, label滚动标准差)plt.legend(locbest)plt.title(滚动均值和滚动标准差)plt.show()# 进行Dicky-Fuller检验print(Dicky-Fuller检验结果)dftest adfuller(timeseries, autolagAIC)dfoutput pd.Series(dftest[0:4], index[Test Statistic, p-value, #Lags Used, Number of Observations Used])for key, value in dftest[4].items():dfoutput[Critical Value (%s) % key] valueprint(dfoutput)# 做时间序列稳定性检验
test_stationarity(historical_data[qty])# 进行时间序列差分以达到稳定性
# 通常需要多次差分直到时间序列变得稳定
differenced_data historical_data[qty].diff().dropna()# 再次进行稳定性检验
test_stationarity(differenced_data)# 使用ARIMA模型进行预测
model sm.tsa.ARIMA(historical_data[qty], order(1, 1, 1)) # 选择合适的ARIMA参数
results model.fit()# 输出模型的统计摘要
print(results.summary())问题二
问题二要求针对新出现的商家仓库商品维度进行需求预测这些维度在历史数据中没有出现过。建模思路可以分为以下几个步骤
步骤1数据准备
首先需要识别出历史数据中不存在的商家仓库商品维度。这些新维度可能代表新上市的商品或改变了商品存放的仓库。
步骤2相似序列查找 针对每个新出现的商家仓库商品维度需要查找历史数据中与之相似的时间序列。相似性可以通过多种方式来衡量如时间序列模式、统计特征等。以下是一种计算相似性的思路 a. 对于每个新维度计算其与历史数据中所有商家仓库商品维度的相似性分数。这可以使用各种距离度量方法如欧氏距离、相关系数等来计算。 b. 选择与新维度相似性得分最高的一组历史时间序列。这组历史序列将被用作预测新维度的参考。
步骤3需求预测
使用选定的相似历史序列可以应用相同的需求预测模型例如ARIMA、加权移动平均或其他时间序列模型来预测新维度的需求。预测的时间段为2023-05-16至2023-05-30。
步骤4结果记录
将预测结果填写在结果表2中并上传至竞赛平台。
公式表示 相似性计算可以使用欧氏距离作为相似性度量的一个示例 欧氏距离公式 Distance ( X , Y ) ∑ i 1 n ( X i − Y i ) 2 \text{Distance}(X, Y) \sqrt{\sum_{i1}^{n} (X_i - Y_i)^2} Distance(X,Y)i1∑n(Xi−Yi)2
其中X 和 Y是两个时间序列 X i X_i Xi和 Y i Y_i Yi分别是它们的对应时间点的值(n) 是时间序列长度。 需求预测 对于新维度使用选定的相似历史序列中的模型如ARIMA进行需求预测。
这个建模思路允许你根据历史数据中的相似性来预测新维度的需求而不需要依赖完全没有历史数据的新维度。因此你可以根据相似性找到最合适的历史数据并基于这些历史数据来进行需求预测。
其中(X) 和 (Y) 是两个时间序列 X i X_i Xi 和 Y i Y_i Yi分别是它们的对应时间点的值(n) 是时间序列长度。 需求预测 对于新维度使用选定的相似历史序列中的模型如ARIMA进行需求预测。 Demand Forecast ( X ) Model ( X similar ) \text{Demand Forecast}(X) \text{Model}(X_{\text{similar}}) Demand Forecast(X)Model(Xsimilar) 代码
import pandas as pd
import numpy as np
from scipy.spatial.distance import euclidean
from statsmodels.tsa.arima_model import ARIMA# 读取历史数据、新维度数据
historical_data pd.read_csv(附件1.csv)
new_dimension_data pd.read_csv(附件5.csv)# 存储新维度的预测结果
result_table_2 pd.DataFrame(columns[seller_no, warehouse_no, product_no, date, predicted_demand])# 针对每个新维度进行需求预测
for index, new_dimension_row in new_dimension_data.iterrows():# 获取新维度的商家、仓库、商品信息seller new_dimension_row[seller_no]warehouse new_dimension_row[warehouse_no]product new_dimension_row[product_no]# 查找与新维度相似的历史数据使用欧氏距离进行相似性计算historical_data[similarity] historical_data.apply(lambda row: euclidean([row[seller_no], row[warehouse_no], row[product_no]],[seller, warehouse, product]),axis1)# 选择相似性得分最高的历史序列most_similar_row historical_data.loc[historical_data[similarity].idxmin()]# 获取历史相似序列的需求历史数据historical_demand most_similar_row[qty].values# 使用ARIMA模型进行需求预测# 这里需要根据你的数据和需求进一步调整ARIMA模型的参数arima_model ARIMA(historical_demand, order(5,1,0)) # 举例使用ARIMA(5,1,0)arima_fit arima_model.fit(disp0)# 预测新维度的需求forecast arima_fit.forecast(steps15) # 预测未来15天的需求# 构建预测结果并添加到结果表2forecast_dates pd.date_range(start2023-05-16, end2023-05-30)forecast_data pd.DataFrame({问题三
问题三要求预测商家仓库商品维度在2023-06-01至2023-06-20期间的需求考虑到大型促销对需求的影响。以下是问题三的建模思路
步骤1数据准备
读取历史数据包括商家仓库商品维度在去年双十一期间的需求量数据附件。
步骤2特定日期范围的历史数据选择
从历史数据中筛选出与目标日期范围2023-06-01至2023-06-20相对应的数据这些数据将用于建模。
步骤3需求预测
使用时间序列模型如ARIMA或其他适当的模型对商家仓库商品维度在目标日期范围内的需求进行预测。需要考虑大型促销对需求的影响可以将促销期视为外部变量。
步骤4结果记录
将预测结果填写在结果表3中并上传至竞赛平台。
以下是一些公式示例用于表示ARIMA模型中的差分用于稳定性处理和需求预测
差分Differencing
差分用于将非稳定的时间序列数据转化为稳定的序列以便ARIMA模型能够准确预测。差分一次通常表示将时间序列减去其前一时刻的值。
差分公式 Difference ( Y t ) Y t − Y t − 1 \text{Difference}(Y_t) Y_t - Y_{t-1} Difference(Yt)Yt−Yt−1
需求预测
需求预测可以使用ARIMA模型中的预测方法。具体的预测公式取决于ARIMA模型的参数和历史数据的性质。
ARIMA模型的预测公式 Y ^ t h μ ∑ i 1 p ϕ i Y t h − i − ∑ j 1 q θ j Y ^ t h − j \hat{Y}_{th} \mu \sum_{i1}^{p} \phi_i Y_{th-i} - \sum_{j1}^{q} \theta_j \hat{Y}_{th-j} Y^thμi1∑pϕiYth−i−j1∑qθjY^th−j
其中 Y ^ t h \hat{Y}_{th} Y^th表示在时间 t h th th 的预测值 μ \mu μ 是模型的均值(p) 和 (q) 是ARIMA模型的阶数 ϕ i \phi_i ϕi 和 θ j \theta_j θj 是模型的参数。
import pandas as pd
import numpy as np
from statsmodels.tsa.arima_model import ARIMA# 读取历史数据附件6
historical_data pd.read_csv(附件6.csv)# 存储预测结果
result_table_3 pd.DataFrame(columns[seller_no, warehouse_no, product_no, date, predicted_demand])# 针对每个商家仓库商品维度进行需求预测
for index, row in historical_data.iterrows():seller row[seller_no]warehouse row[warehouse_no]product row[product_no]# 获取历史需求数据以便建立ARIMA模型historical_demand row[qty].values# 使用ARIMA模型进行需求预测# 这里需要根据你的数据和需求进一步调整ARIMA模型的参数arima_model ARIMA(historical_demand, order(5,1,0)) # 举例使用ARIMA(5,1,0)arima_fit arima_model.fit(disp0)# 预测2023-06-01至2023-06-20的需求forecast_dates pd.date_range(start2023-06-01, end2023-06-20)forecast arima_fit.forecast(stepslen(forecast_dates))# 构建预测结果并添加到结果表3forecast_data pd.DataFrame({seller_no: [seller] * len(forecast_dates),warehouse_no: [warehouse] * len(forecast_dates),product_no: [product] * len(forecast_dates),date: forecast_dates,#见完整代码
更多完整版代码思路 2023年第四届MathorCup大数据挑战赛B题