题目类型与评价

商品价格预测与优化问题

本篇论文语言犀利且自成一派;有很多创新的切入点:比如以需求弹性代替传统的斯皮尔曼相关性分析;相关经济学说辞值得积累。

同时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 # 转换数据格式为符合 LSTM 输入要求

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 # 构建 LSTM 模型

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 # 计算 R 方、MSE、RMSE 和 MAE

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 # 创建一个 figure 和 axes 对象

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 # 创建一个新的 figure 和 axes 对象

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()