有边界的线性拟合算法

有边界的线性拟合算法

已知自变量矩阵X和因变量矩阵Y,两者存在线性关系,但系数被限制在一个范围内,这个范围称为边界,试求出该边界范围内的最佳系数矩阵。

..

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

..

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

..

其中WBD的是n*m矩阵。wdij是第i个因变量第j个自变量的下边界,wuij是第i个因变量对应的第j个自变量的上边界, [wdij, wuij]i个因变量对应的第j个自变量的取值范围。每一行是一个因变量所有的自变量边界。

应用背景

在生产环境中,进料转换成出料的转换率称为收率,收率的取值范围在[0,1]之间,也就是转换率不可以小于0,也不可以大于1。进料矩阵就是自变量X,出料矩阵就是因变量Y,收率的取值范围就是边界矩阵BD

算法目标:

计算边界范围内的最佳拟合系数。

算法原理:

计算拟合系数通常会使用最小二乘法(LS)来实现,但简单执行LS算法,可能会导致拟合系数超出边界的情况,比如在生产拟合时会出现收率大于1或小于0的情况,这就完全没有意义了。

用最小二乘法求拟合系数的过程本质上是二次函数的极值问题,可以证明,在有界范围,二次函数的极值可能在边界上,也可能在偏导数为0的位置,穷举所有X的系数边界和偏导数为0的所有可能,每个自变量对应的系数都有3种取值,分别是上界,下界,偏导数为0m个自变量就会有3m种可能,找到使rmse最小的一套系数即为边界范围内的最佳系数。在m不大的时候,这个算法具有实际可行性。

算法过程:

设求得的系数矩阵W如下:

..

其中Wij是第i行,第j列的元素。

1. 计算每列因变量的系数

所有可能的系数组合共有3m种,记为s

s=3m

Yj表示Y的第j列元素,用Xh表示X的第h列元素。

(1) 若没有自变量取到边界,则所有自变量的系数都是偏导数为0时的系数;

Wj(r)=linefit(X,Yj)r[1,s]

其中linefit()函数是最小二乘法拟合得到的系数,Wj (r)Yj对应的第r个系数矩阵。

(2) 若某些自变量的系数取到边界,其他列的系数需要偏导数为0求得;

假设Xa,Xb,…,Xk这些自变量的系数取到了边界,则这些自变量的系数已经知道,为Waj,Wbj,…,Wkj

未取到边界的自变量记为X’,对应的因变量Yj’

Yj=Yj-(Xa*Waj+ Xb* Wbj+…+Xk* Wkj)

系数矩阵记为Wj

Wj=linefit(X’, Yj)

Waj,Wbj,…,Wkj按序合并后即得到相应的Wj(r)

(3) 若所有自变量的系数都取到边界,则这些边界就是一组系数。

经过(1)(2)(3)就得到了s=3m组系数,即Wj (1), Wj (2),…, Wj (s)

(4) 筛选所有系数都在边界内的系数Wj (r’)

Wj (r’)= Wj (r), wdjiWj (r)i≤wuji

其中Wj (r)iWj (r)的第i个的元素。

(5) 计算每组系数关于Yjrmse(r’)

Yj’=X* Wj (r’)r[1,s]

其中YjXWj (r’)的预测结果。

..

其中yijYj的第i个元素是,y’ijYj的第i个元素。

(6) 使rmse(r’)最小的Wj (r’)即为最佳系数矩阵Wj

所有的rmse(r’)组成的序列称为rmse序列,记为RMSE

Wj=Wj(r’),rmse(r’)=min(RMSE)

2. 合并所有因变量的最佳矩阵就得到最佳矩阵W

写出代码:


