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

2.2 CP分解ALS算法python_初始化


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

2.2 CP分解ALS算法python_初始化_02


这样,我们利用Khatri-Rao积

2.2 CP分解ALS算法python_初始化_03


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

2.2 CP分解ALS算法python_python_04


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

2.2 CP分解ALS算法python_张量_05


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

2.2 CP分解ALS算法python_python_06


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

2.2 CP分解ALS算法python_矩阵_07


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

2.2 CP分解ALS算法python_python_08


因此整体的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<err:
            break
    return A
A = CP_ALS(X,r=2,max_iter=1000)
print("hi")

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

2.2 CP分解ALS算法python_算法_09


2.2 CP分解ALS算法python_矩阵_10


2.2 CP分解ALS算法python_张量_11


但是ALS算法主要有以下问题:

initialization of the factormatrices, collinearity in the factor matrices and degeneracy problems,会导致误差在一段时间内下降很慢,陷入沼泽swamp。1.initialization of the factormatrices初始化问题,随机初始化有时候不太好,一般使用SVD初始化,在Tensor Decompositions and Applications中有写

2.2 CP分解ALS算法python_python_12


实现方法是:

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

2.2 CP分解ALS算法python_张量_13


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

2.2 CP分解ALS算法python_初始化_14


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python