质量守恒约束下的多变量线性拟合算法
算法背景
之前介绍了有边界的线性拟合算法,《有边界的线性拟合算法》,它的约束条件是所有系数都须在[0,1]范围内,但实际生产环境不仅仅是这个基本的限制。
已知条件
自变量矩阵X,在生产环境中称为进料矩阵:
X是k*m矩阵,k是样本数,m是自变量数,xij是第i个样本的第j个自变量。
因变量矩阵Y,在生产环境中称为出料矩阵:
Y是k*n矩阵,k是样本数,n是因变量数,yij是第i个样本的第j个因变量。
基础系数矩阵B,在生产环境中称为基础收率:
B是n*m矩阵。bij是第i个因变量(进料)第j个自变量(出料)的基础收率,基础收率的列和等于1。
边界矩阵BD
BD是n*m矩阵。wdij是第i个因变量第j个自变量的下边界,wuij是第i个因变量
算法目标
利用X,Y,B,BD在约束条件下拟合出系数矩阵W,生产环境中称为收率矩阵:
其中W是n*m矩阵。wij是第i个因变量(进料)第j个自变量(出料)的收率。
约束条件
1. 所有系数属于[0,1]区间,生产环境中收率不可以小于0或者大于1:
wij∈[0,1]
2. 系数矩阵W的各列和为1,生产环境中物料守恒,进料等于出料:
3. 系数矩阵W不可以偏离基础系数矩阵太远,只允许在一个相对较小的范围内取值,生产环境中实际收率只允许在基础收率附近波动。
wbij+β1≤wij≤wbij+β2
其中|β1|,|β2|相对于wbij是一个比较小的数。
算法原理
把自变量矩阵与基础系数矩阵的乘积称为基础因变量矩阵,记为Y’,把因变量矩阵与基础因变量矩阵的差称为误差矩阵,记为E。
Y’=X*BT
E=Y-Y’
利用有边界的线性拟合算法拟合误差矩阵,得到偏差系数矩阵,记为WE,再通过线性变换将偏差系数矩阵的列和调整为0,将变换后的偏差系数矩阵记为WE’,最后加上基础系数矩阵即可得到系数矩阵W。
WdT =linefit_bd(X,E,BD)
Wd’= linetrans(Wd,B)
W=B+Wd’
其中linefit_bd()是由边界的线性拟合函数,BD是允许的边界矩阵;linetrans()是线性变换函数。
如何满足约束条件:
有边界的线性拟合算法将Wd控制在一个较小的范围内,使得最后的系数W不会偏离B太远;基础系数B中的所有系数都在[0,1]之间且列和为1,线性变换时会根据B来变换,将其控制在[0,1]之间,同时使Wd’的列和为0,保证W的所有系数都在[0,1]之间且列和为1;
算法过程
E=Y-X*BT
2. 有边界线性拟合算法拟合偏差系数Wd:
WdT=linefit_bd(X,E,BD)
linefit_bd()算法过程参见《有边界的线性拟合算法》。
3. 对Wd线性变换得到Wd’
Wd各列和可能不为0,对其进行线性变化,设Wd是如下矩阵:
(1) 计算Wd的各列和Wcl:
(2) 把Wd每一行看作一个向量,第i行向量为Wdi
Wdi=[wdi1 wdi2 … wdim]
偏差系数矩阵可表示成:
(3) 计算Wdi以外的其他向量的和组成的矩阵Wds
Wds是n*m矩阵,其第i个向量Wdsi=Wd1+Wd2+…+Wdi-1+Wdi+1+...+Wdm,是Wd中去掉第i个向量以外的其他向量之和。
(4) 线性变换得到Wd’
Wdi,Wdsi,Wcl三者有如下关系:
Wdi+Wdsi=Wcl
已知Wdi是准确的,则Wdsi=Wcl-Wdi也是准确的,进行如下线性变换:
其中Wdci=[wdci1 wdci2 ... wdcim] 是第i个因变量,m个自变量线性变换后的向量矩阵。
线性变换后,相当于各列的偏差系数减去该列的系数均值。
W=Wd’+B
即wij=wd’ij+bij。
如果W的各列和符合约束条件wij∈[0,1],则拟合结束,线性变换后的偏差矩阵就是Wd’。
但当存在wd’ij使得wij∉[0,1]时,需要调整变换规则。
假设Wd的第j列Wdj有z个元素不符合约束条件或者等于0。
其中wdi(p)j是第i(p)个因变量,第j个自变量的偏差系数,它不符合约束条件或者等于0,即:
wdi(p)j+ bi(p)j∉[0,1] or wdi(p)j =0
这些元素组成的矩阵是Wdpj:
计算Wdsj:
其中wdsij是第j列第i个元素以外的其他元素的和,即:
wdsij=wd1j+wd2j+…+wd(i-1)j+wd(i+1)j+wdnj
变换方程如下:
其中Wdcj是Wdc的第j列元素,a是变换矩阵,是n*1矩阵。
为了使Wdcj满足约束条件,当wdij不满足约束条件时,ai=0,解上述方程如下:
其中z是不符合约束条件或者等于0的偏差系数个数,是z个不符合约束条件或者等于0的偏差系数之和,ai是a的第i个元素。
求得变换矩阵a后,带入Wdcj=Wdj-Wdsj**a,求得Wdcj。
用上述方法求得所有列的Wdcj,也就得到Wd’。
如果Wd’的所有元素符合约束条件wij=(wdcij+bij)∈[0,1],则拟合结束,变换后的偏差矩阵就是Wd’。如果仍然有wij∉[0,1],则把对应位置的wdcij元素视为不符合约束条件或者等于0的元素,加到Wdpj中,递归上述方法,直到wij=(wdcij+wbij)∈[0,1]为止,得到Wd’。
变换后的偏差系数Wd’加基础系数矩阵B,得到W
W=B+Wd’
写出代码
A | B | C | D | E | |
1 | =X | /参数:X 矩阵 (k*m) | |||
2 | =Y | /参数:Y 矩阵 (k*n) | |||
3 | =B | /参数:基础系数矩阵 (n*m) | |||
4 | =BD | /参数:边界矩阵 BD(n*m) | |||
5 | =linefit_bd_file | /边界算法文件绝对路径,如:”D:/linefit_bd_file.splx” | |||
6 | =func(A8,A1,A2,A3,A4) | ||||
7 | /约束条件下的线性变换,参数:X,Y,B,BD | ||||
8 | func | ||||
9 | =transpose(C8) | /BT,B转置 | |||
10 | =mul(A8,B9) | /X*BT | |||
11 | =B8.(~--B10(#)) | /E=Y-X*BT | |||
12 | =call(linefit_bd_file,A8,B11,D8) | /WdT=linefit_bd(X,E,BD) | |||
13 | =transpose(B12) | /Wd | |||
14 | =func(A17,B13,C8) | /WT=linetrans(Wd,B) | |||
15 | =transpose(B14) | /W | |||
16 | /线性变换,参数:Wd,B | ||||
17 | func | ||||
18 | =transpose(A17) | /Wd转置 | |||
19 | =transpose(B17) | /B转置 | |||
20 | =A17.pselect@a(~==~.len()*[0]) | /Wd全为 0 的行 | |||
21 | =B18.(~.count(~==0)) | /Wd每列 0 的个数 | |||
22 | =A17.len() | ||||
23 | =B18.((s=~.sum(),ind=#,~.(if(~==0,0,s/(B22-B21(ind)))))) | /0不参与平均,各列求均值 | |||
24 | =B18.(~--B23(#)) | /各列值减平均,Wd' | |||
25 | =B19.(~++B24(#)) | /W=B+Wd' | |||
26 | =transpose(B25) | ||||
27 | =B26.pselect@a(~.pselect(~<0||~>1)>0) | /查看是否有超范围的系数 | |||
28 | if B27.len()==0 | return B25 | /没有超范围的返回 W | ||
29 | else | =func(A32,B18,B20,B27,B19) | /有超范围的变换规则 | ||
30 | return C29 | ||||
31 | /递归消除不符合要求的系数,参数:WdT, 全为 0 的行号, 超范围的 Y 系数索引,BT | ||||
32 | func | ||||
33 | =D32.~.len() | ||||
34 | =A32.(~.sum()) | /Wcl | |||
35 | =A32.((w=~,w.((ind=#,if(~==0,0,w(to(B33)\ind).sum()))))) | /Wds转置 | |||
36 | =A32.(~.pselect@a(~==0)) | ||||
37 | for C32 | =B32&B37 | /全为 0 的行与超限行合并 | ||
38 | =B36.(~&C37) | /Wdpj的索引 | |||
39 | =B34.(~/((B33-C38(#).len()-1)*~+A32(#)(C38(#)).sum())) | /Wclj/[(n-z-1)*Wclj+wdi(p)j.sum()] | |||
40 | =A32.((ind=#,~.(if(C38(ind).pos(#)>0,0,C39(ind))))) | /a | |||
41 | =B35.(~**C40(#)) | /a**Wdsj | |||
42 | =A32.((idx=#,if(C40(#)==C40(#).len()*[0],C41(#),~--C41(#)))) | /Wd‘转置 | |||
43 | =D32.(~++C42(#)) | /BT+Wd'T | |||
44 | =transpose(C43) | /W | |||
45 | =C44.pselect@a(~.pselect(~<0||~>1)>0) | /再次确认是否有超限系数 | |||
46 | if C45.len()==0 | return C43 | /没有超范围的返回 W | ||
47 | else | =B32=C37 | /有超范围的记录下超限索引 | ||
48 | =func(A32,A32,B32,C45,D32) | /递归变换 Wd |
输入参数说明:
1. A1中的X是输入自变量矩阵,形状是k*m。
2. A2中的Y是输入自变量矩阵,形状是k*n。
3. A3中的B是输入基础系数矩阵,形状是n*m。
4. A4中的BD是输入边界矩阵,形状是n*m(这里要注意,每一行是1个Y的所有X的边界)。
应用举例
自变量矩阵X:
因变量矩阵Y:
基础系数矩阵B:
边界矩阵BD:
算法运行结果,最佳系数矩阵W:
最佳系数矩阵W的rmse:
rmse1=1.64
rmse2= 2.72
rmse3= 1.93
rmsei是第i列Y的rmse。
再来看下最小二乘法直接拟合的结果W:
完全不满足约束条件。