栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

2.2 CP分解ALS算法python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2.2 CP分解ALS算法python

这篇博客有详细推导
CP分解将张量化为一系列秩一张量的外积和

参考《Tensor Decomposition for Signal Processing and Machine Learning》,对于X的某个前切面,有:

这样,我们利用Khatri-Rao积

可以求出每个前切面的形式,有:

这边先补一下伪逆矩阵知识

伪逆矩阵性质

接着,我们利用目标函数的闭合解

但是直接算逆复杂度太大了,因为计算复杂度是n三方,直接用上式闭合解,n太大了。利用伪逆矩阵性质和Khatri-Rao积的性质,计算可得:

所以交替最小平方法alternating least squares (ALS)算法如下:

因此整体的python实现如下:

import numpy as np
import tensorly as tl
import tqdm
tl.set_backend('numpy')

a = np.array([[1,3,5,7,8],[8,4,6,2,10]])
b = np.array([[5,13,55,17,18],[58,14,46,12,1]])
c = np.array([[14,1,5,17,18],[58,14,46,12,1]])

X = np.einsum('i,j,k->ijk',a[0],b[0],c[0])
X += np.einsum('i,j,k->ijk',a[1],b[1],c[1])

def CP_ALS(X, r=1, max_iter=100, err=1e-10):
    N = tl.ndim(X)
    # random initialize
    A = []
    for n in range(N):
        A.append(tl.tensor(np.random.random((X.shape[n], r))))
    lbd = tl.ones(r)

    for epoch in range(max_iter):
        for n in range(N):
            V = np.ones((r,r))
            for i in range(N):
                if i != n:
                    V = A[i].T@A[i] * V

            A[n] = tl.unfold(X,mode=n)@tl.tenalg.khatri_rao(A, skip_matrix=n)@np.linalg.pinv(V)

        X_pred = tl.fold(A[0]@tl.tenalg.khatri_rao(A,skip_matrix = 0).T,mode=0,shape=X.shape)
        error = tl.norm(X-X_pred)
        print("epoch:",epoch,",error:",error)
        if error 

但是该算法的问题是,分解所得的因子矩阵和我们用来生成张量的因子矩阵不一样,并且ALS先算第0个因子矩阵,会导致第0个因子矩阵过大。



但是ALS算法主要有以下问题:
initialization of the factormatrices, collinearity in the factor matrices and degeneracy problems,会导致误差在一段时间内下降很慢,陷入沼泽swamp。

1.initialization of the factormatrices初始化问题,随机初始化有时候不太好,一般使用SVD初始化,在Tensor Decompositions and Applications中有写
实现方法是:

from tensorly.decomposition._cp import initialize_cp
A = initialize_cp(X, r,init='svd',svd='numpy_svd').factors

2.collinearity in the factor matrices,矩阵的共线性问题,即有些因此矩阵之间可能存在接近线性的关系。会给CP分解带来挑战。就是分解的时候会少识别出某些因子。

3.degeneracy problems退化问题
导数为0的点是critical point

在更新下面这个式子的时候,有时候只有一个critical point,它也会陷入到无中生有的critical point中

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/966146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号