A B C D E
1 =X /参数:X 矩阵 (k*m)
2 =Y /参数:Y 矩阵 (k*n)
3 =BD /参数:边界矩阵 BD(n*m)
4 =func(A6,A1,A2,A3) /计算结果
5 /有边界的线性拟合,参数:X,Y, 边界
6 func
7
[0,1,2] 0:偏导数 =0,1: 下边界,2: 上边界
8
=(A6.~.len()-1).iterate(func(A52,B7,~~),B7) /边界的取值标记
9
=B6.~.len().((idx=~,B6.([~(idx)]))) /Y
10
=B9.(func(A14,A6,~,C6(#),B8)) /Yj对应 Wj
11
=B10.(~.conj()) /整理 W
12
=transpose(B11) /转置 W
13 /某个 Yj 拟合 W,参数:X,Yi,某个 Yj 对应的 Wj 边界,边界的取值标记
14 func
15
=D14.(func(A22,A14,B14,C14,~)) /3^m种取值标记
16
=B15.(func(A43,A14,B14,~)) /RMSE
17
=B15.pselect@a(func(A47,~,C14)) /边界内的 W
18
=B16(B17) /边界内的 RMSE
19
=B18.pmin() /最小的 RMSE 索引
20
=B15(B17(B19)) /RMSE最小的 W
21 /3^m种取值中的一种拟合结果,参数:X,Y, 边界,1 种取值类型
22 func
23
=D22.align@ap([true,false],~!=0)
24
=B23(1) /第几个自变量取边界
25
=D22(B24) /上界,下届,偏导 =0?
26
=B23(2) /第几个自变量不取边界
27
if B24.len()>0 =A22.(~(B24)) /取边界的 Xh
28

=C22(B24) /Xh对应的边界
29

=C28.([~(B25(#))]) /xh边界的值
30

=mul(C27,C29) /xh*边界
31

=B22.(~--C30(#)) /Y-Xh*边界
32

=A22.(~(B26)) /不取边界的 X'
33

if B26.len()==0 =D34=null /如果都是边界,取边界
34

else =w=linefit(C32,C31),if(ifnumber(w),[[w]],w) /拟合不取边界的 X' 和 Y-Xh* 边界
35

=C29|D34 /合并边界与拟合的 W
36

=B23.conj() /Xh的索引
37

=C36.psort() /Xh的原序
38

=C35(C37) /对应 Xh 的 Wj
39

return C38
40
else =w=linefit(A22,B22),if(ifnumber(w),[[w]],w) /如果都不取边界,直接拟合
41

return C40
42 /计算某个 wj(r) 的 rmse(r), 参数:X,Yj,Wj(r)
43 func
44
=mul(A43,C43) /X*W(r)
45
=sqrt(mse(B43,B44)) /rmse(r)
46 /筛选条件,参数:Wj(r),边界
47 func
48
=A47.conj() /合并系数
49
=B48.(~>=B47(#)(1)&&~<=B47(#)(2)) /筛选
50
=B49==B49.(true)
51 /3^m种取值标记,参数:标记序列
52 func
53
=A52.conj((idx=#,B52.(A52(idx)|~))) /3^m种取值标记

输入参数说明:

1. A1中的X是输入自变量矩阵,形状是k*m

2. A2中的Y是输入自变量矩阵,形状是k*n

3. A3中的BD是输入边界矩阵矩阵,形状是n*m(这里要注意,每一行是1Y的所有X的边界)。

应用举例:

自变量矩阵X

..

因变量矩阵Y

..

边界矩阵BD

..

1. 先来看下直接用最小二乘法的拟合结果

系数矩阵W

..

系数矩阵Wrmse

rmse1= 0.684

rmse2= 0.684

注意:约束条件是所有收率都不小于0且不大于1,这种方式肯定是无法满足需求的。

2. 再来看有边界的线性拟合算法拟合结果

最佳系数矩阵W

..

最佳系数矩阵Wrmse

rmse1= 0.697

rmse2= 0.697

rmse1是第1Yrmsermse2是第2Yrmse

说明:虽然简单最小二乘法的拟合结果更好,但因为有边界约束条件的限制,还是要选择有边界的线性拟合算法。