def test_ensure_array_dim(): with raises(ValueError): ensure_ndarray_2D(np.random.rand(10, 5), ensure_num_cols=3) with raises(ValueError): ensure_ndarray_2D(np.random.rand(10), ensure_num_cols=3) with raises(ValueError): ensure_ndarray_1D(np.random.rand(10, 5)) with raises(ValueError): ensure_ndarray_1D(np.random.rand(10, 5, 10))
def __init__(self, km_set, weights, name='WeightedAverageKernel'): """Constructor.""" super().__init__(km_set, name=name) if self.km_set.size == len(weights): self.weights = ensure_ndarray_1D(weights) else: raise ValueError('Number of weights ({}) supplied differ from the ' 'kernel set size ({})' ''.format(self.km_set.size, len(weights)))
def fit(self, kernel_weights=None): """Computes the sum kernel""" if kernel_weights is None: kernel_weights = np.ones(self.km_set.size) else: kernel_weights = ensure_ndarray_1D(kernel_weights) if kernel_weights.size != self.km_set.size: raise ValueError('Incompatible set of kernel_weights given.' 'Must be an array of length exactly {}' ''.format(self.km_set.size)) self.KM = np.zeros((self.num_samples, self.num_samples)) for weight, km in zip(kernel_weights, self.km_set): self.KM = self.KM + weight * km.full self._is_fitted = True
def linear_combination(km_set, weights, norm_weights=False): """ Weighted linear combinations of a set of given kernel matrices Parameters ---------- km_set : KernelSet Collection of compatible kernel matrices weights : Iterable Set of weights for the kernel matrices in km_set. Weights are not checked to sum to 1.0. Use norm_weights=True if needed. norm_weights : bool Flag to request normalizing weights to ensure they sum to 1.0 Returns ------- lin_comb_KM : ndarray Final result of weighted linear combination of the kernel matrix set """ if km_set.size == len(weights): weights = ensure_ndarray_1D(weights) else: raise ValueError('Number of weights ({}) supplied differ ' 'from the kernel set size ({})' ''.format(km_set.size, len(weights))) if norm_weights: denom = weights.sum() if np.isclose(denom, 0.0): raise RuntimeError('sum of weights == 0.0, unable to normalize!') weights = weights / denom # Computes the weighted average kernel # km_set.num_samples is a tuple (N, M) when operating on two samples # e.g. train x test KM = np.zeros(km_set.num_samples) for weight, km in zip(weights, km_set): KM = KM + weight * km.full return KM
def linear_combination(km_set, weights): """ Weighted linear combinations of a set of given kernel matrices Parameters ---------- km_set : KernelSet Collection of compatible kernel matrices weights : Iterable Set of weights for the kernel matrices in km_set Returns ------- lin_comb_KM : ndarray Final result of weighted linear combination of the kernel matrix set """ if km_set.size == len(weights): weights = ensure_ndarray_1D(weights) else: raise ValueError('Number of weights ({}) supplied differ ' 'from the kernel set size ({})' ''.format(km_set.size, len(weights))) # TODO should we not ensure weights sum to 1.0? # Computes the weighted average kernel # km_set.num_samples is a tuple (N, M) when operating on two samples # e.g. train x test KM = np.zeros(km_set.num_samples) for weight, km in zip(weights, km_set): KM = KM + weight * km.full return KM