张量分解有很多种分解方法,但主要的分解方法有两种:Tucker分解和CP分解,其中CP分解是Tucker分解的一个特例。TensorLy也提供了这两种方法的实现。 Tucker分解的公式为 X = S * A * B * C,X是原张量,S为分解之后产生的核心张量,A、B、C分别为分解之后关于3个维度的矩阵。图示如下:
CP分解是Tucker分解的特例。如果Tucker分解中的核心张量是一个超对角结构(对角,并且三个维度的长度相等),则Tucker分解退化为CP分解。公式为 X = λ * A * B * C(带权重),X是原张量,λ矩阵为分解之后超对角张量的对角值,A、B、C分别为分解之后关于3个维度的矩阵。图示如下:
import matplotlib.pyplot as plt import tensorly as tl import numpy as np from tensorly.decomposition import parafac from tensorly.decomposition import tucker from PIL import Image
def to_image(tensor): """A convenience function to convert from a float dtype back to uint8""" im = tl.to_numpy(tensor) im -= im.min() im /= im.max() im *= 255 return im.astype(np.uint8)
# Rank of the CP decomposition cp_rank = 25 # Rank of the Tucker decomposition tucker_rank = [100, 100, 2]
# Perform the CP decomposition factors = parafac(image, rank=cp_rank, init='random', tol=10e-6) # Reconstruct the image from the factors cp_reconstruction = tl.kruskal_to_tensor(factors)
# Plotting the original and reconstruction from the decompositions fig = plt.figure() ax = fig.add_subplot(1, 3, 1) ax.set_axis_off() ax.imshow(to_image(image)) ax.set_title('Original')