Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
Notes
-----
This version works by first computing the mode-0 unfolding of the tensor
and then refolding it.
There are other possible and equivalent alternate implementation, e.g.
summing over r and updating an outer product of vectors.
"""
shape, rank = _validate_kruskal_tensor(kruskal_tensor)
weights, factors = kruskal_tensor
if weights is None:
weights = T.ones(rank, **T.context(factors[0]))
weights = T.reshape(weights, (1, rank))
if mask is None:
full_tensor = T.dot(factors[0]*weights,
T.transpose(khatri_rao(factors, skip_matrix=0)))
else:
full_tensor = T.sum(khatri_rao([factors[0]*weights]+factors[1:], mask=mask), axis=1)
return fold(full_tensor, 0, shape)
def covariance(y_true, y_pred, axis=None):
centered_true = T.mean(y_true, axis=axis)
centered_pred = T.mean(y_pred, axis=axis)
if axis is not None:
# TODO: write a function to do this..
shape = list(T.shape(y_true))
shape[axis] = 1
centered_true = T.reshape(centered_true, shape)
shape = list(T.shape(y_pred))
shape[axis] = 1
centered_pred = T.reshape(centered_pred, shape)
return T.mean((y_true - centered_true)*(y_pred - centered_pred), axis=axis)
def covariance(y_true, y_pred, axis=None):
centered_true = T.mean(y_true, axis=axis)
centered_pred = T.mean(y_pred, axis=axis)
if axis is not None:
# TODO: write a function to do this..
shape = list(T.shape(y_true))
shape[axis] = 1
centered_true = T.reshape(centered_true, shape)
shape = list(T.shape(y_pred))
shape[axis] = 1
centered_pred = T.reshape(centered_pred, shape)
return T.mean((y_true - centered_true)*(y_pred - centered_pred), axis=axis)
-------
ndarray
partially unfolded tensor
"""
if ravel_tensors:
new_shape = [-1]
else:
new_shape = [tensor.shape[mode + skip_begin], -1]
if skip_begin:
new_shape = [tensor.shape[i] for i in range(skip_begin)] + new_shape
if skip_end:
new_shape += [tensor.shape[-i] for i in range(skip_end)]
return T.reshape(T.moveaxis(tensor, mode+skip_begin, skip_begin), new_shape)
shape : tuple
the shape of the original full tensor (including skipped dimensions)
skip_begin : int, optional, default is 1
number of dimensions to leave untouched at the beginning
skip_end : int, optional
number of dimensions to leave untouched at the end
Returns
-------
ndarray
partially re-folded tensor
"""
transposed_shape = list(shape)
mode_dim = transposed_shape.pop(skip_begin + mode)
transposed_shape.insert(skip_begin, mode_dim)
return T.moveaxis(T.reshape(unfolded, transposed_shape), skip_begin, skip_begin + mode)