MATLAB的N-way工具箱提供了一组函数和算法,利用一些多线性模型来对多维数据集进行建模。
开发环境:MATLAB 5.x
支持的约束:非负、单峰
工具箱下载:https://ucphchemometrics.com/wp-content/uploads/2023/09/Nway-Version-3.5.zip
在线教程:https://ucphchemometrics.com/n-way-course/
本文余下部分为教程笔记。教程数据集下载:https://ucphchemometrics.com/wp-content/uploads/2023/03/NWAYCOurse.zip
数据:claus.mat
。它包含了5个样本的荧光EEM数据。样本包含的化合物:色氨酸、苯丙氨酸、酪氨酸。
打开Matlab R2021a,使用导入数据功能,选择claus.mat
。导入结果如下。
名称 | 值 |
---|---|
DimX | [5,201,61] |
X | 5x12231 double |
数据重整:X = reshape(X, DimX)
绘制所有样本的发射光谱(Emission spectra):plot(X(:,:,c)')
,其中c为激发波长。
绘制所有样本的激发光谱(Emission spectra):plot(squeeze(X(:,1,:))')
,其中c为发射波长。(size(X(:,1,:))=[a,1,b]
,需要使用squeeze函数将其尺寸压缩为[a,b])
绘制第i个样本的立体三维图:mesh(reshape(X(i,:),DimX(2),DimX(3)))
。(reshape结果可加撇)
CANDECOMP-PARAFAC模型于1970年提出,在化学计量学中通常被称为PARAFAC。其固有的独特性使其成为化学计量学中解析纯底层光谱组分的常用模型。
拟合PARAFAC模型:[Factors] = parafac(X,3);
可视化Factors: plotfac(Factors)
将Factors分配到分数与负载(就是三元组的值依次赋值给三个变量):[A,B,C] = fac2let(Factors)
A的值为样本维负载,B的值为em维负载,C的值为ex维负载。可视化:plot(B);plot(C);
。分数与浓度成正比,如果需要确定具体的浓度值,则需要已知浓度的样本作为参考,然后按比例计算出其他样本的浓度。这个过程称为二阶校准(https://ucphchemometrics.com/help-on-parafac-concentrations/)。
确定组分数:使用分半分析、核一致性等。如果模型有效,则核一致性接近100%。如果核一致性接近50%,则模型不稳定,施加适当的约束可能会提高稳定性。在实践中,核一致性随着组分数增加而缓慢下降,在组分数超过正确值时急剧下降。
算法的收敛性:PARAFAC模型的拟合算法是交替最小二乘法。该算法是迭代的,当两个连续迭代之间的相对拟合差低于某个阈值时停止。阈值的默认值为10^-6。对于某些数据,模型很难拟合,因此可能需要设置较大的阈值。
重叠的荧光数据可以分解为分数和负载向量,这些向量代表激发光谱、发射光谱、化学分析物浓度的估计值。
施加约束的帮助在PARAFAC.m
文件中。
parafac函数的文档节选如下。
parafac(X,Fac,Options,const);
Options:可选参数。如果取0,则使用默认值。
const:一个向量,指定各维度上的限制。
0 => 无限制,
1 => 正交
2 => 非负
3 => 单峰(且非负)
对于三维问题,[0 0 0]代表无限制的取值
可以利用已建立的模型确定新样本的分数。
居中的目的:删除数据中的常量项