偏最小二乘法算法.docx
《偏最小二乘法算法.docx》由会员分享,可在线阅读,更多相关《偏最小二乘法算法.docx(11页珍藏版)》请在冰点文库上搜索。
偏最小二乘法算法
偏最小二乘法
1.1基本原理
偏最小二乘法(PLS)是基于因子分析的多变量校正方法,其数学基础为主成分分析。
但它相对于主成分回归(PCR)更进了一步,两者的区别在于PLS法将浓度矩阵Y和相应的量测响应矩阵X同时进行主成分分解:
X=TP+E
Y=UQ+F
式中T和U分别为X和Y的得分矩阵,而P和Q分别为X和Y的载荷矩阵,E和F分别为运用偏最小二乘法去拟合矩阵X和Y时所引进的误差。
偏最小二乘法和主成分回归很相似,其差别在于用于描述变量Y中因子的同时也用于描述变量X。
为了实现这一点,数学中是以矩阵Y的列去计算矩阵X的因子。
同时,矩阵Y的因子则由矩阵X的列去预测。
分解得到的T和U矩阵分别是除去了人部分测量误差的响应和浓度的信息。
偏最小二乘法就是利用各列向量相互正交的特征响应矩阵T和特征浓度矩阵U进行回归:
U=TB
得到回归系数矩阵,又称关联矩阵E:
B=(TT)FU
因此,偏最小二乘法的校正步骤包括对矩阵Y和矩阵X的主成分分解以及对关联矩阵B的计算。
1.2主成分分析
主成分分析的中心目的是将数据降维,以排除众多化学信息共存中相互重叠的信息。
他是将原变量进行转换,即把原变量的线性组合成几个新变量。
同时这些新变量要尽可能多的表征原变量的数据结构特征而不丢失信息。
新变量是一组正交的,即互不相关的变量。
这种新变量又称为主成分。
如何寻找主成分,在数学上讲,求数据矩阵的主成分就是求解该矩阵的特征值和特征矢量问题。
卞面以多组分混合物的量测光谱来加以说明。
假设有n个样本包含p个组分,在m个波长下测定其光谱数据,根据比尔定律和加和定理有:
如果混合物只有一种组分,则该光谱矢量与纯光谱矢量应该是方向一致,而人小不同。
换句话说,光谱A表示在由p个波长构成的p维变量空间的一组点(n个),而这一组点一定在一条通过坐标原点的直线上。
这条直线其实就是纯光谱b。
因此由m个波长描述的原始数据可以用一条直线,即一个新坐标或新变量来表示。
如果一个混合物由2个组分组成,各组分的纯光谱用bl,b2表示,则有:
<=c“b:
+ci2bl
有上式看出,不管混合物如何变化,其光谱总可以用两个新坐标轴bl,b2来表示。
因此可以推出,如果混合物由p个组分组成,那么混合物的光谱就可由p个主成分轴的线性组合表示。
因而现在的问题就变成了如何求解这些主成分轴。
而寻找这些坐标轴的基本原则是使新坐标轴包含原数据的最大方差。
即沿着新坐标轴的方向,使方差达到最人。
而其他方向,使方差达到最小。
从几何角度看,就是变量空间中所有的点到这个新坐标轴的距离最短。
以二维空间的为例说明如何寻找主成分坐标轴。
变量空间的每一个数据点(一个样本)都可以用通过该点与坐标原点的一个矢量X’表征。
上图中直角三角形的三个边长分别以a,b,c表示,那么这11个点到第一个主成分轴刃距离的平方和可以通过勾股定理与矢量点积得出:
£氏=一玄)/=!
/=!
因为=||兀||与xh\=||X,-1|-||||-cos6>,所以
1=1(=1
=Xh.ll2-E(^vi)2
1=11=1
=勿兀『一±(叮hj
1=11=1
=ziixiii2-vrx7xvi—nun
1=1
上式等价于
v^XTXvl―►max(最大特征值入)
上式中5表示第一个主成分轴矢量,即第一个特征矢量,所对应的最大值称为特征值,用心表示。
从上面推导看出,寻找主成分轴就是求X矩阵的协方差矩阵X?
X中的最大特征
值(Xi)和特征向量(Vi)o
下面考虑变量数为m的一般情况。
在m为空间中新变量可以表示为:
厂叫】=%】・%+片討总+•・•+叫〃d初
叫厂冬莎】+冬站2+•・•+%心
I%=%兀】+%兀+…+%為
其中系数矩阵V为
V11
用U和X分别表示新变量和原始矢量,则
■■
If=
■
■
•
x=
人2
■
■
•
%、
u=Vx
上述m维主成分系数必须满足下面两个条件
(1)正交条件:
任意两个主成分协、心,其系数的乘积之和为0。
(2)归一化条件:
对于任一主成分系数的平方和等于1。
喑+唁+•••+唁=1
满足这两个条件的矩阵,称之为正交矩阵。
正交矩阵具有如卞性质:
V7V=/,V_I=Vr
13矩阵的主成分分解
根据特征向量和特征值的定义
叭—"•=&」=1,2,…,加(*)
同时令x的协方差矩阵为
Z=XTX
(*)式两边同时左乘Vi,有
主成分系数矩阵V也可写为
因此可得
ZV=V-diag{Ai}
其中diag{^}表示一个对角矩阵,即对角线元素为非对角线元素为0的矩阵。
上式两边同时左乘VL得
vrzv=她⑷
VTZV=VrXrXV=(XV)TXV=畑⑷
令T=XV,则上式变为TtT=畑{人}将式T=XV右乘厂1得
X=TVt
上式是矩阵X的主成分分解的一种表达式,由上式得求解T和V的方法
VT=(TtT)~1TtX
T=XV(VtV)~[
依据矩阵乘法规则即可获得矩阵V和T中每一个矢量的计算公式:
vr.=tT.X/tTt,tj=Xvj/v,jtj
根据上面两个公式可以设计主成分分解的迭代法算法如卞:
(1)取X中任意一列作为起始的to
(2)由此t计算:
vT=tTX/tTt
⑶将Q归一化:
v;H.=v^/||v^||
(4)计算新的t:
t=Xv/vTv
(5)比较步骤4所得的t和上一步的t。
若二者相等(在给定的误差范围内),则按(S)
计算特征值,转第六步继续进行;否则返回第二步继续迭代。
(6)从Y中减去/•『的贡献:
X=X-t-vTo返回1,继续运行,直到最后Y趋近于零。
从理论上讲,在m空间中,可以获得m个主成分。
但是在实际应用中一般只取前几个对方差贡献最大的主成分,这样就使高维空间的数据降到低维,如二维或三维空间,非常有益于数据的观察,同时损失的信息量还不会太大。
取前p个主成分的依据为
Pin
比率(%尸工"工&
(=11=1
•般推荐,比率(%)$80%
1.4偏最小二乘法算法
(1)矩阵X和Y的标准化处理
(2)取Y中任意一列赋给作为起始的u
对于X矩阵
(3)w,=urX/uIu
(4)归一化:
W:
=w:
/||w;||
(5)计算新的t:
t=Xw/wrw
对于Y矩阵
(6)qT=trY/tTt
(7)归—化:
g二.=q;d/1|q;II
(8)u=Yq/qTq
收敛判据:
(9)将步骤8所得的u与前一次迭代的结果相比较,若等于(在允许误差范围内),到步骤
10,否则返回3。
(10)pT=tTX/tTt
(11)归一化:
P二=Pold/||PoldII
(12)tnew=told"IPold^I
(13)w二.=町/|必11
计算回归系数b以用于内部关联:
(14)b=uTt/tTt对于主成分h计算残差:
(15)EiUhP;
(16)Fh=Ei-bhZ'd
之后回到步骤
(2),去进行下一主成分的运算,直到残差趋近于零。
未知样品预测
(17)如校正部分,将X矩阵标准化
(18)肛0,y=0
Q9)h=h+L,q=XW^,y=y+bhgwq;,x=x-gp;
(20)若h>a(主成分数),到步骤(21)o否则返回步骤(19)
(21)得到的Y已经标准化,因此需要按标准化步骤的相反操作,将之复原到原坐标注意的是对预测集进行标准化处理的时,使用的是训练集的均值和标准偏差。
因此,在进行反标准化操作时,使用的也应该是训练集的均值和标准偏差。
1.5程序框图与程序代码程序框图:
用C语言编制的PLS程序源代码:
C语言的源程序的各函数和功能如下:
data_mput();
/*数据的输入*/
data.standardizationQ;pctestQprincipalcomponentQ;factornumQ;
nornialeqO;
/*数据的标准化*/
/*在主成分分解时判断t的收敛*/
/*主成分分解*/
/*确定必要的主成分分数*/
/*正规方程的建立*/
test(mtk)
/*迭代求解系数矩阵的收敛检验*/
lterationQ;
/*迭代法求解*/
predictQ;
/*未知样品预测*/
biasQ;
/*计算预测标准偏差*/
repoilQ;
/*输出结呆*/
inam(argc?
aigv)
/*主函数*/
PLS程序源代码
#iiiclude
#mclude
#iiiclude
#mclude
^defineN25
^defineMil
#defineL4
^defineTN8
^defineH5
FILE*mfp,*outfp;
doubletiain_x[N][M],tiam_v[N][L];
doubletest_x[TN][M],test_y[TN][L];
doubleavg_x[M],std_x[M]:
doubleavg_y[L],std_y[L];
doubleerror_value[TN][L]
doubleu[N].new_u[N];
double
save_p[H][N],save_q[H][L],save_w[H][M],save_d[H]:
doublepredictvalue[TN][L],bias[L];
voiddata_mput()/*数据的输入*7
{intij;
血(j=0;jvMj++)
fbr(i=O;ifscanf(infA&tiaiii_x[i][j]);
fbr(i=O;ifoi(j=O;jnew_u[i]+=tmin_y[i][j]*q[j];new_u[i]/=sq;
}inask=pctest();
}while(mask);foi(j=O;j{
p[j]=O.O;
fbr(i=O;iP[j]+=t[i]*gin_x[i]Ij]:
p[j]/=st;
}
fdi(sp=Oj=Ojsave_p[ili]Ij]=p[j];
}fbr(i=O;isave_w[ih][i]=w[i];
fbr(i=O;ifscaiif(mfp,&test_x[i][j]);
fbr(i=O;ifclose(mfp);
}
voiddata_standardization()/*数据的标准化*/
mtij;
{avjx[j]=std_x[j]=O・O;for(i=O;ifor(i=O;istd_x[j]+=pow((Mam_x[i][JHvjx[j])2);std_x[j]=sqrt(std_x[j])/(N」);
}
for(i=O;itram_x[i][j]=(tram_x[i][j]-avg_xlj])/std-x[j];
for(i=O;itram_x[i][j]=(tram_x[i][j]-avg_xlj])/std-x[j];for(j=O;j{avg-y[j]=std_y|j]=O・O;
fbr(i=O;iavjy[j]+=tniin_y[i][j];avjy[j]/=N;
fbr(i=O;istd_y[j]+=pow((tiam_y[i][jMvjy[j]),2);std_y[j]=sqrt(std_y[j])/(N・l);
}
fbr(i=O;ifor(j=O;jtrauvy[i][j]=(tiain_y[1](j]-avg_y[j])/std_y[j];}
pctestQ/*检验收敛*/
{intij;
doublecount=0.0;
fbi(i=0;i{count+=pow((new_u[i]-u[i]),2);
}
foi(st=0j=0;ist+=t[i]*t[i];
foi(b=0a=0:
ib+=new_u[i]*t[i];
b/=st;
save_d[ili]=b;
for(i=O;ifoi(j=0;jelse
return1;
}calibiation()/*模型的建立*/
{mtij.ilijnask;
doublesu,sw、st,sq.sp,b;
doublet[N].w[M].p[M].q[L];
111=0:
do{for(i=0;ido{for(su=04=0;i{w[j]=0.0;
fbi(i=0;iw(j]+=u[1]*gin_x[i][j];w[j]/=su;
}fbi(s\\T=OJ=Ojsw-r=w[j]*w[j];sw=sqrt(sw);
foi(j=O;jw[j]/=sw;
fbi(s\\T=OJ=Oj{t[i]=o.o;for(j=O;j}
fbi(st=04=0;ist+=t[i]*t[i];foi(j=O;j{q[j]=O.O;
fbr(i=0;i{intij;
fbr(i=0;i{bias[j]=O.O;
fdi(i=0;ibias[j]/=TN;
biaslj]=sqit(bias[j]);
}
}
repoitQ/*输出结果*/
{mti,j;
fprmtf(outfp,"预测的浓度值为:
\n”);
fbr(i=O;ifoi(j=O;jfpiiiitf(outfp,"%9・41f'',predict\ralue[i]|j]);
fpriiitf(outfp,);
fprmtf(outfp,"预测结果的误差为:
W);fbi(i=O;ifpriiitf(outfp,"%9・4f,enoi_value[i][j]);
}
fpriiitf(outfp,);
fpimtf(outfp,"相对于各组分的校正标准偏差为\n”);fdi(i=0;i§)rintf(outfp,"%10・41f”,bias[i]);
voidmain(aigc,aig\r)
mtargc;
char*argv[];
{if(argc!
=3)
{prmtf(tvforgotenterafilename.Xii^);exit(l);
if((uifp=fopen(argv[1],ur))=0
{priiitf^^can^topendatafile\nn);
q[i]=/st;
}
for(sq=0,j=0Jsq+=q[j]*q[j];
sq=sqrt(sq);
foi(j=O;jq[j]=/sq;
for(sq=0,j=0Jsq+=q[j]*qlj];
for(i=0;i{new_u[j]=0.0;
exit(l);}
if((outfp=fopen(argv[2],uw,T))==0)
{piintf("caiftopenoutputfile\nn);exit(l);
data_mputQ;
data_standaidization();calibrationQ;
predictQ;
statistics();
repoitQ;
}