质量守恒约束下的多变量线性拟合算法

算法背景

之前介绍了有边界的线性拟合算法,《有边界的线性拟合算法》,它的约束条件是所有系数都须在[0,1]范围内,但实际生产环境不仅仅是这个基本的限制。

已知条件

自变量矩阵X,在生产环境中称为进料矩阵

..

Xk*m矩阵,k是样本数,m是自变量数,xij是第i个样本的第j个自变量。

因变量矩阵Y,在生产环境中称为出料矩阵

..

Yk*n矩阵,k是样本数,n是因变量数,yij是第i个样本的第j个因变量。

基础系数矩阵B,在生产环境中称为基础收率

..

Bn*m矩阵。bij是第i个因变量(进料)第j个自变量(出料)的基础收率,基础收率的列和等于1

边界矩阵BD

..

BDn*m矩阵。wdij是第i个因变量第j个自变量的下边界,wuij是第i个因变量

算法目标

利用XYBBD在约束条件下拟合出系数矩阵W,生产环境中称为收率矩阵

..

其中Wn*m矩阵。wij是第i个因变量(进料)第j个自变量(出料)的收率。

约束条件

1. 所有系数属于[0,1]区间,生产环境中收率不可以小于0或者大于1

wij[0,1]

2. 系数矩阵W的各列和为1,生产环境中物料守恒,进料等于出料:

..

3. 系数矩阵W不可以偏离基础系数矩阵太远,只允许在一个相对较小的范围内取值,生产环境中实际收率只允许在基础收率附近波动。

wbij+β1wijwbij+β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

算法过程

1. 计算误差矩阵E

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 wdi2wdim]

偏差系数矩阵可表示成:

..

(3) 计算Wdi以外的其他向量的和组成的矩阵Wds

..

Wdsn*m矩阵,其第i个向量Wdsi=Wd1+Wd2+…+Wdi-1+Wdi+1+...+Wdm,是Wd中去掉第i个向量以外的其他向量之和。

(4) 线性变换得到Wd’

WdiWdsiWcl三者有如下关系:

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的第jWdjz个元素不符合约束条件或者等于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

变换方程如下:

..

其中WdcjWdc的第j列元素,a是变换矩阵,是n*1矩阵。

为了使Wdcj满足约束条件,当wdij不满足约束条件时,ai=0,解上述方程如下:

..

其中z是不符合约束条件或者等于0的偏差系数个数,..z个不符合约束条件或者等于0的偏差系数之和,aia的第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(这里要注意,每一行是1Y的所有X的边界)。

应用举例

自变量矩阵X

..

因变量矩阵Y

..

基础系数矩阵B

..

边界矩阵BD

..

算法运行结果,最佳系数矩阵W

..

最佳系数矩阵Wrmse

rmse1=1.64

rmse2= 2.72

rmse3= 1.93

rmsei是第iYrmse

再来看下最小二乘法直接拟合的结果W

..

完全不满足约束条件。