要使用三维张量的Tucker和规范多元分解(cdp或PARAFAC/CANDECOMP)进行潜在分析。
我使用python,函数来自于库的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))我该如何描述或分析tensor.Has的每个组件有什么意义呢?对于矩阵,我理解SVD分解。张量的作用是什么?
发布于 2020-08-02 05:01:52
您在示例中使用的分解(parafac,也称为规范-多维-CP-分解)没有核心。它将原始张量表示为秩1张量的加权和,即向量的外积的加权和。这些向量被收集到每个模式(维度)的因子矩阵中。总和的权重是一个向量。与Tucker不同,CP分解没有核心,并且在温和的条件下是唯一的(您可以将CP视为Tucker的特例,权重向量是对角线核心的值)。
然而,直接比较因子有几个问题:首先,即使分解是唯一的,它在因子的排列下也是不变的,所以您不能直接比较因子。此外,寻找张量的实际秩通常是NP困难的。使用CP分解通常计算的是低秩近似(即最佳秩-R近似),这通常也是NP-hard的,并且ALS只是一个(好的)启发式方法。如果你想比较几个因式分解的张量,比较重构比直接比较因子更容易。
对于潜在因子分析,我建议你看看this paper,它展示了如何通过分解低阶可观察时刻来学习潜在变量模型。
https://stackoverflow.com/questions/63171476
复制相似问题