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

算法背景

之前介绍了有边界的线性拟合算法,《有边界的线性拟合算法》,它的约束条件是所有系数都须在[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.dfx”



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

..

完全不满足约束条件。