def sp_subvector_error(self, radius, sp_dimensions, sp_subdimensions=1): """Estimate of representational error of a subvector of a semantic pointer (unit vector). Requires Scipy. Paramaters ---------- radius : float or ndarray Radius of the representing ensemble. sp_dimensions : int Dimensionality of the complete semantic pointer/unit vector. sp_subdimensions : int, optional Dimensionality of the subvector represented by some ensemble. Returns ------- Error estimates for representing a subvector with `subdimensions` dimensions of a `dimensions` dimensional unit vector with an ensemble initialized with of `radius`. """ dist = SubvectorLength(sp_dimensions, sp_subdimensions) in_range = self._sp_subvector_error_in_range(radius, sp_subdimensions) out_of_range = self._sp_subvector_error_out_of_range( radius, sp_dimensions, sp_subdimensions) return dist.cdf(radius) * in_range + ( 1.0 - dist.cdf(radius)) * out_of_range
def _sp_subvector_error_out_of_range(radius, dimensions, subdimensions): dist = SubvectorLength(dimensions, subdimensions) sq_r = radius * radius normalization = 1.0 - dist.cdf(radius) b = (dimensions - subdimensions) / 2.0 aligned_integral = beta(subdimensions / 2.0 + 1.0, b) * (1.0 - betainc( subdimensions / 2.0 + 1.0, b, sq_r)) cross_integral = beta((subdimensions + 1) / 2.0, b) * (1.0 - betainc( (subdimensions + 1) / 2.0, b, sq_r)) numerator = (sq_r * normalization + ( aligned_integral - 2.0 * radius * cross_integral) / beta( subdimensions / 2.0, b)) with np.errstate(invalid='ignore'): return np.where( numerator > np.MachAr().eps, numerator / normalization, np.zeros_like(normalization))