论文笔记与复现[156]PARAFAC. tutorial and applications

原文下载:https://www.sciencedirect.com/science/article/abs/pii/S0169743997000324

摘要

本文介绍了PARAFAC的多维分解方法及其在化学计量学中的应用。PARAFAC是PCA向高阶数组的推广,但该方法的一些特性与普通的二维情况截然不同。例如,可以从多维光谱数据(multi-way spectral data)中恢复出纯光谱(pure spectra)。

1 介绍

以交叉方式测量变量,结果的集合为多维数据。

PARAFAC以及二路PCA等方法都是多线性或双线性分解方法,它们将数组分解成分数和负载[16](loadings)的集合,希望以比原始数据数组更精简的形式描述数据。

主成分分析模型可以被认为是最复杂和最灵活的模型,而PARAFAC是最简单和最受限制的模型。

结构越多,拟合越差,模型越简单。使用多维方法不是为了获得更好的拟合,而是为了获得更充分、更稳健和可解释的模型。

对于组分数为F的I×J×K数组,平行因子模型含有F(I+J+K)个参数。

PARAFAC的一个非常令人讨厌的特性是计算模型所需的时间很长。所使用的算法通常基于交替最小二乘法(ALS),ALS的初始化使用随机值或基于广义特征值问题的直接三线性(trilinear)分解。

在下文中,为了简单起见,讨论将仅限于三维(three-way)数据,但大多数结果对任何(更高)阶的数据和模型都有效。

2 术语

标量:小写斜体

矢量:粗体小写

二维矩阵:粗体大写

三维数组:带下划线的粗体大写字母

xijk:X的第ijk个元素

模式(mode)、way和顺序(order)这三个术语或多或少可以互换使用。

术语因子(factor)和组分(component)之间没有区别。

3 模型

数据被分解为三线性分量(三元组,triads),每个分量由一个分数向量和两个负载向量组成。在三维中,通常不区分分数和负载(因为分数和负载在数学上是同等对待的)。

三维数组的平行因子模型由三个负载矩阵A、B、C组成(其中的元素分别表示为aif、bjf、ckf),建立三线性模型以最小化模型中的残差eijk。三维数组的元素可由负载矩阵的元素与残差计算得到,公式如下:

x i j k = ∑ f = 1 F a i f b j f c k f    + e i j k ( 1 ) x_{ijk}=\sum_{f=1}^{F}a_{if}b_{jf}c_{kf}\;+e_{ijk} (1) xijk=f=1Faifbjfckf+eijk(1)

图1为公式(1)在二组分情况下的计算示意图。
在这里插入图片描述
该模型也可记为: X ‾ = ∑ f = 1 F a f ⨂ b f ⨂ c f \underline{X}=\sum_{f=1}^{F}a_f\bigotimes b_f\bigotimes c_f X=f=1Fafbfcf

其中af、bf、cf分别为矩阵A、B、C的第f列。

3.1 唯一性

PARAFAC模型的一个明显优点是解的唯一性。如果数据确实是三线性的,使用了正确数量的分量并且信噪比合适,就能得到真正的潜在光谱。

3.2 多维数组的秩(rank)

秩为1的矩阵可以写成2个向量(分数和负载向量)的外积。这样的组成部分被称为二元组。

三元组是二元组的三线性等价物,即三线性(PARAFAC)分量,是3个向量的积。

4 实现

4.1 交替最小二乘法(Alternating least squares)

PARAFAC模型的解可以通过该方法找到,方法是依次假设两种已知模式下的载荷,然后估计最后一种模式的未知参数集。这也是最初提出的对模型进行估计的方式。

PARAFAC ALS算法的流程:
(0)确定组分数F
(1)初始化B和C
(2)通过最小二乘回归,从X, B, C中估计A
(3)用同样的方法估计B
(4)用同样的方法估计C
(5)从步骤(2)开始往下执行,直到收敛。

ALS算法将在每次迭代中改善模型的拟合。如果算法收敛到全局最小值,则找到模型的最小二乘解。

ALS的优点:确保每次迭代都能优化解;ALS的主要缺点:模型估计时间长,当变量数量很多时,有时需要数百到数千次迭代才能收敛。

6 评估解

6.2 杠杆和残差

杠杆和残差可用于影响和残差分析。

6.3 组分数

提取太多的分量不仅意味着噪声被越来越多地建模,而且真实因素被更多(相关)的分量建模。

确定组分数的主要方法有三种:(1)分半实验,(2)判断残差,(3)与建模数据的外部知识进行比较。

[19]主张使用分半实验。其想法是将数据分为两半,然后在这两半上创建PARAFAC模型。通常情况下,应该以具有足够数量的自变量/样本(independent variables/samples)的模式来分割数据。

9 应用II:稀疏荧光数据的唯一分解

9.1 数据

这个问题是PARAFAC使用非负约束获得唯一分解的一个示例。

样品:含有不同量的酪氨酸、色氨酸和苯丙氨酸的2个样品。

因此,要分解的数组是2×51×201。

在多线性分解中应该避免瑞利散射,有三种方法可以做到这一点:(iii)测量空白,并从样品测量值中减去该测量值。在这个实验中,最初没有采取任何措施来消除瑞利散射。

9.2 结果与讨论

