https://gist.github.com/imcomking/b1acbb891ac4baa69f32d9eb4c221fb9


def exponentially_weighted_matrix(discount, mat_len):

    DisMat = np.triu(np.ones((mat_len, mat_len)) * discount, k=1)

    DisMat[DisMat==0] = 1

    DisMat = np.cumprod(DisMat, axis=1)

    DisMat = np.triu(DisMat)

    return DisMat


def exponentially_weighted_cumsum(discount, np_data):

    DisMat = exponentially_weighted_matrix(discount, np_data.shape[0])

    value = np.dot(DisMat, np_data.reshape(-1, 1))

    return value[::-1].transpose()[0]





np.triu: upper triangle matrix를 만든다.( == lower triangle을 0으로 만든다)
np.tril: lower triangle matrix를 만든다.( == lower triangle을 0으로 만든다)
np.cumprod: 주어진 axis로 cumulative product를 한다.
np.dot: dot product를 한다.
np.flipud: matrix의 위와 아래를 대칭으로 뒤집는다.
np.fliplr: matrix의 왼쪽과 오른쪽을 대칭으로 뒤집는다.

by 곽동현 이스텔리앙 2019.01.22 13:03