想要使用三维张量的Tucker和正则多元分解(cdp或PARAFAC/CANDECOMP(进行潜在分析。
我使用python,函数来自tensorly库的tensorly.decomposition.parapac。
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分解。张量怎么办?
您在示例中使用的分解(parapac,也称为规范聚合-CP-分解(没有核心。它将原始张量表示为秩为1的张量的加权和,即向量的外积的加权和。针对每个模式(维度(将这些向量收集到因子矩阵中。和的权重是一个向量。与Tucker不同,CP分解没有核,在温和的条件下是唯一的(你可以将CP视为Tucker的特例,权重向量是对角核的值(。
然而,直接比较因子有几个问题:首先,即使分解是唯一的,它在因子的排列下也是不变的,所以你不能直接比较因子。此外,求张量的实际秩在一般情况下是NP困难的。通常用CP分解计算的是低秩近似(即最佳秩R近似(,通常也是NP难的,并且ALS只是一种(好的(启发式。如果你想比较几个因子化张量,比较重建比直接比较因子更容易。
对于潜在因素分析,我建议你看看这篇论文,它展示了如何通过因子分解低阶可观测矩来学习潜在变量模型。