首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于lanet分析的非唯一张量分解

用于lanet分析的非唯一张量分解
EN

Stack Overflow用户
提问于 2020-07-30 18:43:52
回答 1查看 128关注 0票数 0

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

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

代码语言:javascript
复制
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))

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

使用以下代码来理解这一点:

代码语言:javascript
复制
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分解。张量的作用是什么?

EN

回答 1

Stack Overflow用户

发布于 2020-08-02 05:01:52

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

然而,直接比较因子有几个问题:首先,即使分解是唯一的,它在因子的排列下也是不变的,所以您不能直接比较因子。此外,寻找张量的实际秩通常是NP困难的。使用CP分解通常计算的是低秩近似(即最佳秩-R近似),这通常也是NP-hard的,并且ALS只是一个(好的)启发式方法。如果你想比较几个因式分解的张量,比较重构比直接比较因子更容易。

对于潜在因子分析,我建议你看看this paper,它展示了如何通过分解低阶可观察时刻来学习潜在变量模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63171476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档