def test_cp(): A = np.random.rand(10, 7, 5).astype(np.float32) tensor = Tensor(A) times = [] ers = [] times_bk = [] ers_bk = [] rks = [5, 10, 20] for rk in rks: print(rk) start = time.time() decomposed_cp = tensor.cp_als(rk, ret_tensors=False, maxiter=200) times.append(time.time() - start) er = tensor.relative_error(decomposed_cp) * 100 print(f'cp_als error: {er} %') ers.append(er) start = time.time() decomposed_cp = tensor.cp_rand(rk, ret_tensors=False, maxiter=200) times_bk.append(time.time() - start) er = tensor.relative_error(decomposed_cp) * 100 print(f'cp_rand error: {er} %') ers_bk.append(er) plt.plot(rks, times_bk, sns.xkcd_rgb["amber"], label='ap', linewidth=3) for p in range(len(rks)): plt.plot([rks[p]], [times_bk[p]], 'o', color=sns.xkcd_rgb["amber"]) plt.plot(rks, times, sns.xkcd_rgb["dusty red"], label='ap', linewidth=3) for p in range(len(rks)): plt.plot([rks[p]], [times[p]], 'o', color=sns.xkcd_rgb["dusty red"]) p1 = mpatches.Patch(color=sns.xkcd_rgb["amber"], label='CPRAND') p2 = mpatches.Patch(color=sns.xkcd_rgb["dusty red"], label='CP-ALS') plt.xlabel('Ранг') plt.ylabel('Время работы, с') plt.legend(handles=[p1, p2]) plt.show() plt.plot(rks, ers_bk, sns.xkcd_rgb["amber"], label='ap', linewidth=3) for p in range(len(rks)): plt.plot([rks[p]], [ers_bk[p]], 'o', color=sns.xkcd_rgb["amber"]) plt.plot(rks, ers, sns.xkcd_rgb["dusty red"], label='ap', linewidth=3) for p in range(len(rks)): plt.plot([rks[p]], [ers[p]], 'o', color=sns.xkcd_rgb["dusty red"]) plt.xlabel('Ранг') plt.ylabel('Ошибка аппроксимации, %') plt.legend(handles=[p1, p2]) plt.show()
def test_full_tt_svd(): np.random.seed(1234) W = np.random.rand(4096, 4096).astype(np.float32) tensor = Tensor(W, from_matrix=True, d=6) Gs = tensor.tt_factorization(0.1) sum = 1 for s in tensor.T.shape: sum *= s print('original parameters', sum) sum = 0 for g in Gs: sum_i = 1 for s in g.shape: sum_i *= s sum += sum_i print(g.shape) print('tt parameters', sum) tt = Gs[0] print(len(Gs)) for i in range(1, len(Gs)): if i == 1 or i == 2: r = max(Gs[i].shape) // 3 t = Tensor(Gs[i]) cp_rand = t.cp_rand(r, init='random', ret_tensors=False) tt = np.tensordot(tt, cp_rand, [len(tt.shape) - 1, 0]) else: tt = np.tensordot(tt, Gs[i], [len(tt.shape) - 1, 0]) print('tt-svd error', tensor.frobenius_norm(tensor.T - tt)) print('tt-svd error', tensor.relative_error(tt))