在这里插入图片描述
(1)估计的激发光谱如图10(上图)所示。
①三组分PARAFAC溶液的发射负载如图10a所示。从中可以看出,与色氨酸相对应的光谱具有大的负区域。得出的结论是,由于变化性小(两个样品),分解很困难。由于我们知道荧光光谱和浓度应该是正的,所以很自然地将PARAFAC 负载限制在正值
②在图10b中,使用非负性约束显示了估计的发射负荷。估计的光谱与分析物的纯光谱非常相似,但对于色氨酸,由于非多重线性瑞利散射,在300mn以下有一个小峰。
③为了避免这种情况,试图将受瑞利散射影响的所有变量设置为缺失值,然后估计相应的PARAFAC模型,结果如图10c所示。
④显然,仅凭这一点不足以确保色氨酸光谱具有良好的曲线分辨率。将缺失元素方法与非负约束相结合,有助于模型关注图中数据的正确方面。在图10d中,估计的发射负载(实线)与纯光谱(虚线,注意区分)一起显示。
(2)估计的激发光谱如图11(下图)所示。

在这里插入图片描述
下面使用N-way工具箱的示例数据claus.mat尝试复现图10。

打开Matlab,将数据导入工作区,将EEM数据X重整为5×201×61规格。

绘制5张光谱的填充等高线图:

for i = 1:DimX(1)
    subplot(2,3,i),contourf(squeeze(X(i,:,:)))
end

请添加图片描述
可见,前3张光谱为纯光谱,后2张光谱为混合光谱。
从X中提取第4-5张光谱:P = X(4:5,:,:)
将工作区保存为claus2.mat

[Factors1] = parafac(P,3);
plotfac(Factors1)

下图还原了图10(a):
请添加图片描述
增加非负约束:

[Factors2] = parafac(P,3,0,[2,2,2]);
plotfac(Factors2)

下图还原了图10(b):
请添加图片描述
接下来使用drEEM工具箱尝试复现图10d。

ds=assembledataset(X,ExAx,EmAx,'AU')
eemreview(ds)
ds2=smootheem(ds,[18 24],[],[],[],[0 0 0 0],[],3382,0)
eemreview(ds2)
spectralvariance(ds2)
ds3=subdataset(ds2,1:3,[],[])
[Factors] = parafac(ds3.X,3,0,[2 2 2]);
plotfac(Factors)

结果如下图所示。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一篇论文,其中使用了PARAFAC-based方法进行智能反射面辅助的MIMO信道估计。以下是代码复现的基本步骤: 1. 生成仿真数据集:通过MATLAB中的函数生成MIMO信道仿真数据集,包括发送端、接收端、智能反射面的位置坐标、反射系数等信息。可以参考MATLAB中的`comm.MIMOChannel`和`phased.ConformalArray`等函数。 2. 实现PARAFAC-based信道估计算法:根据论文中的算法原理,实现PARAFAC-based信道估计算法,包括数据预处理、TF分解、信道估计等步骤。可以使用MATLAB中的`parafac`函数进行TF分解,使用最小二乘法或迭代算法进行信道估计。 3. 评估算法性能:使用生成的仿真数据集,评估PARAFAC-based信道估计算法的性能指标,包括均方误差(MSE)、误差率等。可以使用MATLAB中的`sim`函数进行性能评估。 以下是参考代码实现: ```matlab % 生成仿真数据集 Nt = 4; Nr = 4; % 发送端和接收端天线数 Np = 16; % 智能反射面元素数 d = 0.5; % 智能反射面元素间距 fc = 28e9; % 载波频率 lambda = physconst('LightSpeed')/fc; % 波长 txPos = [0 0 0]; % 发送端位置 rxPos = [1 1 0]; % 接收端位置 irsPos = [0.5 0.5 1]; % 智能反射面位置 txArray = phased.URA(Nt,[0.5 0.5], 'ElementSpacing', lambda/2); % 发送端天线阵列 rxArray = phased.URA(Nr,[0.5 0.5], 'ElementSpacing', lambda/2); % 接收端天线阵列 irsArray = phased.ConformalArray('ElementPosition', [0 0 0; repmat([d 0 0], Np-1, 1)], ... 'ElementNormal', [0 0 1; repmat([0 0 1], Np-1, 1)], 'Element', phased.IsotropicAntennaElement('FrequencyRange', [20e9 40e9])); % 智能反射面天线阵列 channel = comm.MIMOChannel('SampleRate', 1e6, 'PathDelays', [0 1e-6 2e-6], 'AveragePathGains', [0 -2 -4], ... 'TransmitAntennaArray', txArray, 'ReceiveAntennaArray', rxArray, 'PathGainsOutputPort', true); % MIMO信道模型 [txSig, txInfo] = helperGenData(); % 生成发送信号 rxSig = channel(txSig); % 接收信号 irsCoef = ones(Np, 1); % 智能反射面反射系数 % PARAFAC-based信道估计算法 X = reshape(rxSig, Nr, Nt, []); % 数据预处理 [U, ~, ~] = parafac(X, 1); % TF分解 H = U{3}; % 信道估计 % 评估算法性能 MSE = mean(abs(H-channel.PathGains).^2); BER = helperComputeBER(H, channel.PathGains); ``` 其中,`helperGenData`和`helperComputeBER`分别为生成发送信号和计算误码率的辅助函数,需要根据具体需求自行实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值