def update_clustered_homogeneous_block_sizes(self, x, weight=1.0, block_size=None, include_self_loops=True):
print("update_clustered_homogeneous_block_sizes ")
if block_size is None:
er = "error, block_size not specified!!!!"
raise Exception(er)
# block_size = self.block_size
if isinstance(block_size, numpy.ndarray):
er = "Error: inhomogeneous block sizes not supported by this function"
raise Exception(er)
# Assuming block_size is an integer:
num_samples, dim = x.shape
if num_samples % block_size > 0:
err = "Inconsistency error: num_samples (%d) is not a multiple of block_size (%d)" % \
(num_samples, block_size)
raise Exception(err)
num_blocks = num_samples / block_size
# warning, plenty of dtype missing!!!!!!!!
sum_x = x.sum(axis=0)
sum_prod_x = mdp.utils.mult(x.T, x)
self.AddSamples(sum_prod_x, sum_x, num_samples, weight)
self.last_block = None
# DCorrelation Matrix. Compute medias signal
media = numpy.zeros((num_blocks, dim))
for i in range(num_blocks):
media[i] = x[i * block_size:(i + 1) * block_size].sum(axis=0) * (1.0 / block_size)
sum_prod_meds = mdp.utils.mult(media.T, media)
# FIX1: AFTER DT in (0,4) normalization
num_diffs = num_blocks * block_size # ## * (block_size-1+1) / (block_size-1)
print("num_diffs in block:", num_diffs, " num_samples:", num_samples)
if include_self_loops:
sum_prod_diffs = 2.0 * block_size * (sum_prod_x - block_size * sum_prod_meds) / block_size
else:
sum_prod_diffs = 2.0 * block_size * (sum_prod_x - block_size * sum_prod_meds) / (block_size - 1)
self.AddDiffs(sum_prod_diffs, num_diffs, weight)
print("(Diag(complete)/num_diffs.avg)**0.5 =", ((numpy.diagonal(sum_prod_diffs) / num_diffs).mean()) ** 0.5)
评论列表
文章目录