예제 #1
0
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()
예제 #2
0
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))