HOSVD en tres pasos
La forma de calcular una descomposición de Tucker se llama HOSVD, y usa solo herramientas que ya tienes:
- Desplegar el tensor a lo largo de cada eje (Parte I).
- Ejecutar SVD sobre cada desplegado; conservar los componentes principales. Esas son las matrices de factores.
- Contraer el tensor original contra todas las matrices de factores para obtener el núcleo (sección 06).
Us = [np.linalg.svd(unfold(T, ax), full_matrices=False)[0] for ax in range(3)]
r = (2, 2, 3)
Us = [Us[i][:, :r[i]] for i in range(3)]
core = np.einsum('ijk,ia,jb,kc->abc', T, Us[0], Us[1], Us[2])
recon = np.einsum('abc,ia,jb,kc->ijk', core, Us[0], Us[1], Us[2])