题目类型与评价
商品价格预测与优化问题
本篇论文语言犀利且自成一派;有很多创新的切入点:比如以需求弹性代替传统的斯皮尔曼相关性分析;相关经济学说辞值得积累。
同时LSTM和多目标遗传算法的代码也值得积累。 # 摘要
关键词:ACF自相关函数,FP-Growt 关联度分析,LSTM 模型
VIKOR评价,NSGAII算法
数据预处理
可能是史上最佳数据预处理之一。有理有据,细致入微。所有C题的数据处理都可以学习模仿。
甚至还为数据预处理部分画了个一览图。 ## 数据整合 ## 数据分析 ##
异常值处理 ## 无关值处理 # 问题一的模型建立与求解 ## 问题聚焦
将分布规律问题拆解为时间的基于分布规律与基于销售的分布规律;基于时间的分析又分为销售总量、各品类、单品。
## 时间分布规律 作图分析、周期性判定(ACF)、时间序列分解。
对于销售总量又分为年总量,周总量,日总量,结合实际情况充分解释规律。
## 各品类分布规律 结合需求弹性叙述: -
对于常见食用单品,作为生活刚需,需求弹性往往较低,但是对药用类以及礼品类商品,需求弹性往往较高,顾客购买量往往随外部因素影响变化较大。
## 各单品销量分布规律 前面将单品分成三类,在此部分的解释性上极其优越。
## 销量分布规律 从销量占比和销售模式方面分析
不仅比较各种类的占比(饼状图),还比较了高销售额的占比,长尾效应。
相互关系
时间序列问题相关性分析模版:
由于各品类销售量的数据为时间序列,直接进行相关性计算容易受时间上的宏观因素影响,并不能判断两种单品之间销量的关系。因此本文选择偏相关性分析确定两种品类之间的相互关系。
### 偏相关性分析模型 ### FP-Growth 关联分析模型 ### 相互关系的探究结果 -
品种之间:偏相关性分析模型 - 单品之间:FP-Growth 关联分析模型
问题二的模型建立与求解
由于题中所给的三年销量为时间序列数据,其变化随时间、社会经济等因素变化程度十分明显,直接对销量与定价的关系进行相关性分析难以得出正确的结论。
转而分析价格弹性
LSTM
此模型超参数和代码可以直接保存。备用。
得到结果并做统计分析。 - 观察上表发现各品类的进价预测效果 R 方达到
0.75 以上;同时 RMSE 与 MAE
的值相对于预测结果小一个数量级,因此本文认为该模型结果较好。 -
观察上表发现进价预测效果 R 方达到 0.6 以上,最高达到 0.96 较为接近
1;同时RMSE 与 MAE
的值相对于预测结果小一个数量级,因此本文认为该模型结果较好。
商超补货与定价策略研究
修正函数
最优化模型确立
确定了目标函数和约束条件 ### GBest PSO 求解模型 #
问题三模型的建立与求解 ## 未来 1 天相关数据的确定
删除总销量小的单品;加权平均得到预测值;VIKOR方法对需求度进行评价,删除后五位需求度单品。
-
由于单品在短时间内的销量与成本的变化无明显趋势,且无明显的变化规律,数据波动呈现随机性的特征,因此本问直接通过加权平均作为各单品在
7 月 1 日的销量与成本预测结果。 ## 商超补货与定价策略研究
双优化目标的决策模型建立
多目标遗传算法(代码也可以直接保存,适合多目标优化问题套用)
问题四
语文建模
商品定价类问题可以参考表述
模型鲁棒性检验
对LSTM模型进行鲁棒性检验
LSTM代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
| """
3 LSTM 预测模型
4 """
5 6 import pandas as pd
7 import numpy as np
8 from keras.models import Sequential
9 from keras.layers import LSTM, Dense
10 from sklearn.preprocessing import MinMaxScaler
11 from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
12 from math import sqrt
13 import matplotlib.pyplot as plt
14 plt.rcParams['font.sans-serif'] = ['SimHei']
15 plt.rcParams['axes.unicode_minus'] = False
16 17 file_path = "./out/result.csv"
18 df = pd.read_csv(file_path)
19 print(df.head(5))
20 df['销售日期'] = pd.to_datetime(df['销售日期'])
21 df.set_index('销售日期', inplace=True)
22 list_test = ['花叶类', '花菜类', '水生根茎类', '茄类', '辣椒类', '食用菌']
23 24 i = 4
25 print(i)
26 df = df[df['品类'] == list_test[i]]
27
28 scaler = MinMaxScaler(feature_range=(0, 1))
29 scaled_data = scaler.fit_transform(df['批发价格 (元/千克)'].values.reshape(-1, 1))
30 train_size = int(len(scaled_data) * 1)
31 train = scaled_data[0:train_size, :]
32 33
34 def create_dataset(dataset, look_back=1):
35 dataX, dataY = [], []
36 for i in range(len(dataset) - look_back - 1):
51 37 a = dataset[i:(i + look_back), 0]
38 dataX.append(a)
39 dataY.append(dataset[i + look_back, 0])
40 return np.array(dataX), np.array(dataY)
41 42 43 look_back = 30
44 trainX, trainY = create_dataset(train, look_back)
45 pre_X = train[-30:]
46 pre_X = [item for sublist in pre_X for item in sublist]
47 pre_X = np.array([[pre_X]])
48 trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
49 50
51 model = Sequential()
52 model.add(LSTM(6, input_shape=(1, look_back)))
53 model.add(Dense(7))
54 model.compile(loss='mean_squared_error', optimizer='adam')
55 history = model.fit(trainX, trainY, epochs=50, batch_size=1, verbose=2)
56 57 trainPredict = model.predict(trainX)
58 trainPredict = scaler.inverse_transform(trainPredict)
59 trainY = scaler.inverse_transform([trainY])
60 61 pre_Y = model.predict(pre_X)
62 pre_Y = scaler.inverse_transform(pre_Y)
63 64
65 mse = mean_squared_error(trainY[0], trainPredict[:, 0])
66 rmse = sqrt(mse)
67 mae = mean_absolute_error(trainY[0], trainPredict[:, 0])
68 r2 = r2_score(trainY[0], trainPredict[:, 0])
69 print(f'R2: {r2}, MSE: {mse}, RMSE: {rmse}, MAE: {mae}')
70 71 print(f" 预测未来七天{list_test[i]}的销量:{pre_Y[0, :]}")
72 73
74 fig, ax = plt.subplots(figsize=(12, 6))
75 ax.plot(trainY[0], label=f'{list_test[i]} 实际进价')
76 ax.plot(trainPredict[:, 0], label=f'{list_test[i]} 实际进价')
77 ax.set_xlabel('Time')
78 ax.set_ylabel('Value')
79 ax.legend()
80 ax.set_title(f'{list_test[i]} LSTM 预测结果图')
81 ax.grid()
82 beautiful(ax)
52 83 fig.savefig(f"./rst2/{list_test[i]}Loss.png")
84 fig.show()
85 86
87 fig, ax = plt.subplots(figsize=(12, 6))
88 loss_history = history.history['loss']
89 ax.plot(loss_history, label='Loss')
90 ax.set_xlabel('Epoch')
91 ax.set_ylabel('Loss')
92 ax.legend()
93 ax.set_title('Loss Over Training Epochs')
94 ax.grid()
95 beautiful(ax)
96 fig.savefig(f"./rst2/{list_test[i]}LSTM 预测结果图.png")
97 fig.show()
|