示例#1
0
 def add(self, X, Y=None):
     # check input
     T = X.shape[0]
     if Y is not None:
         assert Y.shape[0] == T, 'X and Y must have equal length'
     # estimate and add to storage
     if self.compute_XX and not self.compute_XY:
         w, s_X, C_XX = moments_XX(X, remove_mean=self.remove_mean,
                                   sparse_mode=self.sparse_mode, modify_data=self.modify_data)
         self.storage_XX.store(Moments(w, s_X, s_X, C_XX))
     elif self.compute_XX and self.compute_XY:
         assert Y is not None
         w, s_X, s_Y, C_XX, C_XY = moments_XXXY(X, Y, remove_mean=self.remove_mean, symmetrize=self.symmetrize,
                                                sparse_mode=self.sparse_mode, modify_data=self.modify_data)
         # make copy in order to get independently mergeable moments
         self.storage_XX.store(Moments(w, s_X, s_X, C_XX))
         self.storage_XY.store(Moments(w, s_X, s_Y, C_XY))
     else:  # compute block
         assert Y is not None
         assert not self.symmetrize
         w, s, C = moments_block(X, Y, remove_mean=self.remove_mean,
                                 sparse_mode=self.sparse_mode, modify_data=self.modify_data)
         # make copy in order to get independently mergeable moments
         self.storage_XX.store(Moments(w, s[0], s[0], C[0, 0]))
         self.storage_XY.store(Moments(w, s[0], s[1], C[0, 1]))
         self.storage_YY.store(Moments(w, s[1], s[1], C[1, 1]))
示例#2
0
 def _test_moments_XY(self, X, Y, symmetrize=False, remove_mean=False, sparse_mode='auto'):
     w, s_X, s_Y, C_XX, C_XY = moments.moments_XXXY(X, Y, remove_mean=remove_mean, modify_data=False,
                                                    symmetrize=symmetrize, sparse_mode=sparse_mode)
     # reference
     s_X_ref = X.sum(axis=0)
     s_Y_ref = Y.sum(axis=0)
     if symmetrize:
         s_X_ref = s_X_ref + s_Y_ref
         s_Y_ref = s_X_ref
         w = 2 * X.shape[0]
     else:
         w = X.shape[0]
     if remove_mean:
         X = X - s_X_ref/float(w)
         Y = Y - s_Y_ref/float(w)
     if symmetrize:
         C_XX_ref = np.dot(X.T, X) + np.dot(Y.T, Y)
         C_XY_ref = np.dot(X.T, Y) + np.dot(Y.T, X)
     else:
         C_XX_ref = np.dot(X.T, X)
         C_XY_ref = np.dot(X.T, Y)
     # test
     assert np.allclose(s_X, s_X_ref)
     assert np.allclose(s_Y, s_Y_ref)
     assert np.allclose(C_XX, C_XX_ref)
     assert np.allclose(C_XY, C_XY_ref)
def mytime_momentsXXXY(X, Y, remove_mean=False, symmetrize=False, nrep=3):
    # time for reference calculation
    t1 = time.time()
    for r in range(nrep):
        w, sx, sy, C_XX, C_XY = moments.moments_XXXY(X, Y, remove_mean=remove_mean, symmetrize=symmetrize)
    t2 = time.time()
    # return mean time
    return (t2-t1)/float(nrep)