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

但是该算法的问题是,分解所得的因子矩阵和我们用来生成张量的因子矩阵不一样,并且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中
在这里插入图片描述

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值