有边界的线性拟合算法
有边界的线性拟合算法
已知自变量矩阵X和因变量矩阵Y,两者存在线性关系,但系数被限制在一个范围内,这个范围称为边界,试求出该边界范围内的最佳系数矩阵。
其中X是k*m矩阵,k是样本数,m是自变量数,xij是第i个样本的第j个自变量。
其中Y是k*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种取值,分别是上界,下界,偏导数为0,m个自变量就会有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), wdji≤Wj (r)i≤wuji
其中Wj (r)i是Wj (r)的第i个的元素。
(5) 计算每组系数关于Yj的rmse(r’)。
Yj’=X* Wj (r’),r∈[1,s]
其中Yj’是X与Wj (r’)的预测结果。
其中yij是Yj的第i个元素是,y’ij是Yj’的第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(这里要注意,每一行是1个Y的所有X的边界)。
应用举例:
自变量矩阵X:
因变量矩阵Y:
边界矩阵BD:
1. 先来看下直接用最小二乘法的拟合结果
系数矩阵W:
系数矩阵W的rmse:
rmse1= 0.684
rmse2= 0.684
注意:约束条件是所有收率都不小于0且不大于1,这种方式肯定是无法满足需求的。
2. 再来看有边界的线性拟合算法拟合结果
最佳系数矩阵W:
最佳系数矩阵W的rmse:
rmse1= 0.697
rmse2= 0.697
rmse1是第1列Y的rmse,rmse2是第2列Y的rmse。
说明:虽然简单最小二乘法的拟合结果更好,但因为有边界约束条件的限制,还是要选择有边界的线性拟合算法。