希望使用3维张量的Tucker和规范多态分解(cdp或PARAFAC / CANDECOMP)进行潜伏分析。
我使用python,来自tensorly库的tensorly.decomposition.parafac函数。
Home
因子矩阵和核不是唯一的(可以在非奇异矩阵上相乘),因此因子矩阵在调用函数后会发生变化。
使用以下代码了解这一点:
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))
我如何描述或分析张量的每个分量,它们有什么意义吗? 对于矩阵,我了解SVD分解。张量做什么?
答案 0 :(得分:0)
您在示例中使用的分解(parafac,也称为Canonical-Polyadic -CP-分解)没有核心。它将原始张量表示为等级1张量的加权和,即向量外积的加权和。对于每种模式(维度),将这些向量收集到因子矩阵中。和的权重是一个向量。 CP分解与Tucker不同,它没有核心,并且在温和条件下是唯一的(您可以将CP视为Tucker的特例,权重向量是对角核心的值)。
但是,直接比较因子有几个问题:第一,即使分解是唯一的,在因子置换下它也是不变的,因此您不能直接比较因子。另外,找到张量的实际秩通常是NP难的。通常用CP分解计算的是低秩逼近(即最佳秩R逼近),通常它也是NP-hard的,而ALS只是(良好)启发式的。如果要比较几个分解张量,则比较重构比直接比较因子更容易。
对于潜在因子分析,我建议您看一下this paper,它显示了如何通过分解低阶可观察矩来学习潜在变量模型。