注意:本文的数据处理是有选取的,仅选取了附件1,附件2的数据并没有计算在内,所以建立的模型会与整体(附加1+附件2)有偏差!!!!!!!!
利润率基本不可以用回归模型,销售额更是与常见的许多模型无法兼容。本文就是针对不同的模型进行检验,所以针对附件1的数据,整体只能使用神经网络模型进行作答。(自身看法,欢迎指正)
本文的主要是做模型排错,分析哪一个模型更适合基于附件1的第三问的模型。模型主要有:逐步回归模型,指数函数模型,幂函数模型,多项式回归,决策树、支持向量机(SVR)、随机森林。但是在末尾处会以神经网络模型对三者关系进行建模。
本文的代码中关于打折力度(discount)数据的输入是省略了%的,对比数据请注意。
问题:分析打折力度与商品销售额以及利润率的关系
一,前期数据处理工作(仅对附件1的数据,附件2没有)
年 | 月份 | 销售额 | 利润 | 成本 | 利润率 | 打折力度 | |
2016 | 11 | 6123.60 | 861.60 | 5262.00 | 0.16 | 28.51% | |
2016 | 12 | 654357.36 | 132267.76 | 522089.60 | 0.25 | 35.90% | |
2017 | 1 | 358531.36 | 54351.76 | 304179.60 | 0.18 | 28.05% | |
2017 | 2 | 356127.92 | 52690.32 | 303437.60 | 0.17 | 26.20% | |
2017 | 3 | 461516.80 | 69214.00 | 392302.80 | 0.18 | 26.77% | |
2017 | 4 | 603741.16 | 90391.88 | 513349.28 | 0.18 | 26.81% | |
2017 | 5 | 853279.68 | 130276.80 | 723002.88 | 0.18 | 26.45% | |
2017 | 6 | 844003.40 | 119882.00 | 724121.40 | 0.17 | 26.39% | |
2017 | 7 | 1120121.56 | 169056.28 | 951065.28 | 0.18 | 27.09% | |
2017 | 8 | 1191047.84 | 172036.96 | 1019010.88 | 0.17 | 26.88% | |
2017 | 9 | 1164564.84 | 166109.64 | 998455.20 | 0.17 | 27.67% | |
2017 | 10 | 1126388.16 | 166748.56 | 959639.60 | 0.17 | 27.91% | |
2017 | 11 | 1097795.44 | 171089.76 | 926705.68 | 0.18 | 27.46% | |
2017 | 12 | 1272362.68 | 168474.28 | 1103888.40 | 0.15 | 26.54% | |
2018 | 1 | 1510296.24 | 195741.12 | 1314555.12 | 0.15 | 27.17% | |
2018 | 2 | 1182952.12 | 169648.88 | 1013303.24 | 0.17 | 27.38% | |
2018 | 3 | 1454328.12 | 197717.60 | 1256610.52 | 0.16 | 27.88% | |
2018 | 4 | 1955898.76 | 255978.48 | 1699920.28 | 0.15 | 29.01% | |
2018 | 5 | 1993362.00 | 342418.24 | 1650943.76 | 0.21 | 28.50% | |
2018 | 6 | 2230717.88 | 366686.12 | 1864031.76 | 0.20 | 28.38% | |
2018 | 7 | 2643487.68 | 394404.08 | 2249083.60 | 0.18 | 28.69% | |
2018 | 8 | 3415037.56 | 480986.24 | 2934051.32 | 0.16 | 28.36% | |
2018 | 9 | 3046809.04 | 423980.16 | 2622828.88 | 0.16 | 28.24% | |
2018 | 10 | 3158534.8 | 426166.44 | 2732368.36 | 0.16 | 27.97% | |
2018 | 11 | 3429991.48 | 494197.36 | 2935794.12 | 0.17 | 28.46% | |
2018 | 12 | 2208572.84 | 286709.20 | 1921863.64 | 0.15 | 27.81% |
二,用MATLAB在以上数据的基础上进行皮尔逊相关系数分析,以量化每月商品打折力度、销售额和利润率之间的相关性程度。
然后得到:打折力度与销售额的皮尔逊相关系数: 0.0917
打折力度与利润率的皮尔逊相关系数: 0.6649
皮尔逊系数的值介于-1到1之间,接近1表示强正相关,接近-1表示强负相关,接近0表示无相关性。
打折力度与销售额的皮尔逊相关系数为0.0917,接近于0,说明它们之间的线性相关性较弱。这意味着打折力度与销售额之间的变化没有明显的线性关系。这个结果表明,在给定的数据集中,打折力度对销售额的影响较小。
另一方面,打折力度与利润率的皮尔逊相关系数为0.6649,接近于1。这意味着打折力度与利润率之间存在一个正相关关系。也就是说,当打折力度增加时,利润率通常也会增加。这个结果可能表明,在该数据集中,打折力度的增加导致了更高的利润率。
根据皮尔逊相关系数的分析,对销售额与打折力度来说,以下是一些可能适用于的模型(标红的是本文会用到的一部分模型):
-
非线性回归模型:考虑使用非线性回归模型,可包括多项式回归、高斯过程回归等。这些模型可以捕捉到非线性关系,并更准确地描述打折力度与销售额之间的关系。
-
决策树模型:决策树是一种机器学习模型,可以处理非线性关系。它可以根据打折力度的不同阈值将数据集划分为不同的子集,并预测每个子集的平均销售额。
-
集成模型:集成模型如随机森林和梯度提升树可以结合多个弱模型来建立复杂的关系。它们可以通过综合多个模型的预测结果来提高预测精度,从而更好地捕捉打折力度与销售额之间的关系。
-
深度学习模型:深度学习模型如神经网络可以学习复杂的非线性关系。可以使用具有多个隐藏层的神经网络来建模打折力度和销售额之间的关系。
对于利润率与打折力度来说,有以下模型可以参考:
-
线性回归:线性回归是一种常见的回归分析方法,它假设自变量和因变量之间存在线性关系。可以使用线性回归来建立打折力度与利润率之间的线性关系。
-
多项式回归:如果假设打折力度与利润率之间的关系不是简单的线性关系,可以尝试使用多项式回归。多项式回归可以拟合出二次、三次或更高次的曲线关系。
-
非线性回归:如果认为打折力度与利润率之间的关系是复杂的非线性关系,可以尝试使用其他非线性回归模型,如支持向量机回归、决策树回归或神经网络回归。(因为大部分模型在销售额部分已经建立,所以利润率部分就不做多的模型排除了)
三,基于以上分析,进行建模。会验证这部分建模是不符合情况的。
(一)对利润率:不做多的排错,主要在销售额版块
建立逐步回归分析模型,运用回归分析中的逐步回归分析法对数据进行拟合
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39,...
27.09, 26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, ...
29.01, 28.50, 28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
profit_margin = [0.16, 0.25, 0.18, 0.17, 0.18, 0.18, 0.18, 0.17,...
0.18, 0.17, 0.17, 0.17, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21,...
0.20, 0.18, 0.16, 0.16, 0.16, 0.17, 0.15];
% 构建表格数据
data = table(discount', profit_margin', 'VariableNames', {'Discount', 'ProfitMargin'});
% 进行逐步回归分析
mdl = stepwiselm(data, 'ProfitMargin ~ Discount');
% 打印回归模型的系数和统计信息
disp(mdl);
% 获取模型的系数
coefficients = mdl.Coefficients;
% 输出估计的系数
A = coefficients.Estimate(1);
B = coefficients.Estimate(2);
C = 0;
% 输出估计的系数
disp(['A = ', num2str(A)]);
disp(['B = ', num2str(B)]);
disp(['C = ', num2str(C)]);
对输出结果整理一下:
估计值 | 标准误差 | 统计值 | p值 | |
截距项 | -0.045762 | 0.050375 | -0.90844 | 0.37268 |
折扣力度项 | 0.0078458 | 0.0017992 | 4.3606 | 0.00021112 |
均方根误差 | R 方 | 调整 R 方 | F 统计量(常量模型) |
0.0163 | 0.442 | 0.419 | 19 |
总体而言,拟合模型的参数估计结果显示销售折扣系数 B 是显著的,而截距项 A 可能不显著。因为截距项 A 的 pValue 值较大。拟合模型的 RMSE 较小,表明模型对数据的拟合较准确。然而,R 方和调整 R 方值较低,说明模型仅能解释因变量变异中的一部分,可能还存在其他因素未被考虑进去
所以初步得到模型方程:Y=-0.045762+0.0078458x (y为打折力度, x为利润率)
然后检验一下,选取10组样本,代入方程中:
发现打折力度不符合,此模型确认无效。
(二)对销售额:
1.因为没有线性关系,所以先试着建立指数函数模型:
% 输入数据
discount = [28.51, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, 26.88, 27.67,...
27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, 28.38, 28.69, 28.36, ...
28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 358531.36, 356127.92, 461516.80, 603741.16, 853279.68,...
844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, 1097795.44, ...
1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, 1993362.00, ...
2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 将输入数据转换为矩阵形式
y = discount';
x = sales';
% 定义拟合函数
fun = @(c, x) c(1) * exp(c(2) * x);
% 初始参数猜测
initialGuess = [500, -0.1];
% 进行曲线拟合
fitResult = lsqcurvefit(fun, initialGuess, X, y);
% 计算拟合后的预测值
yFit = fun(fitResult, X);
% 绘制散点图和拟合曲线
scatter(X, y, 'filled');
hold on;
plot(X, yFit, 'r', 'LineWidth', 2);
hold off;
% 添加图形标题和坐标轴标签
title('Nonlinear Relationship between Discount and Sales');
xlabel('打折力度');
ylabel('销售额');
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09,...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50,...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 定义指数函数模型
fun = @(c, x) c(1) * exp(c(2) * x);
% 初始参数猜测
initialGuess = [500, -0.1];
% 进行非线性拟合
fitResult = lsqcurvefit(fun, initialGuess, sales,discount);
% 提取拟合得到的参数值
c1 = fitResult(1);
c2 = fitResult(2);
% 打印参数值
fprintf('c1 = %.2f\n', c1);
fprintf('c2 = %.2f\n', c2);
得到 拟合图与系数:
一看拟合曲线都没靠近真实数据点,都不用代入样本检测了,此模型无效。
2.幂函数模型:
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09,...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50,...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 定义幂函数模型
fun = @(c, x) c(1) * x.^c(2);
% 初始参数猜测
initialGuess = [1000, -0.5];
% 设置 options 参数
options = optimset('MaxFunEvals', 1000, 'MaxIter', 1000);
% 进行非线性拟合
fitResult = lsqcurvefit(fun, initialGuess, sales, discount, [], [], options);
% 提取拟合得到的参数值
c1 = fitResult(1);
c2 = fitResult(2);
% 打印参数值
fprintf('c1 = %.2f\n', c1);
fprintf('c2 = %.2f\n', c2);
% 计算拟合后的预测值
yFit = fun(fitResult, sales);
% 绘制散点图和拟合曲线
scatter(sales, discount, 'filled');
hold on;
plot(sales, yFit, 'r', 'LineWidth', 2);
hold off;
% 添加图形标题和坐标轴标签
title('Nonlinear Relationship between Discount and Sales');
xlabel('Sales');
ylabel('Discount');
观察图像,拟合曲线与数据点之间存在一些偏差,但整体趋势保持一致,拟合效果尚可。但回到系数,c2(x的次方)为0,这显然不合理。
3.多项式回归模型:y = c0 + c1 * x + c2 * x^2 + ...
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, ...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, ...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 设置多项式阶数
order = 2;
% 进行多项式回归拟合
fitResult = polyfit(sales, discount, order);
% 提取拟合得到的参数值
c = flip(fitResult); % 翻转系数以便与方程的次数对应
% 打印参数值
fprintf('拟合得到的多项式方程为: \n');
for i = 1:length(c)
fprintf('c%d = %.2f\n', i-1, c(i));
end
% 代入新的销售额数据进行预测
newSales = XLSX(:,1); % 新的销售额数据
predictedDiscount = polyval(fitResult, newSales); % 计算预测的折扣率
% 打印预测结果
fprintf('预测的折扣率为: \n');
for i = 1:length(predictedDiscount)
fprintf('销售额 %.2f 的折扣率预测为 %.2f\n', newSales(i), predictedDiscount(i));
end
% 绘制散点图和拟合曲线
scatter(sales, discount, 'filled');
hold on;
plot(sales, polyval(fitResult, sales), 'r', 'LineWidth', 2);
% 绘制预测结果
plot(newSales, predictedDiscount, 'bo', 'MarkerSize', 10);
hold off;
% 添加标题和坐标轴标签
title('Polynomial Relationship between Discount and Sales');
xlabel('Sales');
ylabel('Discount');
单看拟合图,效果是还可以的,问题还是在系数上
得到的结果代入就是 y = 28.11 + (-0.00)x + 0.00x^2
所以,模型无效。
4.决策树回归模型:具有非线性拟合能力
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, ...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, ...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 转换数据形式
X = sales.';
y = discount.';
% 拟合决策树回归模型
treeModel = fitrtree(X, y);
% 代入新的销售额数据进行预测
newSales = XLSX(:,1); % 新的销售额数据
predictedDiscount = predict(treeModel, newSales); % 计算预测的折扣率
% 打印预测结果
fprintf('预测的折扣率为: \n');
for i = 1:length(predictedDiscount)
fprintf('销售额 %.2f 的折扣率预测为 %.2f\n', newSales(i), predictedDiscount(i));
end
% 绘制散点图和决策树拟合曲线
scatter(sales, discount, 'filled');
hold on;
x = linspace(min(X), max(X), 100);
yFit = predict(treeModel, x.');
plot(x, yFit, 'r', 'LineWidth', 2);
hold off;
% 添加标题和坐标轴标签
title('Decision Tree Regression');
xlabel('Sales');
ylabel('Discount');
一样,拟合图效果是可以的,因为决策树没有系数可以判断,此次我们就抽取10组样本代入检验(样本数据与神经网络模型代入的样本数据一致),发现结果竟然都一样,显然不可能。
所以,此模型无效。
5.支持向量回归(Support Vector Regression,SVR),简称SVR模型
SVR模型可以通过使用核函数(如线性核函数、高斯核函数等)来处理非线性关系,具有较强的拟合能力
% 输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, ...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, ...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 转换数据形式
X = sales.';
y = discount.';
% 创建SVR模型
svr = fitrsvm(X, y, 'KernelFunction', 'rbf');
% 代入新的销售额数据进行预测
newSales = XLSX(:,1); % 新的销售额数据
predictedDiscount = predict(svr, newSales); % 计算预测的折扣率
% 打印预测结果
fprintf('预测的折扣率为: \n');
for i = 1:length(predictedDiscount)
fprintf('销售额 %.2f 的折扣率预测为 %.2f\n', newSales(i), predictedDiscount(i));
end
% 绘制散点图和SVR拟合曲线
scatter(sales, discount, 'filled');
hold on;
x = linspace(min(X), max(X), 100)';
yFit = predict(svr, x);
plot(x, yFit, 'r', 'LineWidth', 2);
hold off;
% 添加标题和坐标轴标签
title('SVR Regression');
xlabel('Sales');
ylabel('Discount');
与决策树一样的分析。此模型无效。
6.随机森林回归模型
随机森林模型是一种集成学习方法,结合了多棵决策树的预测结果,能够更好地应对非线性关系和噪声
% 导入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, ...
26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, ...
28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, ...
853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, ...
1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, ...
1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 转换数据形式
X = sales.';
y = discount.';
% 创建随机森林回归模型
ntrees = 100; % 决策树的数量
model = TreeBagger(ntrees, X, y, 'Method', 'regression');
% 代入新的销售额数据进行预测
newSales = XLSX(:,1); % 新的销售额数据
predictedDiscount = predict(model, newSales); % 计算预测的折扣率
% 打印预测结果
fprintf('预测的折扣率为: \n');
for i = 1:length(predictedDiscount)
fprintf('销售额 %.2f 的折扣率预测为 %.2f\n', newSales(i), predictedDiscount(i));
end
% 绘制散点图和随机森林回归拟合曲线
scatter(sales, discount, 'filled');
hold on;
x = linspace(min(X), max(X), 100)';
yFit = predict(model, x);
plot(x, yFit, 'r', 'LineWidth', 2);
hold off;
% 添加标题和坐标轴标签
title('Random Forest Regression');
xlabel('Sales');
ylabel('Discount');
一样。此模型无效。
四,运用神经网络模型建模
(一)对利润率
以利润率作为自变量,打折力度作为因变量,建立线性回归模型。初始化两个权重,接着优化算法与均方差编译模型,将模型配置好后即可对模型进行数据训练。将每天打折信息表代入模型训练,训练次数为1000。随机代入一条数据进行检测,得出神经网络模型对商品打折力度的预测值。
% 每天的商品信息表作为输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39,...
27.09, 26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, ...
29.01, 28.50, 28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
profit_margin = [0.16, 0.25, 0.18, 0.17, 0.18, 0.18, 0.18, 0.17,...
0.18, 0.17, 0.17, 0.17, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21,...
0.20, 0.18, 0.16, 0.16, 0.16, 0.17, 0.15];
% 建立神经网络模型
net = fitnet(2); % 2个隐层节点的网络
net = configure(net, profit_margin, discount);
net.layers{2}.transferFcn = 'purelin'; % 将第二层的激活函数设置为线性函数
% 设置优化算法和训练参数
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法
net.divideFcn = 'dividerand'; % 随机划分训练集、验证集和测试集
net.trainParam.epochs = 1000; % 迭代次数
net.trainParam.goal = 0; % 训练目标为最小化均方差
% 对模型进行训练
[net, tr] = train(net, profit_margin, discount);
% 随机选取一条数据进行模型预测
input = profit_margin(1); % 随机选择一条数据
output = net(input); % 进行模型预测
% 输出模型预测结果
disp(['神经网络模型对商品打折力度的预测值为: ' num2str(output)]);
再随机挑选10组数据(以天为单位)进行模型预测:
% 利润率和打折力度数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39,...
27.09, 26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, ...
29.01, 28.50, 28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
profit_margin = [0.16, 0.25, 0.18, 0.17, 0.18, 0.18, 0.18, 0.17,...
0.18, 0.17, 0.17, 0.17, 0.18, 0.15, 0.15, 0.17, 0.16, 0.15, 0.21,...
0.20, 0.18, 0.16, 0.16, 0.16, 0.17, 0.15];
% 建立神经网络模型
net = fitnet(2);
net = configure(net, profit_margin, discount);
net.layers{2}.transferFcn = 'purelin';
% 设置优化算法和训练参数
net.trainFcn = 'trainlm';
net.divideFcn = 'dividerand';
net.trainParam.epochs = 1000;
net.trainParam.goal = 0;
% 训练模型
[net, tr] = train(net, profit_margin, discount);
% 利润率为0.22时的打折力度预测
profit_margin_pred = 0.22;
discount_pred = net(profit_margin_pred);
% 输出预测结果
fprintf('利润率为%.2f时的打折力度预测值为: %.2f\n', profit_margin_pred, discount_pred);
再进行数据对比:
销售额 | 利润率 | 打折力度 | 打折力度(预测值) |
55632.48 | 0.19 | 28.13% | 27.29% |
81695.6 | 0.12 | 27.60% | 28.37% |
161466.68 | 0.19 | 26.76% | 27.29% |
79846.88 | 0.17 | 28.57% | 27.81% |
48421.12 | 0.19 | 27.47% | 27.29% |
15122.64 | 0.16 | 25.34% | 28.13% |
115908.12 | 0.16 | 29.19% | 28.13% |
56241.72 | 0.15 | 27.39% | 27.85% |
6123.6 | 0.16 | 28.51% | 28.13% |
发现预测值与真实值十分接近,所以该模型预测结果是基本准确的。
(二)对销售额
以销售额作为自变量,打折力度作为因变量,建立指数函数模型。初始化两个权重,接着优化算法与均方差编译模型,将模型配置好后即可对模型进行数据训练。将每天打折信息表代入模型训练,训练次数为1000。随机代入一条数据进行检测,得出神经网络模型对商品打折力度的预测值。
% 每天的商品信息表作为输入数据
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45, 26.39, 27.09, 26.88, 27.67, 27.91, 27.46, 26.54, 27.17, 27.38, 27.88, 29.01, 28.50, 28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80, 603741.16, 853279.68, 844003.40, 1120121.56, 1191047.84, 1164564.84, 1126388.16, 1097795.44, 1272362.68, 1510296.24, 1182952.12, 1454328.12, 1955898.76, 1993362.00, 2230717.88, 2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 建立神经网络模型
net = fitnet(2); % 2个隐层节点的网络
net = configure(net, sales, discount);
net.layers{2}.transferFcn = 'purelin'; % 将第二层的激活函数设置为线性函数
% 设置优化算法和训练参数
net.trainFcn = 'trainlm'; % 使用Levenberg-Marquardt算法
net.divideFcn = 'dividerand'; % 随机划分训练集、验证集和测试集
net.trainParam.epochs = 1000; % 迭代次数
net.trainParam.goal = 0; % 训练目标为最小化均方差
% 对模型进行训练
[net, tr] = train(net, sales, discount);
% 随机选取一条数据进行模型预测
input = sales(1); % 随机选择一条数据
output = net(input); % 进行模型预测
% 输出模型预测结果
disp(['神经网络模型对商品打折力度的预测值为: ' num2str(output)]);
再代入10组数据预测:
discount = [28.51, 35.90, 28.05, 26.20, 26.77, 26.81, 26.45,...
26.39, 27.09, 26.88, 27.67, 27.91, 27.46, 26.54, 27.17,...
27.38, 27.88, 29.01, 28.50, 28.38, 28.69, 28.36, 28.24, 27.97, 28.46, 27.81];
sales = [6123.60, 654357.36, 358531.36, 356127.92, 461516.80,...
603741.16, 853279.68, 844003.40, 1120121.56, 1191047.84,...
1164564.84, 1126388.16, 1097795.44, 1272362.68, 1510296.24, ...
1182952.12, 1454328.12, 1955898.76, 1993362.00, 2230717.88, ...
2643487.68, 3415037.56, 3046809.04, 3158534.8, 3429991.48, 2208572.84];
% 建立神经网络模型
net = fitnet(2);
net = configure(net, sales, discount);
net.layers{2}.transferFcn = 'purelin';
% 设置优化算法和训练参数
net.trainFcn = 'trainlm';
net.divideFcn = 'dividerand';
net.trainParam.epochs = 1000;
net.trainParam.goal = 0;
% 训练模型
[net, tr] = train(net, sales, discount);
% 销售额为6123.6时的打折力度预测
sales_pred = 6123.6;
discount_pred = net(sales_pred);
% 输出预测结果
fprintf('销售额为%.2f时的打折力度预测值为: %.2f\n', sales_pred, discount_pred);
进行数据对比:
销售额 | 打折力度 | 打折力度(预测值) |
55632.48 | 28.13% | 27.79% |
81695.6 | 27.60% | 28.41% |
161466.68 | 26.76% | 27.66% |
79846.88 | 28.57% | 27.80% |
48421.12 | 27.47% | 28.23% |
15122.64 | 25.34% | 26.22% |
115908.12 | 29.19% | 28.05% |
56241.72 | 27.39% | 27.22% |
6123.6 | 28.51% | 28.41% |
发现预测值与真实值一样非常接近,所以神经网络模型适用于本题(仅附件1数据情况下)。
最后,做了这么多模型排错,结论是:数据读取要完整。阅读附件内容要仔细,不要遗漏。本人就是遗漏了附件2的数据,建模路上才踩了这么多趟雷。完整数据很好建模的。可以看看本人的完整第3问分析博客。