lanet分析中的非唯一张量分解

2024-07-05 09:01:24 发布

您现在位置:Python中文网/ 问答频道 /正文

希望使用三维张量的Tucker和规范多元分解(cdp或PARAFAC/CANDECOMP)进行潜在分析

我使用python,函数来自tensorly库的tensorly.decomposition.parafac

from tensorly.decomposition import parafac
# Rank of the CP decomposition
cp_rank = 5
 Perform the CP decomposition
weights, factors = parafac(result, non_negative=True ,rank=cp_rank , normalize_factors=True, init='random', tol=10e-6)
# Reconstruct the tensor from the factors
cp_reconstruction = tl.kruskal_to_tensor((weights, factors))

因子矩阵和核心不是唯一的(可以在非奇异矩阵上相乘),因此因子矩阵在调用函数后会发生变化

使用此代码了解以下内容:

weights = 0
for i in range(100):
    error = weights
    weights, factors = parafac(result, non_negative=True ,rank=8, normalize_factors=True, init='random', tol=10e-6)
    
    error -= weights
    print(tl.norm(error))

我如何描述或分析张量的每一个分量,有什么意义吗? 对于矩阵,我理解SVD分解。张量是什么


Tags: thefromtrue矩阵errorresultcpfactors
1条回答
网友
1楼 · 发布于 2024-07-05 09:01:24

您在示例中使用的分解(parafac,也称为规范的多元-CP-分解)没有核心。它将原始张量表示为秩1张量的加权和,即向量外积的加权和。将每个模式(维度)的这些向量收集到因子矩阵中。和的权重是一个向量。与希尔斯不同,CP分解不具有核心,并且在温和条件下是唯一的(可以考虑CP作为希尔斯的特例,权重向量是对角核的值)。p>

然而,直接比较因子有几个问题:第一,即使分解是唯一的,它在因子排列下也是不变的,因此不能直接比较因子。此外,求张量的实际秩通常是NP困难的。通常使用CP分解计算的是低秩近似(即最佳秩-R近似),通常也是NP难的,ALS只是一个(好的)启发式。如果要比较多个因子张量,比较重构比直接比较因子更容易

对于潜在因素分析,我建议您看看this paper,它显示了如何通过分解低阶可观测矩来学习潜在变量模型

相关问题 更多 >