首页 > 解决方案 > 是否有一种算法可以使用不同的数据约束进行平均?

问题描述

产品 产品 产品 当前的
1 是的 一个 17
2 是的 一个 22
3 是的 一个 21
4 是的 小号 44
5 是的 小号 32
6 是的 小号 23
7 是的 小号 56
8 是的 小号 73
9 是的 小号 12
10 是的 C 26
11 是的 C 45
12 是的 C 37

如上表所示,我有一些数据,其中的元素构成不同产品的一部分。例如,上表中的第 4 个元素(突出显示的行)即44是 product 的一部分QS并且Y。每个产品的平均值如下:

average of Product A=(17+22+21)/3=20
average of Product Q=(44+32+23)/3=33
average of Product S=(44+32+23+56+73+12)/6=40
average of Product Y=(17+22+21+44+32+23+56+73+12+26+45+37)/12=34

现在我想操纵数据,使新的平均值为:

Average of product A=   25
Average of product Q =  35
Average of Product S=   32
Average of product Y=   39

应保持产品内的月份和形状。

所以结果应该是(示例计算):

new Month 1= (new average - current average) +current month 1 value
new Month 1= (25 - 20) + 17 = 22

new Month 2= (new average - current average) +current month 2 value
new month 2 = (25 - 20 ) + 22 = 27

new Month 3= (new average - current average) +current month 3 value
new months 3 =(25-20)+ 21= 26

月形差异示例

第 1 个月 第 2 个月 第 3 个月
当前的 17 22 21
当前月差 22-17= 5 21-22= -1
新的 22 27 26
新月差 27-22= 5 26-27= -1

可以看出,month 2 - month1对于当前数据和新数据5,当前数据和新数据month 3- month 2-1适用。因此,产品的每月形状A得以保持。

产品 产品 产品 新的
1 是的 一个 22
2 是的 一个 27
3 是的 一个 26
4 是的 小号 46
5 是的 小号 34
6 是的 小号 25
7 是的 小号 38
8 是的 小号 55
9 是的 小号 -6
10 是的 C 57
11 是的 C 76
12 是的 C 68

目前我有一个 VBA 代码循环遍历每个元素多次以计算当前平均值和新平均值之间的差异并将此差异应用于元素。有没有我可以使用的矩阵算法来进行相同的计算而不是使用迭代循环?算法代码将在 Matlab、C++ 或 Python 或 VBA 中实现。目前我一直在探索 MATLAB 函数lsqlin,但无法让它做我想做的事。

能否请你帮忙?

标签: pythonalgorithmmatlabmatrix-multiplicationlinear-equation

解决方案


方法 :

  1. 忽略单个月份值,将其视为总和(与其形状有关)。[ mth1-mth12 >> 广告 ]
  2. 写下所有需要的关系。[ avg_X <--> a,b,c,d ]
  3. 使用关系和新的已知值,求解总和 [ a,b,c,d ]

执行 :

第 1 步:第 1-4 行 | 第二步:5-8行

定义:

价值与关系 “当前”案例 “新”案例
a = sum(mth1,mth2,mth3) 60 ?
b = sum(mth4,mth5,mth6) 99 ?
c = sum(mth7,mth8,mth9) 141 ?
d = sum(mth10,mth11,mth12) 108 ?
avg_A = a/3 20 25
avg_Q = b/3 33 35
avg_S = (b+c)/6 40 32
avg_Y = (a+b+c+d)/12 34 39

在“当前”情况下:上面的所有变量都有定义的值。

在“新”情况下(步骤 3):

 avg_A = a/3 = 25 >> a = 25*3 = 75
 avg_Q = b/3 = 35 >> b = 35*3 = 105
 avg_S = (b+c)/6 = ((105)+c)/6 = 32 >> c = 32*6-105 = 87
 avg_Y = (a+b+c+d)/12 = ((75)+(105)+(87)+d)/12 = 39 >> d = 201

用可以产生上述 a,b,c,d 值的任何值填写 mth1-12。

完毕。

p/s:由于 OP 仅共享 1 个新“案例”,Step2 细节可能会有所不同。但是,至少对于这种“形状”,这是可行的。

我之前的评论实际上指向一个声明“因为(观察到的关系不是真正的线性,所以不能在原始表上建立矩阵”。不过,如果你能弄清楚如何解决/将 Step2 关系置于矩阵形式, step3 应该更容易/自动化。

推荐阅读